Support for new double colon expressions in type checker

Despite the fact that the LHS of a double colon expression is now KtExpression
instead of KtUserType, we must still consider it a type for callable references
to work. Extract and reuse relevant parts of QualifiedExpressionResolver and
TypeResolver to support this behavior
This commit is contained in:
Alexander Udalov
2016-04-21 18:44:07 +03:00
parent b5388d6a43
commit 693c753988
16 changed files with 445 additions and 107 deletions
@@ -0,0 +1,24 @@
// MODULE: m1
// FILE: 1.kt
package a
class b {
class c
}
// MODULE: m2
// FILE: 2.kt
package a.b
class c {
fun foo() {}
}
// MODULE: m3(m1, m2)
// FILE: test.kt
package test
fun test() = a.b.c::foo
@@ -0,0 +1,61 @@
// -- Module: <m1> --
package
package a {
public final class b {
public constructor b()
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
public final class c {
public constructor c()
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
}
}
}
// -- Module: <m2> --
package
package a {
package a.b {
public final class c {
public constructor c()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
// -- Module: <m3> --
package
package a {
public final class b {
// -- Module: <m1> --
}
package a.b {
public final class c {
// -- Module: <m2> --
}
}
}
package test {
public fun test(): kotlin.reflect.KFunction1<a.b.c, kotlin.Unit>
}
@@ -0,0 +1,16 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION
// FILE: simpleName.kt
package foo
fun test() {
<!UNRESOLVED_REFERENCE!>foo<!>::test
}
// FILE: qualifiedName.kt
package foo.bar
fun test() {
foo.<!UNRESOLVED_REFERENCE!>bar<!>::test
}
@@ -0,0 +1,9 @@
package
package foo {
public fun test(): kotlin.Unit
package foo.bar {
public fun test(): kotlin.Unit
}
}
@@ -0,0 +1,9 @@
package test
class Foo {
fun <T> bar(x: Int) = x
}
fun test() {
Foo::<!TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!> <!SYNTAX!>< <!DEBUG_INFO_MISSING_UNRESOLVED!>Int<!> ><!> <!SYNTAX!>(2 <!DEBUG_INFO_MISSING_UNRESOLVED!>+<!> 2)<!>
}
@@ -0,0 +1,13 @@
package
package test {
public fun test(): kotlin.Unit
public final class Foo {
public constructor Foo()
public final fun </*0*/ T> bar(/*0*/ x: kotlin.Int): kotlin.Int
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
}
}
@@ -0,0 +1,16 @@
// !CHECK_TYPE
class Foo
fun Foo?.bar() {}
fun test() {
val r1 = Foo ?:: bar
checkSubtype<(Foo?) -> Unit>(r1)
val r2 = Foo ? :: bar
checkSubtype<(Foo?) -> Unit>(r2)
val r3 = Foo ? ? :: bar
checkSubtype<(Foo?) -> Unit>(r3)
}
@@ -0,0 +1,11 @@
package
public fun test(): kotlin.Unit
public fun Foo?.bar(): kotlin.Unit
public final class Foo {
public constructor Foo()
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
}