Skip to content

Commit 1edc83f

Browse files
author
Rob Stryker
committed
Fixes eclipse-jdt#3428 - Ensure calls to ASTParser.createBindings use the correct unit resolver
Signed-off-by: Rob Stryker <stryker@redhat.com> Cleanup Signed-off-by: Rob Stryker <stryker@redhat.com>
1 parent f29e440 commit 1edc83f

File tree

2 files changed

+101
-82
lines changed

2 files changed

+101
-82
lines changed

org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java

Lines changed: 90 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.eclipse.jdt.core.*;
2828
import org.eclipse.jdt.core.compiler.CategorizedProblem;
2929
import org.eclipse.jdt.core.compiler.CharOperation;
30+
import org.eclipse.jdt.core.dom.CompilationUnitResolver.IntArrayList;
3031
import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
3132
import org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
3233
import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath;
@@ -38,16 +39,13 @@
3839
import org.eclipse.jdt.internal.compiler.parser.RecoveryScanner;
3940
import org.eclipse.jdt.internal.compiler.parser.RecoveryScannerData;
4041
import org.eclipse.jdt.internal.compiler.parser.Scanner;
42+
import org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt;
4143
import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
42-
import org.eclipse.jdt.internal.core.BasicCompilationUnit;
43-
import org.eclipse.jdt.internal.core.BinaryType;
44-
import org.eclipse.jdt.internal.core.ClassFileWorkingCopy;
45-
import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
46-
import org.eclipse.jdt.internal.core.JavaModelManager;
47-
import org.eclipse.jdt.internal.core.PackageFragment;
44+
import org.eclipse.jdt.internal.core.*;
4845
import org.eclipse.jdt.internal.core.dom.ICompilationUnitResolver;
4946
import org.eclipse.jdt.internal.core.dom.util.DOMASTUtil;
5047
import org.eclipse.jdt.internal.core.util.CodeSnippetParsingUtil;
48+
import org.eclipse.jdt.internal.core.util.DOMFinder;
5149
import org.eclipse.jdt.internal.core.util.RecordedParsingInformation;
5250
import org.eclipse.jdt.internal.core.util.Util;
5351

@@ -1166,13 +1164,98 @@ public IBinding[] createBindings(IJavaElement[] elements, IProgressMonitor monit
11661164
if ((this.bits & CompilationUnitResolver.IGNORE_METHOD_BODIES) != 0) {
11671165
flags |= ICompilationUnit.IGNORE_METHOD_BODIES;
11681166
}
1169-
return CompilationUnitResolver.resolve(elements, this.apiLevel, this.compilerOptions, this.project, this.workingCopyOwner, flags, monitor);
1167+
1168+
return resolve(elements, this.apiLevel, this.compilerOptions, this.project, this.workingCopyOwner, flags, this.unitResolver, monitor);
11701169
} finally {
11711170
// reset to defaults to allow reuse (and avoid leaking)
11721171
initializeDefaults();
11731172
}
11741173
}
11751174

