improved PHP parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / parser / UnitParser.java
index f9981b9..9785834 100644 (file)
@@ -7,6 +7,7 @@ import net.sourceforge.phpdt.internal.compiler.CompilationResult;
 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.ASTNode;
 import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration;
 import net.sourceforge.phpeclipse.internal.compiler.ast.ConstructorDeclaration;
 import net.sourceforge.phpeclipse.internal.compiler.ast.FieldDeclaration;
@@ -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 {
@@ -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();
@@ -410,6 +411,7 @@ public class UnitParser extends Parser {
       /* 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;
+}
 }