blob: 420d8057a4034e2c1c9dc113b3df1656700e65bd [file] [log] [blame]
/**********************************************************************
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;
}
};
}
}