Refactored packagename to net.sourceforge.phpdt.internal.compiler.ast
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / parser / UnitParser.java
index 5ee16b9..06855a0 100644 (file)
@@ -4,15 +4,16 @@ package net.sourceforge.phpdt.internal.compiler.parser;
 import net.sourceforge.phpdt.core.IJavaModelMarker;
 import net.sourceforge.phpdt.core.compiler.IProblem;
 import net.sourceforge.phpdt.internal.compiler.CompilationResult;
+import net.sourceforge.phpdt.internal.compiler.ast.ASTNode;
+import net.sourceforge.phpdt.internal.compiler.ast.CompilationUnitDeclaration;
+import net.sourceforge.phpdt.internal.compiler.ast.ConstructorDeclaration;
+import net.sourceforge.phpdt.internal.compiler.ast.FieldDeclaration;
+import net.sourceforge.phpdt.internal.compiler.ast.Initializer;
+import net.sourceforge.phpdt.internal.compiler.ast.MethodDeclaration;
+import net.sourceforge.phpdt.internal.compiler.ast.TypeDeclaration;
 import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit;
 import net.sourceforge.phpdt.internal.compiler.problem.AbortCompilation;
 import net.sourceforge.phpdt.internal.compiler.problem.ProblemReporter;
-import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration;
-import net.sourceforge.phpeclipse.internal.compiler.ast.ConstructorDeclaration;
-import net.sourceforge.phpeclipse.internal.compiler.ast.FieldDeclaration;
-import net.sourceforge.phpeclipse.internal.compiler.ast.Initializer;
-import net.sourceforge.phpeclipse.internal.compiler.ast.MethodDeclaration;
-import net.sourceforge.phpeclipse.internal.compiler.ast.TypeDeclaration;
 
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
@@ -97,7 +98,7 @@ public class UnitParser extends Parser {
 
     //         int astLength = astStack.length;
     //         if (noAstNodes.length < astLength){
-    //                 noAstNodes = new AstNode[astLength];
+    //                 noAstNodes = new ASTNode[astLength];
     //                 //System.out.println("Resized AST stacks : "+ astLength);
     //         
     //         }
@@ -140,7 +141,7 @@ public class UnitParser extends Parser {
       goForCompilationUnit();
 
       /* scanner initialization */
-      scanner.setSource(sourceUnit.getContents());
+      scanner.setSource(sourceUnit, sourceUnit.getContents());
 
       /* unit creation */
       referenceContext =
@@ -222,7 +223,7 @@ public class UnitParser extends Parser {
 
     referenceContext = cd;
     compilationUnit = unit;
-
+    
     scanner.resetTo(cd.sourceEnd + 1, cd.declarationSourceEnd);
     try {
       parse();
@@ -284,7 +285,7 @@ public class UnitParser extends Parser {
 
     referenceContext = type;
     compilationUnit = unit;
-
+    
     scanner.setSource(initializationSource);
     scanner.resetTo(0, initializationSource.length - 1);
     try {
@@ -302,8 +303,8 @@ public class UnitParser extends Parser {
     // field.initialization = expressionStack[expressionPtr];
     // 
     // // mark field with local type if one was found during parsing
-    // if ((type.bits & AstNode.HasLocalTypeMASK) != 0) {
-    //         field.bits |= AstNode.HasLocalTypeMASK;
+    // if ((type.bits & ASTNode.HasLocalTypeMASK) != 0) {
+    //         field.bits |= ASTNode.HasLocalTypeMASK;
     // }       
   }
   // A P I
@@ -320,7 +321,7 @@ public class UnitParser extends Parser {
 
     referenceContext = type;
     compilationUnit = unit;
-
+    
     scanner.resetTo(ini.sourceStart, ini.sourceEnd); // just on the beginning {
     try {
       parse();
@@ -337,8 +338,8 @@ public class UnitParser extends Parser {
     // ini.block = ((Initializer) astStack[astPtr]).block;
     // 
     // // mark initializer with local type if one was found during parsing
-    // if ((type.bits & AstNode.HasLocalTypeMASK) != 0) {
-    //         ini.bits |= AstNode.HasLocalTypeMASK;
+    // if ((type.bits & ASTNode.HasLocalTypeMASK) != 0) {
+    //         ini.bits |= ASTNode.HasLocalTypeMASK;
     // }       
   }
   // A P I
@@ -405,11 +406,12 @@ public class UnitParser extends Parser {
       goForCompilationUnit();
 
       /* scanner initialization */
-      scanner.setSource(sourceUnit.getContents());
+      scanner.setSource(sourceUnit, sourceUnit.getContents());
       scanner.resetTo(start, end);
       /* unit creation */
       referenceContext =
         compilationUnit = new CompilationUnitDeclaration(problemReporter, compilationResult, scanner.source.length);
+      
       /* run automaton */
       parse();
     } catch (SyntaxError syntaxError) {
@@ -436,4 +438,48 @@ public class UnitParser extends Parser {
     }
     return parsedUnit;
   }
+  
+  public void getMethodBodies(CompilationUnitDeclaration unit) {
+       //fill the methods bodies in order for the code to be generated
+
+       if (unit == null) return;
+       
+       if (unit.ignoreMethodBodies) {
+               unit.ignoreFurtherInvestigation = true;
+               return;
+               // if initial diet parse did not work, no need to dig into method bodies.
+       }
+
+       if ((unit.bits & ASTNode.HasAllMethodBodies) != 0)
+               return; //work already done ...
+
+       //real parse of the method....
+       char[] contents = unit.compilationResult.compilationUnit.getContents();
+       this.scanner.setSource(contents);
+       
+       // save existing values to restore them at the end of the parsing process
+       // see bug 47079 for more details
+       int[] oldLineEnds = this.scanner.lineEnds;
+       int oldLinePtr = this.scanner.linePtr;
+
+       final int[] lineSeparatorPositions = unit.compilationResult.lineSeparatorPositions;
+       this.scanner.lineEnds = lineSeparatorPositions;
+       this.scanner.linePtr = lineSeparatorPositions.length - 1;
+
+//     if (this.javadocParser != null && this.javadocParser.checkDocComment) {
+//             this.javadocParser.scanner.setSource(contents);
+//     }
+       if (unit.types != null) {
+               for (int i = unit.types.size(); --i >= 0;)
+                       ((TypeDeclaration)unit.types.get(i)).parseMethod(this, unit);
+       }
+       
+       // tag unit has having read bodies
+       unit.bits |= ASTNode.HasAllMethodBodies;
+
+       // this is done to prevent any side effects on the compilation unit result
+       // line separator positions array.
+       this.scanner.lineEnds = oldLineEnds;
+       this.scanner.linePtr = oldLinePtr;
+}
 }