Implicit receiver smart casts implementation and highlighting

This commit is contained in:
Mikhail Glukhikh
2015-11-09 15:18:37 +03:00
parent 03287d5d66
commit 811ba8110f
17 changed files with 175 additions and 8 deletions
@@ -25,7 +25,7 @@ fun <T : String?> T.foo() {
<!UNSAFE_CALL!>length<!>
if (this is String) {
length
<!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>length<!>
this<!UNNECESSARY_SAFE_CALL!>?.<!>length
bar1()
@@ -9,7 +9,7 @@ fun A?.bar() {
if (this == null) {
return
}
foo()
<!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>foo<!>()
}
fun A.baz() {
@@ -0,0 +1,15 @@
open class SuperFoo {
public fun bar(): String {
if (this is Foo) {
<!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>superFoo<!>()
return baz()
}
return baz()
}
public fun baz() = "OK"
}
class Foo : SuperFoo() {
public fun superFoo() {}
}
@@ -0,0 +1,20 @@
package
public final class Foo : SuperFoo {
public constructor Foo()
public final override /*1*/ /*fake_override*/ fun bar(): kotlin.String
public final override /*1*/ /*fake_override*/ fun baz(): kotlin.String
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 final fun superFoo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class SuperFoo {
public constructor SuperFoo()
public final fun bar(): kotlin.String
public final fun baz(): kotlin.String
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,24 @@
open class A {
class B : A() {
val a = "FAIL"
}
fun foo(): String {
if (this is B) return <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>a<!>
return "OK"
}
}
fun A?.bar() {
if (this != null) <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>foo<!>()
}
fun A.gav() = if (this is A.B) <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>a<!> else ""
class C {
fun A?.complex(): String {
if (this is A.B) return <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>a<!>
else if (this != null) return <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>foo<!>()
else return ""
}
}
@@ -0,0 +1,29 @@
package
public fun A?.bar(): kotlin.Unit
public fun A.gav(): kotlin.String
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final class B : A {
public constructor B()
public final val a: kotlin.String = "FAIL"
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final override /*1*/ /*fake_override*/ fun foo(): kotlin.String
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
public final fun A?.complex(): kotlin.String
}
@@ -0,0 +1,11 @@
open class A {
open fun foo() = "FAIL"
fun bar() = if (this is C) <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>foo<!>() else "FAIL"
}
open class B : A()
open class C : B() {
override fun foo() = "OK"
}
@@ -0,0 +1,28 @@
package
public open class A {
public constructor A()
public final fun bar(): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class B : A {
public constructor B()
public final override /*1*/ /*fake_override*/ fun bar(): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class C : B {
public constructor C()
public final override /*1*/ /*fake_override*/ fun bar(): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,8 +1,8 @@
// FILE: KotlinFile.kt
fun Any.foo(): Int {
if (this is JavaClass) {
something++
return x
<!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>something<!>++
return <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>x<!>
}
return 0
}