Skip to content

Commit 70ed23c

Browse files
committed
Fix for test0268
Signed-off-by: Rob Stryker <[email protected]>
1 parent d820c42 commit 70ed23c

File tree

4 files changed

+67
-12
lines changed

4 files changed

+67
-12
lines changed

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,19 +1121,23 @@ IMethodBinding resolveConstructor(EnumConstantDeclaration enumConstantDeclaratio
11211121
@Override
11221122
IMethodBinding resolveConstructor(SuperConstructorInvocation expression) {
11231123
resolve();
1124-
JCTree javacElement = this.converter.domToJavac.get(expression);
1124+
JCTree original = this.converter.domToJavac.get(expression);
1125+
JCTree javacElement = original;
1126+
List<com.sun.tools.javac.code.Type> typeArgs = null;
11251127
if (javacElement instanceof JCMethodInvocation javacMethodInvocation) {
1128+
typeArgs = List.of();
11261129
javacElement = javacMethodInvocation.getMethodSelect();
1130+
typeArgs = javacMethodInvocation.getTypeArguments().stream().map(jcExpr -> jcExpr.type).toList();
11271131
}
11281132
if (javacElement instanceof JCIdent ident && ident.sym instanceof MethodSymbol methodSymbol) {
11291133
if (ident.type != null && (ident.type instanceof MethodType || ident.type instanceof ForAll)) {
1130-
return this.bindings.getMethodBinding(ident.type.asMethodType(), methodSymbol, null, false, null);
1134+
return this.bindings.getMethodBinding(ident.type.asMethodType(), methodSymbol, null, false, typeArgs);
11311135
} else if (methodSymbol.asType() instanceof MethodType || methodSymbol.asType() instanceof ForAll) {
1132-
return this.bindings.getMethodBinding(methodSymbol.asType().asMethodType(), methodSymbol, null, false, null);
1136+
return this.bindings.getMethodBinding(methodSymbol.asType().asMethodType(), methodSymbol, null, false, typeArgs);
11331137
}
11341138
}
11351139
if (javacElement instanceof JCFieldAccess fieldAccess && fieldAccess.sym instanceof MethodSymbol methodSymbol) {
1136-
return this.bindings.getMethodBinding(fieldAccess.type.asMethodType(), methodSymbol, null, false, null);
1140+
return this.bindings.getMethodBinding(fieldAccess.type.asMethodType(), methodSymbol, null, false, typeArgs);
11371141
}
11381142
return null;
11391143
}

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

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.sun.tools.javac.code.Symbol.ClassSymbol;
5555
import com.sun.tools.javac.code.Symbol.MethodSymbol;
5656
import com.sun.tools.javac.code.Symbol.TypeSymbol;
57+
import com.sun.tools.javac.code.Symbol.TypeVariableSymbol;
5758
import com.sun.tools.javac.code.Symbol.VarSymbol;
5859
import com.sun.tools.javac.code.Type;
5960
import com.sun.tools.javac.code.Type.ForAll;
@@ -647,17 +648,61 @@ public boolean isParameterizedMethod() {
647648
return !isRawMethod() && !methodHasGenerics() && methodMatchesParameterized();
648649
}
649650

651+
private boolean parameterizedViaDeclaringClass() {
652+
return isConstructor() && getDeclaringClass().isParameterizedType();
653+
}
654+
655+
private boolean parameterizedViaSymbolTypeParams() {
656+
return this.methodSymbol != null && !this.methodSymbol.getTypeParameters().isEmpty() && !isDeclaration;
657+
}
658+
650659
private boolean methodMatchesParameterized() {
651-
return ((isConstructor() && getDeclaringClass().isParameterizedType())
652-
|| (this.methodSymbol != null && !this.methodSymbol.getTypeParameters().isEmpty() && !isDeclaration));
660+
boolean constructorMatch = parameterizedViaDeclaringClass();
661+
boolean secondaryMatch = parameterizedViaSymbolTypeParams();
662+
return constructorMatch || secondaryMatch;
653663
}
654664

655665
@Override
656666
public boolean isRawMethod() {
657-
return this.methodType.isRaw() ||
658-
(getDeclaringClass() != null && getDeclaringClass().isRawType() &&
659-
(isConstructor() || !this.methodType.getParameterTypes().isEmpty())) ||
660-
(this.methodSymbol == null && !this.methodType.getParameterTypes().isEmpty());
667+
if( methodHasGenerics() )
668+
return false;
669+
670+
if( this.methodSymbol != null ) {
671+
List<Type> typeArgs = null;
672+
if( this.methodSymbol.type instanceof ForAll fa) {
673+
typeArgs = fa.getTypeArguments();
674+
}
675+
if( typeArgs == null || typeArgs.size() == 0 ) {
676+
// The type (ie method decl) has no type args
677+
return false;
678+
}
679+
List<TypeVariableSymbol> tp = this.methodSymbol == null ? null : this.methodSymbol.getTypeParameters();
680+
int countExpected = (tp == null || tp.size() == 0 ) ? 0 : tp.size();
681+
if( countExpected == 0 ) {
682+
return false;
683+
}
684+
}
685+
686+
687+
if( parameterizedViaDeclaringClass() ) {
688+
return false;
689+
}
690+
if( parameterizedViaSymbolTypeParams() && this.resolvedTypeArgs != null) {
691+
return false;
692+
}
693+
694+
boolean finalRet = false;
695+
if( this.methodSymbol != null && (this.resolvedTypeArgs == null || this.resolvedTypeArgs.size() == 0)) {
696+
finalRet = true;
697+
} else {
698+
ITypeBinding declaring = getDeclaringClass();
699+
boolean old1 = (declaring != null && declaring.isRawType() &&
700+
(isConstructor() || !this.methodType.getParameterTypes().isEmpty()));
701+
boolean old2 = (this.methodSymbol == null && !this.methodType.getParameterTypes().isEmpty());
702+
boolean old = old1 || old2;
703+
finalRet = old;
704+
}
705+
return finalRet;
661706
}
662707

663708
@Override

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.eclipse.jdt.core.ICompilationUnit;
1919
import org.eclipse.jdt.core.IJavaElement;
2020
import org.eclipse.jdt.core.IPackageFragment;
21+
import org.eclipse.jdt.core.IPackageFragmentRoot;
2122
import org.eclipse.jdt.core.JavaModelException;
2223
import org.eclipse.jdt.core.dom.IAnnotationBinding;
2324
import org.eclipse.jdt.core.dom.IBinding;
@@ -86,8 +87,10 @@ public IJavaElement getJavaElement() {
8687
return null;
8788
}
8889
try {
89-
IJavaElement ret = Arrays.stream(this.resolver.javaProject.getAllPackageFragmentRoots())
90-
.map(root -> root.getPackageFragment(this.getQualifiedNameInternal()))
90+
IPackageFragmentRoot[] roots = this.resolver.javaProject.getAllPackageFragmentRoots();
91+
String qName = this.getQualifiedNameInternal();
92+
IJavaElement ret = Arrays.stream(roots)
93+
.map(root -> root.getPackageFragment(qName))
9194
.filter(Objects::nonNull)
9295
.filter(IPackageFragment::exists)
9396
.findFirst()

org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter15JLS4Test.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9192,6 +9192,9 @@ public void test0268() throws JavaModelException {
91929192
SuperConstructorInvocation invocation = (SuperConstructorInvocation) node;
91939193
IMethodBinding methodBinding = invocation.resolveConstructorBinding();
91949194
assertNotNull("No binding", methodBinding);
9195+
boolean b1 = methodBinding.isParameterizedMethod();
9196+
boolean b2 = methodBinding.isGenericMethod();
9197+
boolean b3 = methodBinding.isRawMethod();
91959198
assertFalse("Not a parameterized method", methodBinding.isParameterizedMethod());
91969199
node = getASTNode(unit, 1, 1, 0);
91979200
assertEquals("Not a expression statement", ASTNode.SUPER_CONSTRUCTOR_INVOCATION, node.getNodeType());

0 commit comments

Comments
 (0)