X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/Compiler.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/Compiler.java index 922ef27..14bded4 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/Compiler.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/Compiler.java @@ -12,6 +12,7 @@ package net.sourceforge.phpdt.internal.compiler; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Map; + import net.sourceforge.phpdt.core.compiler.IProblem; import net.sourceforge.phpdt.internal.compiler.env.IBinaryType; import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit; @@ -29,6 +30,9 @@ import net.sourceforge.phpdt.internal.compiler.problem.ProblemSeverities; import net.sourceforge.phpdt.internal.compiler.util.Util; import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration; import net.sourceforge.phpeclipse.internal.compiler.ast.TypeDeclaration; + +import org.eclipse.core.resources.IResource; + public class Compiler implements ITypeRequestor, ProblemSeverities { public UnitParser parser; public ICompilerRequestor requestor; @@ -41,7 +45,7 @@ public class Compiler implements ITypeRequestor, ProblemSeverities { // name lookup public LookupEnvironment lookupEnvironment; // ONCE STABILIZED, THESE SHOULD RETURN TO A FINAL FIELD - public static boolean DEBUG = true; + public static boolean DEBUG = false; public int parseThreshold = -1; // number of initial units parsed at once (-1: none) /* @@ -163,7 +167,7 @@ public class Compiler implements ITypeRequestor, ProblemSeverities { * @param parseLiteralExpressionsAsConstants * boolean This parameter is used to optimize the * literals or leave them as they are in the source. If you put - * true, "Hello" + " world" will be converted to "Hello world". + * true, "Hello" . " world" will be converted to "Hello world". */ public Compiler(INameEnvironment environment, IErrorHandlingPolicy policy, Map settings, final ICompilerRequestor requestor, @@ -339,11 +343,11 @@ public class Compiler implements ITypeRequestor, ProblemSeverities { // if (options.verbose) { // if (totalUnits > 1) { // System.out.println( - // Util.bind("compilation.units" , String.valueOf(totalUnits))); + // ProjectPrefUtil.bind("compilation.units" , String.valueOf(totalUnits))); // //$NON-NLS-1$ // } else { // System.out.println( - // Util.bind("compilation.unit" , String.valueOf(totalUnits))); + // ProjectPrefUtil.bind("compilation.unit" , String.valueOf(totalUnits))); // //$NON-NLS-1$ // } // } @@ -491,6 +495,72 @@ public class Compiler implements ITypeRequestor, ProblemSeverities { // if (DebugRequestor != null) DebugRequestor.reset(); } /** + * Internal API used to resolve a given compilation unit. Can run a subset of the compilation process + */ + public CompilationUnitDeclaration resolve( + CompilationUnitDeclaration unit, + ICompilationUnit sourceUnit, + boolean verifyMethods, + boolean analyzeCode) { + + try { + if (unit == null) { + // build and record parsed units + parseThreshold = 0; // will request a full parse + beginToCompile(new ICompilationUnit[] { sourceUnit }); + // process all units (some more could be injected in the loop by the lookup environment) + unit = unitsToProcess[0]; + } else { + // initial type binding creation + lookupEnvironment.buildTypeBindings(unit); + + // binding resolution + lookupEnvironment.completeTypeBindings(); + } + // TODO : jsurfer check this +// this.parser.getMethodBodies(unit); + getMethodBodies(unit, 0); + + if (unit.scope != null) { + // fault in fields & methods + unit.scope.faultInTypes(); + if (unit.scope != null && verifyMethods) { + // http://dev.eclipse.org/bugs/show_bug.cgi?id=23117 + // verify inherited methods + unit.scope.verifyMethods(lookupEnvironment.methodVerifier()); + } + // type checking + unit.resolve(); + + // flow analysis +// if (analyzeCode) unit.analyseCode(); + + // code generation +// if (generateCode) unit.generateCode(); + } + if (unitsToProcess != null) unitsToProcess[0] = null; // release reference to processed unit declaration + requestor.acceptResult(unit.compilationResult.tagAsAccepted()); + return unit; + } catch (AbortCompilation e) { + this.handleInternalException(e, unit); + return unit == null ? unitsToProcess[0] : unit; + } catch (Error e) { + this.handleInternalException(e, unit, null); + throw e; // rethrow + } catch (RuntimeException e) { + this.handleInternalException(e, unit, null); + throw e; // rethrow + } finally { + // No reset is performed there anymore since, + // within the CodeAssist (or related tools), + // the compiler may be called *after* a call + // to this resolve(...) method. And such a call + // needs to have a compiler with a non-empty + // environment. + // this.reset(); + } + } + /** * Internal API used to resolve a given compilation unit. Can run a subset of * the compilation process */ @@ -544,4 +614,5 @@ public class Compiler implements ITypeRequestor, ProblemSeverities { // this.reset(); } } -} + +} \ No newline at end of file