X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/UnitParser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/UnitParser.java index f9981b9..9785834 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/UnitParser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/UnitParser.java @@ -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; +} }