[FIR] Don't smartcast variables to invisible types

#KT-44802 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-02-18 11:19:08 +03:00
parent 026efca49f
commit 1c0d862e40
24 changed files with 521 additions and 17 deletions
@@ -0,0 +1,53 @@
// ISSUE: KT-44802
// INFERENCE_HELPERS
// FILE: foo/PackagePrivateInterface.java
package foo;
interface PackagePrivateInterface {
default void foo() {}
}
// FILE: foo/A.java
package foo;
public class A implements PackagePrivateInterface {}
// FILE: foo/B.java
package foo;
public class B implements PackagePrivateInterface {}
// FILE: differentPackage.kt
package bar
import foo.A
import foo.B
import select
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PackagePrivateInterface")!>select(a, b)<!>
x.foo()
}
// FILE: samePackage.kt
package foo
import select
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & foo.PackagePrivateInterface")!>x<!>.foo()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PackagePrivateInterface")!>select(a, b)<!>
x.foo()
}
@@ -0,0 +1,53 @@
// ISSUE: KT-44802
// INFERENCE_HELPERS
// FILE: foo/PackagePrivateInterface.java
package foo;
interface PackagePrivateInterface {
default void foo() {}
}
// FILE: foo/A.java
package foo;
public class A implements PackagePrivateInterface {}
// FILE: foo/B.java
package foo;
public class B implements PackagePrivateInterface {}
// FILE: differentPackage.kt
package bar
import foo.A
import foo.B
import select
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PackagePrivateInterface"), INACCESSIBLE_TYPE!>select(a, b)<!>
<!INACCESSIBLE_TYPE!>x<!>.<!INVISIBLE_MEMBER!>foo<!>()
}
// FILE: samePackage.kt
package foo
import select
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PackagePrivateInterface")!>select(a, b)<!>
x.foo()
}
@@ -0,0 +1,39 @@
package
public fun </*0*/ K> id(/*0*/ x: K): K
public fun </*0*/ K> materialize(): K
public fun </*0*/ K> select(/*0*/ vararg values: K /*kotlin.Array<out K>*/): K
package bar {
public fun testInference(/*0*/ a: foo.A, /*1*/ b: foo.B): kotlin.Unit
public fun testSmartcast(/*0*/ x: kotlin.Any): kotlin.Unit
}
package foo {
public fun testInference(/*0*/ a: foo.A, /*1*/ b: foo.B): kotlin.Unit
public fun testSmartcast(/*0*/ x: kotlin.Any): kotlin.Unit
public open class A : foo.PackagePrivateInterface {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class B : foo.PackagePrivateInterface {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ interface PackagePrivateInterface {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -0,0 +1,43 @@
// INFERENCE_HELPERS
// ISSUE: KT-44802
// FILE: a.kt
package foo
import select
private interface PrivateInterface {
fun foo() {}
}
class A : PrivateInterface
class B : PrivateInterface
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & foo.PrivateInterface")!>x<!>.foo()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PrivateInterface")!>select(a, b)<!>
x.foo()
}
// FILE: main.kt
package bar
import foo.A
import foo.B
import select
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PrivateInterface")!>select(a, b)<!>
x.foo()
}
@@ -0,0 +1,43 @@
// INFERENCE_HELPERS
// ISSUE: KT-44802
// FILE: a.kt
package foo
import select
private interface PrivateInterface {
fun foo() {}
}
class A : PrivateInterface
class B : PrivateInterface
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PrivateInterface")!>select(a, b)<!>
x.foo()
}
// FILE: main.kt
package bar
import foo.A
import foo.B
import select
fun testSmartcast(x: Any) {
if (x is A || x is B) {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>x<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
fun testInference(a: A, b: B) {
val x = <!DEBUG_INFO_EXPRESSION_TYPE("foo.PrivateInterface")!>select(a, b)<!>
x.<!INVISIBLE_MEMBER!>foo<!>()
}
@@ -0,0 +1,39 @@
package
public fun </*0*/ K> id(/*0*/ x: K): K
public fun </*0*/ K> materialize(): K
public fun </*0*/ K> select(/*0*/ vararg values: K /*kotlin.Array<out K>*/): K
package bar {
public fun testInference(/*0*/ a: foo.A, /*1*/ b: foo.B): kotlin.Unit
public fun testSmartcast(/*0*/ x: kotlin.Any): kotlin.Unit
}
package foo {
public fun testInference(/*0*/ a: foo.A, /*1*/ b: foo.B): kotlin.Unit
public fun testSmartcast(/*0*/ x: kotlin.Any): kotlin.Unit
public final class A : foo.PrivateInterface {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class B : foo.PrivateInterface {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
private interface PrivateInterface {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}