Skip to content

Commit 0a4120d

Browse files
committed
SONARJAVA-1584 Prefer method without var arity first
1 parent d171e37 commit 0a4120d

4 files changed

Lines changed: 32 additions & 4 deletions

File tree

java-frontend/src/main/java/org/sonar/java/resolve/Resolve.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -559,14 +559,19 @@ private boolean isSignatureMoreSpecific(JavaSymbol m1, JavaSymbol m2, TypeSubsti
559559
List<JavaType> m1ArgTypes = ((JavaType.MethodJavaType) m1.type).argTypes;
560560
List<JavaType> m2ArgTypes = ((JavaType.MethodJavaType) m2.type).argTypes;
561561
JavaSymbol.MethodJavaSymbol methodJavaSymbol = (JavaSymbol.MethodJavaSymbol) m1;
562-
if (methodJavaSymbol.isVarArgs()) {
562+
boolean m1VarArity = methodJavaSymbol.isVarArgs();
563+
boolean m2VarArity = ((JavaSymbol.MethodJavaSymbol) m2).isVarArgs();
564+
if (m1VarArity != m2VarArity) {
565+
return m2VarArity;
566+
}
567+
if (m1VarArity) {
563568
m1ArgTypes = expandVarArgsToFitSize(m1ArgTypes, m2ArgTypes.size());
564569
}
565-
if(!hasCompatibleArity(m1ArgTypes.size(), m2ArgTypes.size(), ((JavaSymbol.MethodJavaSymbol) m2).isVarArgs())) {
570+
if(!hasCompatibleArity(m1ArgTypes.size(), m2ArgTypes.size(), m2VarArity)) {
566571
return false;
567572
}
568573
m1ArgTypes = typeSubstitutionSolver.applySubstitutionToFormalParameters(m1ArgTypes, substitution);
569-
return isArgumentsAcceptable(m1ArgTypes, m2ArgTypes, ((JavaSymbol.MethodJavaSymbol) m2).isVarArgs(), false);
574+
return isArgumentsAcceptable(m1ArgTypes, m2ArgTypes, m2VarArity, false);
570575
}
571576

572577
private static List<JavaType> expandVarArgsToFitSize(List<JavaType> m1ArgTypes, int size) {

java-frontend/src/test/files/sym/references/MethodCall.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,21 @@ void test() {
221221
varargs3("");
222222
varargs4();
223223
}
224+
}
225+
226+
class MyVarArgs {
227+
void varargs5(Object o) {}
228+
void varargs6(String s, Object... o) {}
229+
}
230+
231+
class MyVarArgsTest extends MyVarArgs {
232+
void varargs5(String s, Object... o) {}
233+
void varargs6(Object o) {}
234+
235+
void test() {
236+
varargs5(null);
237+
varargs5("");
238+
varargs6(null);
239+
varargs6("");
240+
}
224241
}

java-frontend/src/test/java/org/sonar/java/resolve/Result.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private Object referenceTree(int line, int column, boolean searchSymbol, @Nullab
114114
}
115115
}
116116
}
117-
throw new IllegalArgumentException("Reference Tree not found");
117+
throw new IllegalArgumentException("Reference Tree not found "+line);
118118
}
119119

120120

java-frontend/src/test/java/org/sonar/java/resolve/SymbolTableTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,12 @@ public void MethodCall() {
635635
assertThat(result.reference(221, 5)).isSameAs(result.symbol("varargs3", 216));
636636
assertThat(result.reference(222, 5)).isSameAs(result.symbol("varargs4", 218));
637637

638+
assertThat(result.reference(236, 5)).isSameAs(result.symbol("varargs5", 227));
639+
assertThat(result.reference(237, 5)).isSameAs(result.symbol("varargs5", 227));
640+
641+
assertThat(result.reference(238, 5)).isSameAs(result.symbol("varargs6", 233));
642+
assertThat(result.reference(239, 5)).isSameAs(result.symbol("varargs6", 233));
643+
638644

639645
}
640646

0 commit comments

Comments
 (0)