Do not consider error results successful in '::' LHS resolution

Fixes EA-81649
This commit is contained in:
Alexander Udalov
2016-04-18 14:39:35 +03:00
parent be62caf335
commit 9c99152126
4 changed files with 50 additions and 1 deletions
@@ -178,7 +178,9 @@ class DoubleColonExpressionResolver(
val traceAndCache = TemporaryTraceAndCache.create(c, "Resolve expression on LHS of callable reference", simpleNameExpression)
val resolutionResult = callExpressionResolver.resolveSimpleName(c.replaceTraceAndCache(traceAndCache), simpleNameExpression)
val resultingCalls = resolutionResult.resultingCalls.filter { call -> call.status.possibleTransformToSuccess() }
val resultingCalls = resolutionResult.resultingCalls.filter { call ->
call.status.possibleTransformToSuccess() && !ErrorUtils.isError(call.resultingDescriptor)
}
if (resultingCalls.isEmpty()) return
if (resultingCalls.singleOrNull()?.resultingDescriptor is FakeCallableDescriptorForObject) return
@@ -0,0 +1,20 @@
// Different modules are important for this test because otherwise everything is analyzed at once and some errors
// already exist in the binding context when we're analyzing "User::surname".
// (The assertion at DoubleColonExpressionResolver.checkNoExpressionOnLHS is only performed when there are no errors in the binding context)
// MODULE: m1
// FILE: bar.kt
fun <T> bar(<!UNUSED_PARAMETER!>ff<!>: <!UNRESOLVED_REFERENCE!>Err<!>.() -> Unit) {
}
// MODULE: m2(m1)
// FILE: foo.kt
data class User(val surname: String)
fun foo() {
bar<String> {
<!UNUSED_EXPRESSION!>User::surname<!>
}
}
@@ -0,0 +1,21 @@
// -- Module: <m1> --
package
public fun </*0*/ T> bar(/*0*/ ff: [ERROR : Err].() -> kotlin.Unit): kotlin.Unit
// -- Module: <m2> --
package
public fun </*0*/ T> bar(/*0*/ ff: [ERROR : Err].() -> kotlin.Unit): kotlin.Unit
public fun foo(): kotlin.Unit
public final data class User {
public constructor User(/*0*/ surname: kotlin.String)
public final val surname: kotlin.String
public final operator /*synthesized*/ fun component1(): kotlin.String
public final /*synthesized*/ fun copy(/*0*/ surname: kotlin.String = ...): User
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1647,6 +1647,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/callableReference"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("ea81649_errorPropertyLHS.kt")
public void testEa81649_errorPropertyLHS() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/callableReference/ea81649_errorPropertyLHS.kt");
doTest(fileName);
}
@TestMetadata("emptyLhs.kt")
public void testEmptyLhs() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/callableReference/emptyLhs.kt");