new overload resolution: reject candidates with applicability level less than asked (IDEA-145505)

This commit is contained in:
Anna Kozlova
2015-09-24 19:20:59 +03:00
parent df9e5dd533
commit 7d92ec966f
3 changed files with 37 additions and 2 deletions

View File

@@ -272,11 +272,19 @@ public class MethodReferenceResolver implements ResolveCache.PolyVariantContextR
private boolean resolveConflicts(List<CandidateInfo> firstCandidates, List<CandidateInfo> secondCandidates, int applicabilityLevel) {
checkApplicability(firstCandidates);
final int firstApplicability = checkApplicability(firstCandidates);
checkSpecifics(firstCandidates, applicabilityLevel, myLanguageLevel);
checkApplicability(secondCandidates);
final int secondApplicability = checkApplicability(secondCandidates);
checkSpecifics(secondCandidates, applicabilityLevel, myLanguageLevel);
if (firstApplicability < secondApplicability) {
return secondCandidates.size() == 1;
}
if (secondApplicability < firstApplicability) {
return firstCandidates.size() == 1;
}
return firstCandidates.size() + secondCandidates.size() == 1;
}

View File

@@ -0,0 +1,23 @@
import java.util.function.BiConsumer;
class MyTest<T> {
{
BiConsumer<Builder<T>, T> builderTBiConsumer = Builder::add;
BiConsumer<Builder<T>, T> builderTBiConsumer1 = Builder<T>::add;
System.out.println(builderTBiConsumer);
System.out.println(builderTBiConsumer1);
}
public static class Builder<E> {
public Builder<E> add(E element) {
return this;
}
public Builder<E> add(E... elements) {
return this;
}
}
}

View File

@@ -146,6 +146,10 @@ public class OverloadResolutionTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testIgnoreCandidatesWithLowerApplicabilityLevel() throws Exception {
doTest();
}
private void doTest() {
doTest(true);
}