[FIR] Don't smartcast variables to invisible types
#KT-44802 Fixed
This commit is contained in:
+53
@@ -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()
|
||||
}
|
||||
+53
@@ -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()
|
||||
}
|
||||
+39
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
+43
@@ -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()
|
||||
}
|
||||
+43
@@ -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<!>()
|
||||
}
|
||||
+39
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user