Skip to content

Commit fdfbca1

Browse files
mickaelistriargrunber
authored andcommitted
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 8353ec9 commit fdfbca1

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

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

Lines changed: 6 additions & 6 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

@@ -1471,7 +1471,7 @@ private IMethodBinding resolveConstructorImpl(ClassInstanceCreation expression)
14711471
boolean hasTrailingNull;
14721472
boolean matchExactParamCount = false;
14731473
do {
1474-
hasTrailingNull = !givenTypes.isEmpty() && givenTypes.getLast() == null;
1474+
hasTrailingNull = !givenTypes.isEmpty() && givenTypes.getLast() == null;
14751475
// try just checking by known args
14761476
// first filter by args count
14771477
var matchExactParamCountFinal = matchExactParamCount;

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)