Improve diagnostics on callable reference of unresolved class
#KT-10839 Fixed
This commit is contained in:
+9
-4
@@ -528,7 +528,9 @@ class DoubleColonExpressionResolver(
|
|||||||
resolvedCall?.resultingDescriptor ?: return null
|
resolvedCall?.resultingDescriptor ?: return null
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
context.trace.report(UNRESOLVED_REFERENCE.on(expression.callableReference, expression.callableReference))
|
if (lhs != null || expression.isEmptyLHS) {
|
||||||
|
context.trace.report(UNRESOLVED_REFERENCE.on(expression.callableReference, expression.callableReference))
|
||||||
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -680,10 +682,13 @@ class DoubleColonExpressionResolver(
|
|||||||
): OverloadResolutionResults<CallableDescriptor>? {
|
): OverloadResolutionResults<CallableDescriptor>? {
|
||||||
val reference = expression.callableReference
|
val reference = expression.callableReference
|
||||||
|
|
||||||
val lhsType =
|
val lhsType = lhs?.type
|
||||||
lhs?.type ?:
|
if (lhsType == null) {
|
||||||
return tryResolveRHSWithReceiver("resolve callable reference with empty LHS", null, reference, c, mode)
|
if (!expression.isEmptyLHS) return null
|
||||||
|
|
||||||
|
return tryResolveRHSWithReceiver("resolve callable reference with empty LHS", null, reference, c, mode)
|
||||||
?.apply { commitTrace() }?.results
|
?.apply { commitTrace() }?.results
|
||||||
|
}
|
||||||
|
|
||||||
val resultSequence = buildSequence {
|
val resultSequence = buildSequence {
|
||||||
when (lhs) {
|
when (lhs) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
class Foo {
|
class Foo {
|
||||||
fun bar() {}
|
fun bar() {}
|
||||||
fun f() = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::bar
|
fun f() = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
val f: () -> Unit = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::<!UNRESOLVED_REFERENCE!>foo<!>
|
val f: () -> Unit = <!UNRESOLVED_REFERENCE!>Unresolved<!>()::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ public final class Foo {
|
|||||||
public constructor Foo()
|
public constructor Foo()
|
||||||
public final fun bar(): kotlin.Unit
|
public final fun bar(): kotlin.Unit
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public final fun f(): kotlin.reflect.KFunction0<kotlin.Unit>
|
public final fun f(): [ERROR : Error function type]
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -26,8 +26,8 @@ class Test {
|
|||||||
fun <T> List<T>.testClassLiteral2() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS, EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>b<!>?::class
|
fun <T> List<T>.testClassLiteral2() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS, EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>b<!>?::class
|
||||||
fun <T> List<T>.testClassLiteral3() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS, EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>b<T, Any><!>::class
|
fun <T> List<T>.testClassLiteral3() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS, EXPRESSION_OF_NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>b<T, Any><!>::class
|
||||||
|
|
||||||
fun <T> List<T>.testUnresolved1() = <!UNRESOLVED_REFERENCE!>unresolved<!><T>::<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>foo<!>
|
fun <T> List<T>.testUnresolved1() = <!UNRESOLVED_REFERENCE!>unresolved<!><T>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
|
||||||
fun <T> List<T>.testUnresolved2() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!>a<<!UNRESOLVED_REFERENCE!>unresolved<!>><!>::foo
|
fun <T> List<T>.testUnresolved2() = <!RESERVED_SYNTAX_IN_CALLABLE_REFERENCE_LHS!>a<<!UNRESOLVED_REFERENCE!>unresolved<!>><!>::foo
|
||||||
fun <T> List<T>.testUnresolved3() = a<<!SYNTAX!><!>>::foo
|
fun <T> List<T>.testUnresolved3() = a<<!SYNTAX!><!>>::foo
|
||||||
fun <T> List<T>.testUnresolved4() = <!UNRESOLVED_REFERENCE!>unresolved<!>?::<!UNRESOLVED_REFERENCE_WRONG_RECEIVER!>foo<!>
|
fun <T> List<T>.testUnresolved4() = <!UNRESOLVED_REFERENCE!>unresolved<!>?::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
|
||||||
}
|
}
|
||||||
+2
-2
@@ -21,8 +21,8 @@ class Test {
|
|||||||
|
|
||||||
val Int.c: Int get() = 42
|
val Int.c: Int get() = 42
|
||||||
|
|
||||||
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<!>
|
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<!>
|
||||||
val test1a: () -> Right = a.b.c::foo
|
val test1a: () -> Right = a.b.c::foo
|
||||||
|
|
||||||
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<!>
|
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<!>
|
||||||
}
|
}
|
||||||
+16
-6
@@ -1,12 +1,22 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION, -UNUSED_PARAMETER
|
||||||
class A
|
class A
|
||||||
|
|
||||||
fun main() {
|
fun test1() {
|
||||||
val <!UNUSED_VARIABLE!>foo<!> = ::<!UNRESOLVED_REFERENCE!>foo<!>
|
val <!UNUSED_VARIABLE!>foo<!> = ::<!UNRESOLVED_REFERENCE!>foo<!>
|
||||||
|
|
||||||
::<!UNRESOLVED_REFERENCE!>bar<!>
|
::<!UNRESOLVED_REFERENCE!>bar<!>
|
||||||
|
|
||||||
A::<!UNRESOLVED_REFERENCE!>bar<!>
|
A::<!UNRESOLVED_REFERENCE!>bar<!>
|
||||||
|
|
||||||
<!UNRESOLVED_REFERENCE!>B<!>::<!UNRESOLVED_REFERENCE!>bar<!>
|
<!UNRESOLVED_REFERENCE!>B<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>bar<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun test2() {
|
||||||
|
fun foo(x: Any) {}
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
<!UNRESOLVED_REFERENCE!>Unresolved<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
|
||||||
|
foo(<!UNRESOLVED_REFERENCE!>Unresolved<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>)
|
||||||
|
foo(<!UNRESOLVED_REFERENCE!>Unresolved<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>unresolved<!>)
|
||||||
|
::<!UNRESOLVED_REFERENCE!>unresolved<!>
|
||||||
|
}
|
||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public fun main(): kotlin.Unit
|
public fun test1(): kotlin.Unit
|
||||||
|
public fun test2(): kotlin.Unit
|
||||||
|
|
||||||
public final class A {
|
public final class A {
|
||||||
public constructor A()
|
public constructor A()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
package foo
|
package foo
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::test
|
<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>foo<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
// FILE: qualifiedName.kt
|
// FILE: qualifiedName.kt
|
||||||
@@ -12,5 +12,5 @@ fun test() {
|
|||||||
package foo.bar
|
package foo.bar
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::test
|
foo.<!EXPRESSION_EXPECTED_PACKAGE_FOUND!>bar<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>test<!>
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
"a".<!ILLEGAL_SELECTOR!>"b"<!>::<!UNRESOLVED_REFERENCE!>foo<!>
|
"a".<!ILLEGAL_SELECTOR!>"b"<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
|
||||||
"a".<!ILLEGAL_SELECTOR!>"b"<!>::class
|
"a".<!ILLEGAL_SELECTOR!>"b"<!>::class
|
||||||
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::<!UNRESOLVED_REFERENCE!>foo<!>
|
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>foo<!>
|
||||||
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::class
|
"a".<!ILLEGAL_SELECTOR!>"b"<!>.<!ILLEGAL_SELECTOR!>"c"<!>::class
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-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<!>
|
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<!>
|
||||||
+1
-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<!>
|
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<!>
|
||||||
@@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
val <!UNUSED_VARIABLE!>text<!>: List<Any> = null!!
|
val <!UNUSED_VARIABLE!>text<!>: List<Any> = null!!
|
||||||
text.<!UNRESOLVED_REFERENCE!>map<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>Any<!><!SYNTAX!>?<!>::<!UNRESOLVED_REFERENCE!>toString<!>
|
text.<!UNRESOLVED_REFERENCE!>map<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>Any<!><!SYNTAX!>?<!>::<!DEBUG_INFO_MISSING_UNRESOLVED!>toString<!>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user