1175+
1176+
static IBinding[] resolve(
1177+
final IJavaElement[] elements,
1178+
int apiLevel,
1179+
Map<String,String> compilerOptions,
1180+
IJavaProject javaProject,
1181+
WorkingCopyOwner owner,
1182+
int flags,
1183+
ICompilationUnitResolver unitResolver,
1184+
IProgressMonitor monitor) {
1185+
1186+
final int length = elements.length;
1187+
final HashMap<IJavaElement, IntArrayList> sourceElementPositions = new HashMap<>(); // a map from ICompilationUnit to int[] (positions in elements)
1188+
int cuNumber = 0;
1189+
final HashtableOfObjectToInt binaryElementPositions = new HashtableOfObjectToInt(); // a map from String (binding key) to int (position in elements)
1190+
for (int i = 0; i < length; i++) {
1191+
IJavaElement element = elements[i];
1192+
if (!(element instanceof SourceRefElement))
1193+
throw new IllegalStateException(element + " is not part of a compilation unit or class file"); //$NON-NLS-1$
1194+
IJavaElement cu = element.getAncestor(IJavaElement.COMPILATION_UNIT);
1195+
if (cu != null) {
1196+
// source member
1197+
IntArrayList intList = sourceElementPositions.get(cu);
1198+
if (intList == null) {
1199+
sourceElementPositions.put(cu, intList = new IntArrayList());
1200+
cuNumber++;
1201+
}
1202+
intList.add(i);
1203+
} else {
1204+
// binary member or method argument
1205+
try {
1206+
String key;
1207+
if (element instanceof BinaryMember)
1208+
key = ((BinaryMember) element).getKey(true/*open to get resolved info*/);
1209+
else if (element instanceof LocalVariable)
1210+
key = ((LocalVariable) element).getKey(true/*open to get resolved info*/);
1211+
else if (element instanceof org.eclipse.jdt.internal.core.TypeParameter)
1212+
key = ((org.eclipse.jdt.internal.core.TypeParameter) element).getKey(true/*open to get resolved info*/);
1213+
else if (element instanceof BinaryModule)
1214+
key = ((BinaryModule) element).getKey(true);
1215+
else
1216+
throw new IllegalArgumentException(element + " has an unexpected type"); //$NON-NLS-1$
1217+
binaryElementPositions.put(key, i);
1218+
} catch (JavaModelException e) {
1219+
throw new IllegalArgumentException(element + " does not exist", e); //$NON-NLS-1$
1220+
}
1221+
}
1222+
}
1223+
ICompilationUnit[] cus = new ICompilationUnit[cuNumber];
1224+
sourceElementPositions.keySet().toArray(cus);
1225+
1226+
int bindingKeyNumber = binaryElementPositions.size();
1227+
String[] bindingKeys = new String[bindingKeyNumber];
1228+
binaryElementPositions.keysToArray(bindingKeys);
1229+
1230+
class Requestor extends ASTRequestor {
1231+
IBinding[] bindings = new IBinding[length];
1232+
@Override
1233+
public void acceptAST(ICompilationUnit source, CompilationUnit ast) {
1234+
// TODO (jerome) optimize to visit the AST only once
1235+
IntArrayList intList = sourceElementPositions.get(source);
1236+
for (int i = 0; i < intList.length; i++) {
1237+
final int index = intList.list[i];
1238+
SourceRefElement element = (SourceRefElement) elements[index];
1239+
DOMFinder finder = new DOMFinder(ast, element, true/*resolve binding*/);
1240+
try {
1241+
finder.search();
1242+
} catch (JavaModelException e) {
1243+
throw new IllegalArgumentException(element + " does not exist", e); //$NON-NLS-1$
1244+
}
1245+
this.bindings[index] = finder.foundBinding;
1246+
}
1247+
}
1248+
@Override
1249+
public void acceptBinding(String bindingKey, IBinding binding) {
1250+
int index = binaryElementPositions.get(bindingKey);
1251+
this.bindings[index] = binding;
1252+
}
1253+
}
1254+
Requestor requestor = new Requestor();
1255+
unitResolver.resolve(cus, bindingKeys, requestor, apiLevel, compilerOptions, javaProject, owner, flags, monitor);
1256+
return requestor.bindings;
1257+
}
1258+
11761259
private ASTNode internalCreateAST(IProgressMonitor monitor) {
11771260
return JavaModelManager.cacheZipFiles(() -> internalCreateASTCached(monitor));
11781261
}

org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnitResolver.java

Lines changed: 11 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.io.File;
2020
import java.io.IOException;
2121
import java.util.ArrayList;
22-
import java.util.HashMap;
2322
import java.util.Iterator;
2423
import java.util.List;
2524
import java.util.Map;
@@ -60,14 +59,18 @@
6059
import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
6160
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
6261
import org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
63-
import org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt;
6462
import org.eclipse.jdt.internal.compiler.util.Messages;
6563
import org.eclipse.jdt.internal.compiler.util.Util;
66-
import org.eclipse.jdt.internal.core.*;
64+
import org.eclipse.jdt.internal.core.CancelableNameEnvironment;
65+
import org.eclipse.jdt.internal.core.CancelableProblemFactory;
66+
import org.eclipse.jdt.internal.core.ClasspathEntry;
67+
import org.eclipse.jdt.internal.core.INameEnvironmentWithProgress;
68+
import org.eclipse.jdt.internal.core.JavaProject;
69+
import org.eclipse.jdt.internal.core.NameLookup;
70+
import org.eclipse.jdt.internal.core.SourceTypeElementInfo;
6771
import org.eclipse.jdt.internal.core.dom.ICompilationUnitResolver;
6872
import org.eclipse.jdt.internal.core.util.BindingKeyResolver;
6973
import org.eclipse.jdt.internal.core.util.CommentRecorderParser;
70-
import org.eclipse.jdt.internal.core.util.DOMFinder;
7174

