int flags) {
// temporarily connect ourselves to the ASTResolver - must disconnect when done
astRequestor.compilationUnitResolver = this;
this.bindingTables = new DefaultBindingResolver.BindingTables();
CompilationUnitDeclaration unit = null;
try {
int length = sourceCompilationUnits.length;
org.eclipse.jdt.internal.compiler.env.ICompilationUnit[] sourceUnits = new org.eclipse.jdt.internal.compiler.env.ICompilationUnit[length];
int count = 0;
for (int i = 0; i < length; i++) {
char[] contents = null;
String encoding = encodings != null ? encodings[i] : null;
String sourceUnitPath = sourceCompilationUnits[i];
try {
contents = Util.getFileCharContent(new File(sourceUnitPath), encoding);
} catch(IOException e) {
// go to the next unit
continue;
}
if (contents == null) {
// go to the next unit
continue;
}
sourceUnits[count++] = new org.eclipse.jdt.internal.compiler.batch.CompilationUnit(contents, sourceUnitPath, encoding);
}
beginToCompile(sourceUnits, bindingKeys);
// process all units (some more could be injected in the loop by the lookup environment)
for (int i = 0; i < this.totalUnits; i++) {
if (resolvedRequestedSourcesAndKeys(i)) {
// no need to keep resolving if no more ASTs and no more binding keys are needed
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=114935
// cleanup remaining units
for (; i < this.totalUnits; i++) {
this.unitsToProcess[i].cleanUp();
this.unitsToProcess[i] = null;
}
break;
}
unit = this.unitsToProcess[i];
try {
super.process(unit, i); // this.process(...) is optimized to not process already known units
// requested AST
char[] fileName = unit.compilationResult.getFileName();
org.eclipse.jdt.internal.compiler.env.ICompilationUnit source = (org.eclipse.jdt.internal.compiler.env.ICompilationUnit) this.requestedSources.get(fileName);
if (source != null) {
// convert AST
CompilationResult compilationResult = unit.compilationResult;
org.eclipse.jdt.internal.compiler.env.ICompilationUnit sourceUnit = compilationResult.compilationUnit;
char[] contents = sourceUnit.getContents();
AST ast = AST.newAST(apiLevel);
ast.setFlag(flags | AST.RESOLVED_BINDINGS);
ast.setDefaultNodeFlag(ASTNode.ORIGINAL);
ASTConverter converter = new ASTConverter(compilerOptions, true/*need to resolve bindings*/, this.monitor);
BindingResolver resolver = new DefaultBindingResolver(unit.scope, null, this.bindingTables, (flags & ICompilationUnit.ENABLE_BINDINGS_RECOVERY) != 0, this.fromJavaProject);
ast.setBindingResolver(resolver);
converter.setAST(ast);
CompilationUnit compilationUnit = converter.convert(unit, contents);
compilationUnit.setTypeRoot(null);
compilationUnit.setLineEndTable(compilationResult.getLineSeparatorPositions());
ast.setDefaultNodeFlag(0);
ast.setOriginalModificationCount(ast.modificationCount());
// pass it to requestor
astRequestor.acceptAST(new String(source.getFileName()), compilationUnit);
worked(1);
// remove at the end so that we don't resolve twice if a source and a key for the same file name have been requested
this.requestedSources.put(fileName, null); // mark it as removed
}
// requested binding
Object key = this.requestedKeys.get(fileName);
if (key != null) {
if (key instanceof BindingKeyResolver) {
reportBinding(key, astRequestor, unit);
worked(1);
} else if (key instanceof ArrayList) {
Iterator iterator = ((ArrayList) key).iterator();
while (iterator.hasNext()) {
reportBinding(iterator.next(), astRequestor, unit);
worked(1);
}
}
// remove at the end so that we don't resolve twice if a source and a key for the same file name have been requested
this.requestedKeys.put(fileName, null); // mark it as removed
}
} finally {
// cleanup compilation unit result
unit.cleanUp();
}
this.unitsToProcess[i] = null; // release reference to processed unit declaration
this.requestor.acceptResult(unit.compilationResult.tagAsAccepted());
}