Skip to content

Commit f8cf9ce

Browse files
committed
Verify method parameter types to return accuracy
1 parent 82d0277 commit f8cf9ce

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/DOMMethodLocator.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.eclipse.jdt.core.dom.ASTNode;
3232
import org.eclipse.jdt.core.dom.Annotation;
3333
import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration;
34+
import org.eclipse.jdt.core.dom.ConstructorInvocation;
3435
import org.eclipse.jdt.core.dom.Expression;
3536
import org.eclipse.jdt.core.dom.ExpressionMethodReference;
3637
import org.eclipse.jdt.core.dom.IBinding;
@@ -639,10 +640,11 @@ private int computeResolveLevel(org.eclipse.jdt.core.dom.ASTNode node, IBinding
639640
return IMPOSSIBLE_MATCH;
640641
}
641642

642-
protected int resolveLevel(MethodInvocation messageSend) {
643-
IMethodBinding invocationBinding = messageSend.resolveMethodBinding();
644-
ITypeBinding initialReceiverType = messageSend.getExpression() != null ? messageSend.getExpression().resolveTypeBinding() : null;
645-
return resolveLevelForNodeWithMethodBinding(messageSend, invocationBinding, initialReceiverType, false, false);
643+
private List<Expression> arguments(ASTNode node) {
644+
return (List<Expression>)
645+
(node instanceof MethodInvocation method ? method.arguments() :
646+
node instanceof ConstructorInvocation constr ? constr.arguments() :
647+
List.of());
646648
}
647649

648650
protected int resolveLevelForNodeWithMethodBinding(ASTNode messageSend,
@@ -669,6 +671,16 @@ protected int resolveLevelForNodeWithMethodBinding(ASTNode messageSend,
669671
invocationOrDeclarationBinding = declarationBinding;
670672
}
671673

674+
if (invocationBinding.getParameterTypes().length == arguments(messageSend).size()) {
675+
for (int i = 0; i < invocationBinding.getParameterTypes().length; i++) {
676+
var source = arguments(messageSend).get(i).resolveTypeBinding();
677+
var resolved = invocationBinding.getParameterTypes()[i];
678+
if (source != null && !source.isAssignmentCompatible(resolved)) {
679+
return INACCURATE_MATCH;
680+
}
681+
}
682+
}
683+
672684
int invocOrDeclLevel = invocationLevel == IMPOSSIBLE_MATCH ? declarationLevel : invocationLevel;
673685
// receiver type
674686
if (this.pattern.declaringSimpleName == null && this.pattern.declaringQualification == null) {
@@ -709,6 +721,8 @@ protected int resolveLevelForNodeWithMethodBinding(ASTNode messageSend,
709721
// this is an overridden method => add flavor to returned level
710722
declaringLevel = invocOrDeclLevel | SUPER_INVOCATION_FLAVOR;
711723
}
724+
// Consider whether the next lines should be part of DOMJavaSearchDelegate as they
725+
// don't seem so specific to Method locator (same code could serve TypeRefLocator too)
712726
if ((declaringLevel & FLAVORS_MASK) != 0) {
713727
// level got some flavors => return it
714728
retval = declaringLevel;
@@ -783,7 +797,9 @@ protected boolean isVirtualInvoke(IMethodBinding method) {
783797
@Override
784798
public LocatorResponse resolveLevel(org.eclipse.jdt.core.dom.ASTNode node, IBinding binding, MatchLocator locator) {
785799
if (node instanceof MethodInvocation invocation) {
786-
return toResponse(resolveLevel(invocation));
800+
IMethodBinding invocationBinding = invocation.resolveMethodBinding();
801+
ITypeBinding initialReceiverType = invocation.getExpression() != null ? invocation.getExpression().resolveTypeBinding() : null;
802+
return toResponse(resolveLevelForNodeWithMethodBinding(invocation, invocationBinding, initialReceiverType, false, false));
787803
}
788804
int level = computeResolveLevel(node, binding, locator);
789805
if (node instanceof MethodDeclaration declaration && binding != null) {

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/DOMTypeReferenceLocator.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,25 @@ private void updateMatchRule(ASTNode node, SearchMatch match) {
963963
int matchRule = match.getRule();
964964
char[][][] fromPattern = this.locator.pattern.getTypeArguments();
965965
int patternTypeArgsLength = (fromPattern == null || fromPattern.length == 0 || fromPattern[0] == null ? 0 : fromPattern.length <= 0 ? 0 : fromPattern[0].length);
966-
int typeArgumentsLength = node instanceof ParameterizedType ptt ? ptt.typeArguments().size() : 0;
966+
Type typeNode = null;
967+
{
968+
ASTNode current = node;
969+
while (current != null) {
970+
if (current.getLocationInParent() == SimpleType.NAME_PROPERTY) {
971+
current = current.getParent();
972+
typeNode = (SimpleType) current;
973+
} else if (current.getLocationInParent() == ParameterizedType.TYPE_PROPERTY) {
974+
current = current.getParent();
975+
typeNode = (ParameterizedType) current;
976+
} else if (current instanceof Type t) {
977+
current = current.getParent();
978+
typeNode = t;
979+
} else {
980+
current = null;
981+
}
982+
}
983+
}
984+
int typeArgumentsLength = typeNode instanceof ParameterizedType ptt ? ptt.typeArguments().size() : 0;
967985
boolean hasTypeParameters = this.locator.pattern.hasTypeParameters();
968986

969987
if (match.isRaw()) {

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/TypeArgumentMatchingUtility.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ public static boolean validateSingleTypeArgMatches(boolean requiresExactMatch, S
4646
domSig = domBinding instanceof JavacTypeBinding jctb ? jctb.getGenericTypeSignature(false) : domBinding.getKey();
4747
}
4848

49+
if( Objects.equals(patternSig, domSig)) {
50+
return true;
51+
}
4952
if( requiresExactMatch ) {
50-
if( Objects.equals(patternSig, domSig)) {
51-
return true;
52-
}
5353
if( patternSig.equals("*") && isQuestionMark(domSig)) {
5454
return true;
5555
}

0 commit comments

Comments
 (0)