7275
@SuppressWarnings({ "rawtypes", "unchecked" })
7376
class CompilationUnitResolver extends Compiler {
@@ -866,6 +869,7 @@ public static CompilationUnitDeclaration resolve(
866869
}
867870
}
868871
}
872+
869873
public static IBinding[] resolve(
870874
final IJavaElement[] elements,
871875
int apiLevel,
@@ -874,79 +878,11 @@ public static IBinding[] resolve(
874878
WorkingCopyOwner owner,
875879
int flags,
876880
IProgressMonitor monitor) {
881+
// Should not be called anymore? Candidate for deprecation
882+
return ASTParser.resolve(elements, apiLevel, compilerOptions, javaProject, owner, flags, getInstance(), monitor);
883+
}
877884

878-
final int length = elements.length;
879-
final HashMap sourceElementPositions = new HashMap(); // a map from ICompilationUnit to int[] (positions in elements)
880-
int cuNumber = 0;
881-
final HashtableOfObjectToInt binaryElementPositions = new HashtableOfObjectToInt(); // a map from String (binding key) to int (position in elements)
882-
for (int i = 0; i < length; i++) {
883-
IJavaElement element = elements[i];
884-
if (!(element instanceof SourceRefElement))
885-
throw new IllegalStateException(element + " is not part of a compilation unit or class file"); //$NON-NLS-1$
886-
Object cu = element.getAncestor(IJavaElement.COMPILATION_UNIT);
887-
if (cu != null) {
888-
// source member
889-
IntArrayList intList = (IntArrayList) sourceElementPositions.get(cu);
890-
if (intList == null) {
891-
sourceElementPositions.put(cu, intList = new IntArrayList());
892-
cuNumber++;
893-
}
894-
intList.add(i);
895-
} else {
896-
// binary member or method argument
897-
try {
898-
String key;
899-
if (element instanceof BinaryMember)
900-
key = ((BinaryMember) element).getKey(true/*open to get resolved info*/);
901-
else if (element instanceof LocalVariable)
902-
key = ((LocalVariable) element).getKey(true/*open to get resolved info*/);
903-
else if (element instanceof org.eclipse.jdt.internal.core.TypeParameter)
904-
key = ((org.eclipse.jdt.internal.core.TypeParameter) element).getKey(true/*open to get resolved info*/);
905-
else if (element instanceof BinaryModule)
906-
key = ((BinaryModule) element).getKey(true);
907-
else
908-
throw new IllegalArgumentException(element + " has an unexpected type"); //$NON-NLS-1$
909-
binaryElementPositions.put(key, i);
910-
} catch (JavaModelException e) {
911-
throw new IllegalArgumentException(element + " does not exist", e); //$NON-NLS-1$
912-
}
913-
}
914-
}
915-
ICompilationUnit[] cus = new ICompilationUnit[cuNumber];
916-
sourceElementPositions.keySet().toArray(cus);
917-
918-
int bindingKeyNumber = binaryElementPositions.size();
919-
String[] bindingKeys = new String[bindingKeyNumber];
920-
binaryElementPositions.keysToArray(bindingKeys);
921885

922-
class Requestor extends ASTRequestor {
923-
IBinding[] bindings = new IBinding[length];
924-
@Override
925-
public void acceptAST(ICompilationUnit source, CompilationUnit ast) {
926-
// TODO (jerome) optimize to visit the AST only once
927-
IntArrayList intList = (IntArrayList) sourceElementPositions.get(source);
928-
for (int i = 0; i < intList.length; i++) {
929-
final int index = intList.list[i];
930-
SourceRefElement element = (SourceRefElement) elements[index];
931-
DOMFinder finder = new DOMFinder(ast, element, true/*resolve binding*/);
932-
try {
933-
finder.search();
934-
} catch (JavaModelException e) {
935-
throw new IllegalArgumentException(element + " does not exist", e); //$NON-NLS-1$
936-
}
937-
this.bindings[index] = finder.foundBinding;
938-
}
939-
}
940-
@Override
941-
public void acceptBinding(String bindingKey, IBinding binding) {
942-
int index = binaryElementPositions.get(bindingKey);
943-
this.bindings[index] = binding;
944-
}
945-
}
946-
Requestor requestor = new Requestor();
947-
resolve(cus, bindingKeys, requestor, apiLevel, compilerOptions, javaProject, owner, flags, monitor);
948-
return requestor.bindings;
949-
}
950886
/*
951887
* When unit result is about to be accepted, removed back pointers
952888
* to unresolved bindings

0 commit comments

Comments
 (0)