Skip to content

Commit a086556

Browse files
committed
Fix StackOverflow in parameterized method binding key
Changes `JavaSearchBugs9Tests.testGH902_whenTypeReferenceIsUnknownButQualified_expectToBeFound` and three other similar tests from an error to a failure. - Fix recovered type binding implementations (some use recursion with no base case, some fail to consider that there's no type or symbol) - Fix typevar tries to use method key in its key but method key uses typevar key - There's an existing to get around this, but it wasn't being used for some reason Signed-off-by: David Thompson <[email protected]>
1 parent c24f336 commit a086556

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ static void getKey(StringBuilder builder, MethodSymbol methodSymbol, ExecutableT
474474
if (methodType instanceof MethodType && !methodType.getTypeVariables().isEmpty()) { // parameterized
475475
builder.append('<');
476476
for (var typeParam : methodType.getTypeVariables()) {
477-
JavacTypeBinding.getKey(builder, (Type)typeParam, false, true, useSlashes, resolver);
477+
builder.append(JavacTypeVariableBinding.getTypeVariableKey((TypeVariableSymbol)typeParam.asElement(), resolver));
478478
}
479479
builder.append('>');
480480
} else if (methodType instanceof ForAll && !methodType.getTypeVariables().isEmpty()) { // generic

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

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.eclipse.jdt.core.dom.SimpleName;
3232
import org.eclipse.jdt.core.dom.SimpleType;
3333

34-
import com.sun.tools.javac.code.Type;
3534
import com.sun.tools.javac.code.Type.ArrayType;
3635
import com.sun.tools.javac.code.Type.PackageType;
3736

@@ -73,24 +72,17 @@ public JavacTypeBinding getComponentType() {
7372

7473
@Override
7574
public JavacTypeBinding getElementType() {
76-
var res = getElementType();
77-
if (res != null) {
78-
return res;
75+
if (this.type != null) {
76+
return (JavacTypeBinding)super.getElementType();
7977
}
80-
if (isArray()) {
81-
Type t = this.types.elemtype(this.type);
82-
while (t instanceof Type.ArrayType) {
83-
t = this.types.elemtype(t);
84-
}
85-
if (t == null || t.isErroneous()) {
86-
if (this.domNode instanceof org.eclipse.jdt.core.dom.ArrayType domArrayType) {
87-
return this.resolver.bindings.getRecoveredTypeBinding(t, domArrayType.getElementType());
88-
} else {
89-
return this.resolver.bindings.getRecoveredTypeBinding(t, domName());
90-
}
78+
if (this.domNode instanceof org.eclipse.jdt.core.dom.ArrayType domArrayType) {
79+
org.eclipse.jdt.core.dom.Type cursor = domArrayType.getElementType();
80+
while (cursor instanceof org.eclipse.jdt.core.dom.ArrayType at) {
81+
cursor = at.getElementType();
9182
}
83+
return this.resolver.bindings.getRecoveredTypeBinding(this.type, cursor);
9284
}
93-
return res;
85+
return null;
9486
}
9587

9688
@Override
@@ -274,4 +266,38 @@ public String getKey() {
274266
}
275267
return "L" + getQualifiedName() + ";";
276268
}
269+
@Override
270+
public String getKey(boolean includeTypeParameters, boolean useSlashes) {
271+
if (this.type != null) {
272+
return super.getKey(includeTypeParameters, useSlashes);
273+
}
274+
if (useSlashes) {
275+
return "L" + getQualifiedName().replace('.', '/') + ";";
276+
} else {
277+
return "L" + getQualifiedName() + ";";
278+
}
279+
}
280+
@Override
281+
public String getGenericTypeSignature(boolean useSlashes) {
282+
if (this.type == null) {
283+
return getKey(false, useSlashes);
284+
}
285+
return super.getGenericTypeSignature(useSlashes);
286+
}
287+
288+
@Override
289+
public ITypeBinding[] getInterfaces() {
290+
if (this.type != null) {
291+
return super.getInterfaces();
292+
}
293+
return new ITypeBinding[0];
294+
}
295+
296+
@Override
297+
public ITypeBinding getSuperclass() {
298+
if (this.type != null) {
299+
return super.getSuperclass();
300+
}
301+
return null;
302+
}
277303
}

0 commit comments

Comments
 (0)