mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-20 21:41:24 +07:00
method references: do not prefer varargs from first search (IDEA-182018)
This commit is contained in:
@@ -271,12 +271,14 @@ public class MethodReferenceResolver implements ResolveCache.PolyVariantContextR
|
||||
}
|
||||
}
|
||||
|
||||
if (resolveConflicts(firstCandidates, secondCandidates, MethodCandidateInfo.ApplicabilityLevel.FIXED_ARITY)) {
|
||||
return !firstCandidates.isEmpty() ? firstCandidates.get(0) : secondCandidates.get(0);
|
||||
CandidateInfo candidateInfo = resolveConflicts(firstCandidates, secondCandidates, MethodCandidateInfo.ApplicabilityLevel.FIXED_ARITY);
|
||||
if (candidateInfo != null) {
|
||||
return candidateInfo;
|
||||
}
|
||||
|
||||
if (resolveConflicts(firstCandidates, secondCandidates, MethodCandidateInfo.ApplicabilityLevel.VARARGS)) {
|
||||
return !firstCandidates.isEmpty() ? firstCandidates.get(0) : secondCandidates.get(0);
|
||||
candidateInfo = resolveConflicts(firstCandidates, secondCandidates, MethodCandidateInfo.ApplicabilityLevel.VARARGS);
|
||||
if (candidateInfo != null) {
|
||||
return candidateInfo;
|
||||
}
|
||||
|
||||
if (firstCandidates.isEmpty() && secondCandidates.isEmpty()) {
|
||||
@@ -356,7 +358,7 @@ public class MethodReferenceResolver implements ResolveCache.PolyVariantContextR
|
||||
}
|
||||
}
|
||||
|
||||
private boolean resolveConflicts(List<CandidateInfo> firstCandidates, List<CandidateInfo> secondCandidates, int applicabilityLevel) {
|
||||
private CandidateInfo resolveConflicts(List<CandidateInfo> firstCandidates, List<CandidateInfo> secondCandidates, int applicabilityLevel) {
|
||||
|
||||
final int firstApplicability = checkApplicability(firstCandidates);
|
||||
checkSpecifics(firstCandidates, applicabilityLevel, myLanguageLevel);
|
||||
@@ -365,14 +367,18 @@ public class MethodReferenceResolver implements ResolveCache.PolyVariantContextR
|
||||
checkSpecifics(secondCandidates, applicabilityLevel, myLanguageLevel);
|
||||
|
||||
if (firstApplicability < secondApplicability) {
|
||||
return secondCandidates.size() == 1;
|
||||
return secondCandidates.size() == 1 ? secondCandidates.get(0) : null;
|
||||
}
|
||||
|
||||
if (secondApplicability < firstApplicability) {
|
||||
return firstCandidates.size() == 1;
|
||||
return firstCandidates.size() == 1 ? firstCandidates.get(0) : null;
|
||||
}
|
||||
|
||||
return firstCandidates.size() + secondCandidates.size() == 1;
|
||||
return firstCandidates.size() + secondCandidates.size() == 1
|
||||
? firstCandidates.isEmpty()
|
||||
? secondCandidates.get(0)
|
||||
: firstCandidates.get(0)
|
||||
: null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import java.util.function.BinaryOperator;
|
||||
|
||||
class Test {
|
||||
static class Base<T> {
|
||||
Child<T> prepend(Child<T> other) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static class Child<T> extends Base<T> {
|
||||
@SafeVarargs
|
||||
final Child<T> prepend(T... args) {
|
||||
return this;
|
||||
}
|
||||
|
||||
Child<T> prepend(T arg) {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
BinaryOperator<Child<String>> prepend = Child::prepend;
|
||||
}
|
||||
}
|
||||
@@ -178,6 +178,7 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
public void testWildcardInCheckedCompatibilityConstraints() { doTest(); }
|
||||
public void testConstructorReferenceWithVarargsParameters() { doTest(); }
|
||||
public void testMethodReferenceSwallowedErrors() { doTest(); }
|
||||
public void testConflictingVarargsFromFirstSearchWithNArityOfTheSecondSearch() { doTest(); }
|
||||
|
||||
public void testPreferErrorOnTopLevelToFailedSubstitutorOnNestedLevel() { doTest(); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user