Skip to content

Commit 87a4129

Browse files
committed
Improve diagnostics on callable reference of unresolved class
#KT-10839 Fixed
1 parent 0579604 commit 87a4129

File tree

12 files changed

+41
-25
lines changed

12 files changed

+41
-25
lines changed

compiler/frontend/src/org/jetbrains/kotlin/types/expressions/DoubleColonExpressionResolver.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,9 @@ class DoubleColonExpressionResolver(
528528
resolvedCall?.resultingDescriptor ?: return null
529529
}
530530
else {
531-
context.trace.report(UNRESOLVED_REFERENCE.on(expression.callableReference, expression.callableReference))
531+
if (lhs != null || expression.isEmptyLHS) {
532+
context.trace.report(UNRESOLVED_REFERENCE.on(expression.callableReference, expression.callableReference))
533+
}
532534
return null
533535
}
534536

@@ -680,10 +682,13 @@ class DoubleColonExpressionResolver(
680682
): OverloadResolutionResults<CallableDescriptor>? {
681683
val reference = expression.callableReference
682684

683-
val lhsType =
684-
lhs?.type ?:
685-
return tryResolveRHSWithReceiver("resolve callable reference with empty LHS", null, reference, c, mode)
685+
val lhsType = lhs?.type
686+
if (lhsType == null) {
687+
if (!expression.isEmptyLHS) return null
688+
689+
return tryResolveRHSWithReceiver("resolve callable reference with empty LHS", null, reference, c, mode)
686690
?.apply { commitTrace() }?.results
691+
}
687692

688693
val resultSequence = buildSequence {
689694
when (lhs) {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class Foo {
22
fun bar() {}
3-
fun f() = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::bar
3+
fun f() = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>
44
}
55

6-
val f: () -> Unit = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::<!UNRESOLVED_REFERENCE!>foo<!>
6+
val f: () -> Unit = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>

compiler/testData/diagnostics/tests/callableReference/bound/kt12843.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public final class Foo {
66
public constructor Foo()
77
public final fun bar(): kotlin.Unit
88
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
9-
public final fun f(): kotlin.reflect.KFunction0<kotlin.Unit>
9+
public final fun f(): [ERROR : Error function type]
1010
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
1111
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
1212
}

compiler/testData/diagnostics/tests/callableReference/bound/reservedExpressionSyntax.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ class Test {
2626
fun <T> List<T>.testClassLiteral2() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS, EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>b<!>?::class
2727
fun <T> List<T>.testClassLiteral3() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS, EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>b<T, Any><!>::class
2828

29-
fun <T> List<T>.testUnresolved1() = <!UNRESOLVED_REFERENCE!>unresolved<!><T>::<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>foo<!>
29+
fun <T> List<T>.testUnresolved1() = <!UNRESOLVED_REFERENCE!>unresolved<!><T>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
3030
fun <T> List<T>.testUnresolved2() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!>a<<!UNRESOLVED_REFERENCE!>unresolved<!>><!>::foo
3131
fun <T> List<T>.testUnresolved3() = a<<!SYNTAX!><!>>::foo
32-
fun <T> List<T>.testUnresolved4() = <!UNRESOLVED_REFERENCE!>unresolved<!>?::<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>foo<!>
32+
fun <T> List<T>.testUnresolved4() = <!UNRESOLVED_REFERENCE!>unresolved<!>?::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
3333
}

compiler/testData/diagnostics/tests/callableReference/bound/reservedExpressionSyntax3.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ class Test {
2121

2222
val Int.c: Int get() = 42
2323

24-
val test1: () -> Right = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!><!DEBUG_INFO_MISSING_UNRESOLVED!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>b<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>Int<!>>.<!DEBUG_INFO_MISSING_UNRESOLVED!>c<!><!>::<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>foo<!>
24+
val test1: () -> Right = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!><!DEBUG_INFO_MISSING_UNRESOLVED!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>b<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>Int<!>>.<!DEBUG_INFO_MISSING_UNRESOLVED!>c<!><!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
2525
val test1a: () -> Right = a.b.c::foo
2626

27-
val test2: () -> Right = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!><!DEBUG_INFO_MISSING_UNRESOLVED!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>b<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>Int<!>>.<!DEBUG_INFO_MISSING_UNRESOLVED!>c<!><!>?::<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>foo<!>
27+
val test2: () -> Right = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!><!DEBUG_INFO_MISSING_UNRESOLVED!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>b<!><<!DEBUG_INFO_MISSING_UNRESOLVED!>Int<!>>.<!DEBUG_INFO_MISSING_UNRESOLVED!>c<!><!>?::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
2828
}
Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
1-
// !DIAGNOSTICS: -UNUSED_EXPRESSION
1+
// !DIAGNOSTICS: -UNUSED_EXPRESSION, -UNUSED_PARAMETER
22
class A
33

4-
fun main() {
4+
fun test1() {
55
val <!UNUSED_VARIABLE!>foo<!> = ::<!UNRESOLVED_REFERENCE!>foo<!>
6-
6+
77
::<!UNRESOLVED_REFERENCE!>bar<!>
8-
8+
99
A::<!UNRESOLVED_REFERENCE!>bar<!>
10-
11-
<!UNRESOLVED_REFERENCE!>B<!>::<!UNRESOLVED_REFERENCE!>bar<!>
10+
11+
<!UNRESOLVED_REFERENCE!>B<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>
1212
}
13+
14+
fun test2() {
15+
fun foo(x: Any) {}
16+
fun foo() {}
17+
18+
<!UNRESOLVED_REFERENCE!>Unresolved<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
19+
foo(<!UNRESOLVED_REFERENCE!>Unresolved<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>)
20+
foo(<!UNRESOLVED_REFERENCE!>Unresolved<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved<!>)
21+
::<!UNRESOLVED_REFERENCE!>unresolved<!>
22+
}

compiler/testData/diagnostics/tests/callableReference/function/unresolved.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package
22

3-
public fun main(): kotlin.Unit
3+
public fun test1(): kotlin.Unit
4+
public fun test2(): kotlin.Unit
45

56
public final class A {
67
public constructor A()

compiler/testData/diagnostics/tests/callableReference/packageInLhs.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
package foo
55

66
fun test() {
7-
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::test
7+
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
88
}
99

1010
// FILE: qualifiedName.kt
1111

1212
package foo.bar
1313

1414
fun test() {
15-
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::test
15+
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
1616
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// !DIAGNOSTICS: -UNUSED_EXPRESSION
22

33
fun test() {
4-
"a".<!ILLEGAL_SELECTOR!>"b"<!>::<!UNRESOLVED_REFERENCE!>foo<!>
4+
"a".<!ILLEGAL_SELECTOR!>"b"<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
55
"a".<!ILLEGAL_SELECTOR!>"b"<!>::class
6-
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::<!UNRESOLVED_REFERENCE!>foo<!>
6+
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
77
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::class
88
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
val unwrapped = <!UNRESOLVED_REFERENCE!>some<!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!><<!><!DEBUG_INFO_MISSING_UNRESOLVED!>sdf<!>()()<out <!DEBUG_INFO_MISSING_UNRESOLVED!>Any<!>>::<!UNRESOLVED_REFERENCE!>unwrap<!>
1+
val unwrapped = <!UNRESOLVED_REFERENCE!>some<!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!><<!><!DEBUG_INFO_MISSING_UNRESOLVED!>sdf<!>()()<out <!DEBUG_INFO_MISSING_UNRESOLVED!>Any<!>>::<!DEBUG_INFO_MISSING_UNRESOLVED!>unwrap<!>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
val unwrapped = <!UNRESOLVED_REFERENCE!>some<!>.<!SYNTAX!><<!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>cabc<!><!SYNTAX!>$Wrapper<!><out <!DEBUG_INFO_MISSING_UNRESOLVED!>Any<!>>::<!UNRESOLVED_REFERENCE!>unwrap<!>
1+
val unwrapped = <!UNRESOLVED_REFERENCE!>some<!>.<!SYNTAX!><<!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>cabc<!><!SYNTAX!>$Wrapper<!><out <!DEBUG_INFO_MISSING_UNRESOLVED!>Any<!>>::<!DEBUG_INFO_MISSING_UNRESOLVED!>unwrap<!>

compiler/testData/diagnostics/tests/regressions/kt13685.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22

33
fun foo() {
44
val <!UNUSED_VARIABLE!>text<!>: List<Any> = null!!
5-
text.<!UNRESOLVED_REFERENCE!>map<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>Any<!><!SYNTAX!>?<!>::<!UNRESOLVED_REFERENCE!>toString<!>
5+
text.<!UNRESOLVED_REFERENCE!>map<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>Any<!><!SYNTAX!>?<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>toString<!>
66
}

0 commit comments

Comments
 (0)