Skip to content

Commit 43ddedd

Browse files
committed
Avoid calling getKey() too greedily
getKey can be very expensive, so we should only have it computed on demand. This saves ~30% when executing completion tests with Javac.
1 parent 9f6d161 commit 43ddedd

File tree

5 files changed

+39
-28
lines changed

5 files changed

+39
-28
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacBindingResolver.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,12 @@
4848
import com.sun.tools.javac.api.JavacTaskImpl;
4949
import com.sun.tools.javac.api.JavacTrees;
5050
import com.sun.tools.javac.code.Attribute;
51-
import com.sun.tools.javac.code.Attribute.Compound;
5251
import com.sun.tools.javac.code.ClassFinder;
5352
import com.sun.tools.javac.code.Symbol;
53+
import com.sun.tools.javac.code.Symtab;
54+
import com.sun.tools.javac.code.TypeTag;
55+
import com.sun.tools.javac.code.Types;
56+
import com.sun.tools.javac.code.Attribute.Compound;
5457
import com.sun.tools.javac.code.Symbol.ClassSymbol;
5558
import com.sun.tools.javac.code.Symbol.CompletionFailure;
5659
import com.sun.tools.javac.code.Symbol.MethodSymbol;
@@ -60,7 +63,6 @@
6063
import com.sun.tools.javac.code.Symbol.TypeSymbol;
6164
import com.sun.tools.javac.code.Symbol.TypeVariableSymbol;
6265
import com.sun.tools.javac.code.Symbol.VarSymbol;
63-
import com.sun.tools.javac.code.Symtab;
6466
import com.sun.tools.javac.code.Type.ArrayType;
6567
import com.sun.tools.javac.code.Type.ClassType;
6668
import com.sun.tools.javac.code.Type.ErrorType;
@@ -73,10 +75,9 @@
7375
import com.sun.tools.javac.code.Type.PackageType;
7476
import com.sun.tools.javac.code.Type.TypeVar;
7577
import com.sun.tools.javac.code.Type.UnknownType;
76-
import com.sun.tools.javac.code.TypeTag;
77-
import com.sun.tools.javac.code.Types;
7878
import com.sun.tools.javac.comp.Modules;
7979
import com.sun.tools.javac.tree.JCTree;
80+
import com.sun.tools.javac.tree.TreeInfo;
8081
import com.sun.tools.javac.tree.JCTree.JCAnnotatedType;
8182
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
8283
import com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;
@@ -102,7 +103,6 @@
102103
import com.sun.tools.javac.tree.JCTree.JCTypeUnion;
103104
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
104105
import com.sun.tools.javac.tree.JCTree.JCWildcard;
105-
import com.sun.tools.javac.tree.TreeInfo;
106106
import com.sun.tools.javac.util.Context;
107107
import com.sun.tools.javac.util.Names;
108108

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacCompilationUnitResolver.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,8 @@ public CompilationUnit toCompilationUnit(org.eclipse.jdt.internal.compiler.env.I
558558
//CompilationUnit res2 = CompilationUnitResolver.getInstance().toCompilationUnit(sourceUnit, resolveBindings, project, classpaths, focalPoint, apiLevel, compilerOptions, typeRootWorkingCopyOwner, typeRootWorkingCopyOwner, flags, monitor);
559559
CompilationUnit res = parse(pathToUnit.values().toArray(org.eclipse.jdt.internal.compiler.env.ICompilationUnit[]::new),
560560
apiLevel, compilerOptions, resolveBindings, flags, project, workingCopyOwner, focalPoint, monitor).get(sourceUnit);
561-
if (resolveBindings) {
561+
if (resolveBindings && focalPoint == -1) {
562+
// force analysis and reports
562563
resolveBindings(res, apiLevel);
563564
}
564565
return res;

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/javac/dom/JavacLambdaBinding.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import java.util.List;
1515
import java.util.Objects;
1616

17-
import org.eclipse.jdt.core.IJavaElement;
17+
import org.eclipse.jdt.core.IMethod;
1818
import org.eclipse.jdt.core.Signature;
1919
import org.eclipse.jdt.core.dom.ASTNode;
2020
import org.eclipse.jdt.core.dom.FieldDeclaration;
@@ -68,7 +68,7 @@ public IBinding getDeclaringMember() {
6868
}
6969

7070
@Override
71-
public IJavaElement getJavaElement() {
71+
public IMethod getJavaElement() {
7272
var member = getDeclaringMember();
7373
if (member != null && member.getJavaElement() instanceof JavaElement parent) {
7474
int arrowIndex = ((List<ASTNode>)this.declaration.parameters()).stream().mapToInt(param -> param.getStartPosition() + param.getLength()).max().orElse(this.declaration.getStartPosition());

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/javac/dom/JavacMethodBinding.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.util.Set;
2020
import java.util.stream.Collectors;
2121

22-
import org.eclipse.jdt.core.IJavaElement;
2322
import org.eclipse.jdt.core.IMethod;
2423
import org.eclipse.jdt.core.IType;
2524
import org.eclipse.jdt.core.JavaModelException;
@@ -32,12 +31,12 @@
3231
import org.eclipse.jdt.core.dom.ITypeBinding;
3332
import org.eclipse.jdt.core.dom.IVariableBinding;
3433
import org.eclipse.jdt.core.dom.JavacBindingResolver;
35-
import org.eclipse.jdt.core.dom.JavacBindingResolver.BindingKeyException;
3634
import org.eclipse.jdt.core.dom.LambdaExpression;
3735
import org.eclipse.jdt.core.dom.MethodDeclaration;
3836
import org.eclipse.jdt.core.dom.Modifier;
3937
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
4038
import org.eclipse.jdt.core.dom.TypeParameter;
39+
import org.eclipse.jdt.core.dom.JavacBindingResolver.BindingKeyException;
4140
import org.eclipse.jdt.internal.codeassist.DOMCompletionUtil;
4241
import org.eclipse.jdt.internal.core.BinaryMethod;
4342
import org.eclipse.jdt.internal.core.JavaElement;
@@ -50,11 +49,11 @@
5049
import com.sun.tools.javac.code.Flags;
5150
import com.sun.tools.javac.code.Kinds;
5251
import com.sun.tools.javac.code.Symbol;
52+
import com.sun.tools.javac.code.Type;
5353
import com.sun.tools.javac.code.Symbol.ClassSymbol;
5454
import com.sun.tools.javac.code.Symbol.MethodSymbol;
5555
import com.sun.tools.javac.code.Symbol.TypeSymbol;
5656
import com.sun.tools.javac.code.Symbol.VarSymbol;
57-
import com.sun.tools.javac.code.Type;
5857
import com.sun.tools.javac.code.Type.ForAll;
5958
import com.sun.tools.javac.code.Type.JCNoType;
6059
import com.sun.tools.javac.code.Type.MethodType;
@@ -74,7 +73,7 @@ public abstract class JavacMethodBinding implements IMethodBinding {
7473
final boolean explicitSynthetic;
7574
// allows to discriminate generic vs parameterized
7675
private final boolean isDeclaration;
77-
private IJavaElement javaElement;
76+
private IMethod javaElement;
7877
private String key;
7978

8079
/**
@@ -202,14 +201,19 @@ public boolean isSynthetic() {
202201
}
203202

204203
@Override
205-
public IJavaElement getJavaElement() {
204+
public IMethod getJavaElement() {
205+
this.javaElement = resolved(getUnresolvedJavaElement());
206+
return this.javaElement;
207+
}
208+
209+
IMethod getUnresolvedJavaElement() {
206210
if (this.javaElement == null) {
207-
this.javaElement = computeJavaElement();
211+
this.javaElement = computeUnresolvedJavaElement();
208212
}
209213
return this.javaElement;
210-
}
214+
}
211215

212-
private IJavaElement computeJavaElement() {
216+
private IMethod computeUnresolvedJavaElement() {
213217
if (this.methodSymbol == null) {
214218
return null;
215219
}
@@ -231,7 +235,7 @@ private IJavaElement computeJavaElement() {
231235
.toArray(String[]::new);
232236
IMethod[] methods = currentType.findMethods(currentType.getMethod(getName(), parametersResolved));
233237
if (methods != null && methods.length > 0) {
234-
return resolved(methods[0]);
238+
return methods[0];
235239
}
236240
var parametersNotResolved = this.methodSymbol.params().stream()
237241
.map(varSymbol -> varSymbol.type)
@@ -241,14 +245,14 @@ private IJavaElement computeJavaElement() {
241245
.toArray(String[]::new);
242246
methods = currentType.findMethods(currentType.getMethod(getName(), parametersNotResolved));
243247
if (methods != null && methods.length > 0) {
244-
return resolved(methods[0]);
248+
return methods[0];
245249
}
246250
}
247251
}
248252
return null;
249253
}
250254

251-
private IJavaElement getJavaElementForMethodDeclaration(IType currentType, MethodDeclaration methodDeclaration) {
255+
private IMethod getJavaElementForMethodDeclaration(IType currentType, MethodDeclaration methodDeclaration) {
252256
ArrayList<String> typeParamsList = new ArrayList<>();
253257
List<TypeParameter> typeParams = null;
254258
typeParams = methodDeclaration.typeParameters();
@@ -270,7 +274,7 @@ private IJavaElement getJavaElementForMethodDeclaration(IType currentType, Metho
270274
}).toArray(String[]::new);
271275
IMethod result = currentType.getMethod(getName(), params);
272276
if (currentType.isBinary() || result.exists()) {
273-
return resolved(result);
277+
return result;
274278
}
275279
IMethod[] methods = null;
276280
try {
@@ -282,10 +286,16 @@ private IJavaElement getJavaElementForMethodDeclaration(IType currentType, Metho
282286
IMethod[] candidates = Member.findMethods(result, methods);
283287
if (candidates == null || candidates.length == 0)
284288
return null;
285-
return resolved(candidates[0]);
289+
return candidates[0];
286290
}
287291

288292
private IMethod resolved(IMethod from) {
293+
if (from == null) {
294+
return null;
295+
}
296+
if (from.isResolved()) {
297+
return from;
298+
}
289299
if (from instanceof SourceMethod && !(from instanceof ResolvedSourceMethod)) {
290300
return new ResolvedSourceMethod((JavaElement)from.getParent(), from.getElementName(), from.getParameterTypes(), computeKeyWithThrowsFromJavadoc(from), from.getOccurrenceCount());
291301
}
@@ -313,7 +323,7 @@ private String computeKeyWithThrowsFromJavadoc(IMethod method) {
313323
return getKey() + Arrays.stream(exceptions).map(t -> '|' + t.replace('.', '/')).collect(Collectors.joining());
314324
}
315325

316-
private IJavaElement getJavaElementForAnnotationTypeMemberDeclaration(IType currentType, AnnotationTypeMemberDeclaration annotationTypeMemberDeclaration) {
326+
private IMethod getJavaElementForAnnotationTypeMemberDeclaration(IType currentType, AnnotationTypeMemberDeclaration annotationTypeMemberDeclaration) {
317327
IMethod result = currentType.getMethod(getName(), new String[0]);
318328
if (currentType.isBinary() || result.exists()) {
319329
return result;

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/javac/dom/JavacTypeBinding.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@
5353
import org.eclipse.jdt.core.dom.ITypeBinding;
5454
import org.eclipse.jdt.core.dom.IVariableBinding;
5555
import org.eclipse.jdt.core.dom.JavacBindingResolver;
56-
import org.eclipse.jdt.core.dom.JavacBindingResolver.BindingKeyException;
5756
import org.eclipse.jdt.core.dom.MethodDeclaration;
5857
import org.eclipse.jdt.core.dom.Modifier;
5958
import org.eclipse.jdt.core.dom.RecordDeclaration;
6059
import org.eclipse.jdt.core.dom.TypeDeclaration;
60+
import org.eclipse.jdt.core.dom.JavacBindingResolver.BindingKeyException;
6161
import org.eclipse.jdt.internal.codeassist.KeyUtils;
6262
import org.eclipse.jdt.internal.compiler.codegen.ConstantPool;
6363
import org.eclipse.jdt.internal.core.BinaryType;
@@ -69,10 +69,13 @@
6969
import com.sun.tools.javac.code.Attribute;
7070
import com.sun.tools.javac.code.Flags;
7171
import com.sun.tools.javac.code.Kinds;
72+
import com.sun.tools.javac.code.Symbol;
73+
import com.sun.tools.javac.code.Type;
74+
import com.sun.tools.javac.code.TypeTag;
75+
import com.sun.tools.javac.code.Types;
7276
import com.sun.tools.javac.code.Kinds.Kind;
7377
import com.sun.tools.javac.code.Kinds.KindSelector;
7478
import com.sun.tools.javac.code.Scope.LookupKind;
75-
import com.sun.tools.javac.code.Symbol;
7679
import com.sun.tools.javac.code.Symbol.ClassSymbol;
7780
import com.sun.tools.javac.code.Symbol.CompletionFailure;
7881
import com.sun.tools.javac.code.Symbol.MethodSymbol;
@@ -81,7 +84,6 @@
8184
import com.sun.tools.javac.code.Symbol.TypeSymbol;
8285
import com.sun.tools.javac.code.Symbol.TypeVariableSymbol;
8386
import com.sun.tools.javac.code.Symbol.VarSymbol;
84-
import com.sun.tools.javac.code.Type;
8587
import com.sun.tools.javac.code.Type.ArrayType;
8688
import com.sun.tools.javac.code.Type.ClassType;
8789
import com.sun.tools.javac.code.Type.ErrorType;
@@ -91,8 +93,6 @@
9193
import com.sun.tools.javac.code.Type.MethodType;
9294
import com.sun.tools.javac.code.Type.TypeVar;
9395
import com.sun.tools.javac.code.Type.WildcardType;
94-
import com.sun.tools.javac.code.TypeTag;
95-
import com.sun.tools.javac.code.Types;
9696
import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
9797
import com.sun.tools.javac.util.Name;
9898
import com.sun.tools.javac.util.Names;
@@ -718,7 +718,7 @@ public IMethodBinding[] getDeclaredMethods() {
718718
// with javac, we loose the order of methods for binaries, so
719719
// recompute it relying on JDT model (which honors the order)
720720
methods = methods.sorted(Comparator.comparingInt(binding -> {
721-
var elt = binding.getJavaElement();
721+
var elt = binding.getUnresolvedJavaElement(); // unresolved is necessary, as resolved is too expensive
722722
return elt != null ? orderedListFromModel.indexOf(elt) : -1;
723723
}));
724724
}

0 commit comments

Comments
 (0)