| /********************************************************************** |
| Copyright (c) 2002 IBM Corp. and others. |
| All rights reserved. This program and the accompanying materials |
| are made available under the terms of the Common Public License v0.5 |
| which accompanies this distribution, and is available at |
| http://www.eclipse.org/legal/cpl-v05.html |
| |
| Contributors: |
| IBM Corporation - initial API and implementation |
| **********************************************************************/ |
| |
| package org.eclipse.jdt.internal.core; |
| |
| import java.util.Locale; |
| import java.util.Map; |
| |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IProblemRequestor; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.core.compiler.IProblem; |
| import org.eclipse.jdt.internal.compiler.CompilationResult; |
| import org.eclipse.jdt.internal.compiler.Compiler; |
| import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies; |
| import org.eclipse.jdt.internal.compiler.ICompilerRequestor; |
| import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy; |
| import org.eclipse.jdt.internal.compiler.IProblemFactory; |
| import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration; |
| import org.eclipse.jdt.internal.compiler.env.INameEnvironment; |
| import org.eclipse.jdt.internal.compiler.env.ISourceType; |
| import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; |
| import org.eclipse.jdt.internal.compiler.lookup.PackageBinding; |
| import org.eclipse.jdt.internal.compiler.parser.SourceTypeConverter; |
| import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; |
| import org.eclipse.jdt.internal.compiler.util.CharOperation; |
| |
| /** |
| * Responsible for resolving types inside a compilation unit being reconciled, |
| * reporting the discovered problems to a given IProblemRequestor. |
| */ |
| public class CompilationUnitProblemFinder extends Compiler { |
| |
| /** |
| * Answer a new CompilationUnitVisitor using the given name environment and compiler options. |
| * The environment and options will be in effect for the lifetime of the compiler. |
| * When the compiler is run, compilation results are sent to the given requestor. |
| * |
| * @param environment org.eclipse.jdt.internal.compiler.api.env.INameEnvironment |
| * Environment used by the compiler in order to resolve type and package |
| * names. The name environment implements the actual connection of the compiler |
| * to the outside world (e.g. in batch mode the name environment is performing |
| * pure file accesses, reuse previous build state or connection to repositories). |
| * Note: the name environment is responsible for implementing the actual classpath |
| * rules. |
| * |
| * @param policy org.eclipse.jdt.internal.compiler.api.problem.IErrorHandlingPolicy |
| * Configurable part for problem handling, allowing the compiler client to |
| * specify the rules for handling problems (stop on first error or accumulate |
| * them all) and at the same time perform some actions such as opening a dialog |
| * in UI when compiling interactively. |
| * @see org.eclipse.jdt.internal.compiler.api.problem.DefaultErrorHandlingPolicies |
| * |
| * @param settings The settings to use for the resolution. |
| * |
| * @param requestor org.eclipse.jdt.internal.compiler.api.ICompilerRequestor |
| * Component which will receive and persist all compilation results and is intended |
| * to consume them as they are produced. Typically, in a batch compiler, it is |
| * responsible for writing out the actual .class files to the file system. |
| * @see org.eclipse.jdt.internal.compiler.api.CompilationResult |
| * |
| * @param problemFactory org.eclipse.jdt.internal.compiler.api.problem.IProblemFactory |
| * Factory used inside the compiler to create problem descriptors. It allows the |
| * compiler client to supply its own representation of compilation problems in |
| * order to avoid object conversions. Note that the factory is not supposed |
| * to accumulate the created problems, the compiler will gather them all and hand |
| * them back as part of the compilation unit result. |
| */ |
| protected CompilationUnitProblemFinder( |
| INameEnvironment environment, |
| IErrorHandlingPolicy policy, |
| Map settings, |
| ICompilerRequestor requestor, |
| IProblemFactory problemFactory) { |
| |
| super(environment, policy, settings, requestor, problemFactory, true); |
| } |
| |
| /** |
| * Add additional source types |
| */ |
| public void accept(ISourceType[] sourceTypes, PackageBinding packageBinding) { |
| CompilationResult result = |
| new CompilationResult(sourceTypes[0].getFileName(), 1, 1); |
| // need to hold onto this |
| CompilationUnitDeclaration unit = |
| SourceTypeConverter.buildCompilationUnit( |
| sourceTypes, |
| true, |
| true, |
| lookupEnvironment.problemReporter, |
| result); |
| |
| if (unit != null) { |
| this.lookupEnvironment.buildTypeBindings(unit); |
| this.lookupEnvironment.completeTypeBindings(unit, true); |
| } |
| } |
| |
| /* |
| * Low-level API performing the actual compilation |
| */ |
| protected static IErrorHandlingPolicy getHandlingPolicy() { |
| return DefaultErrorHandlingPolicies.proceedWithAllProblems(); |
| } |
| |
| protected static INameEnvironment getNameEnvironment(ICompilationUnit sourceUnit) |
| throws JavaModelException { |
| return (SearchableEnvironment) ((JavaProject) sourceUnit.getJavaProject()) |
| .getSearchableNameEnvironment(); |
| } |
| |
| /* |
| * Answer the component to which will be handed back compilation results from the compiler |
| */ |
| protected static ICompilerRequestor getRequestor() { |
| return new ICompilerRequestor() { |
| public void acceptResult(CompilationResult compilationResult) { |
| } |
| }; |
| } |
| |
| public static CompilationUnitDeclaration resolve( |
| ICompilationUnit unitElement, IProblemRequestor problemRequestor) |
| throws JavaModelException { |
| |
| char[] fileName = unitElement.getElementName().toCharArray(); |
| CompilationUnitProblemFinder problemFinder = |
| new CompilationUnitProblemFinder( |
| getNameEnvironment(unitElement), |
| getHandlingPolicy(), |
| JavaCore.getOptions(), |
| getRequestor(), |
| getProblemFactory(fileName, problemRequestor)); |
| |
| CompilationUnitDeclaration unit = null; |
| try { |
| String encoding = (String) JavaCore.getOptions().get(CompilerOptions.OPTION_Encoding); |
| if ("".equals(encoding)) encoding = null; //$NON-NLS-1$ |
| |
| unit = problemFinder.resolve( |
| new BasicCompilationUnit( |
| unitElement.getSource().toCharArray(), |
| new String(fileName), |
| encoding)); |
| return unit; |
| } finally { |
| if (unit != null) { |
| unit.cleanUp(); |
| } |
| problemFinder.lookupEnvironment.reset(); |
| } |
| } |
| |
| protected static IProblemFactory getProblemFactory(final char[] fileName, final IProblemRequestor problemRequestor) { |
| |
| return new DefaultProblemFactory(Locale.getDefault()) { |
| public IProblem createProblem( |
| char[] originatingFileName, |
| int problemId, |
| String[] arguments, |
| int severity, |
| int startPosition, |
| int endPosition, |
| int lineNumber) { |
| |
| IProblem problem = |
| super.createProblem( |
| originatingFileName, |
| problemId, |
| arguments, |
| severity, |
| startPosition, |
| endPosition, |
| lineNumber); |
| // only report local problems |
| if (CharOperation.equals(originatingFileName, fileName)){ |
| if (JavaModelManager.VERBOSE){ |
| System.out.println("PROBLEM FOUND while reconciling : "+problem.getMessage());//$NON-NLS-1$ |
| } |
| problemRequestor.acceptProblem(problem); |
| } |
| return problem; |
| } |
| }; |
| } |
| |
| } |
| |