Detect and report inner classes capturing script instance

This commit is contained in:
Ilya Chernikov
2021-12-09 13:55:44 +01:00
committed by TeamCityServer
parent e865652602
commit c1c94778ce
18 changed files with 306 additions and 16 deletions
@@ -5,7 +5,7 @@
// KT-19423
val used = "abc"
class User {
val property = used // error: Expression is inaccessible from a nested class
val property = used
}
val rv = User().property
@@ -0,0 +1,15 @@
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// expected: rv: abcabc
// KT-19423 variation
val used = "abc"
inner class Outer {
val middle = used
inner class User {
val property = used
}
}
val rv = Outer().User().property + Outer().middle
@@ -0,0 +1,16 @@
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// IGNORE_BACKEND: JVM, JVM_IR
// expected: rv: abcabc
// KT-19423 variation
val used = "abc"
class Outer {
val middle = used
class User {
val property = used
}
}
val rv = Outer.User().property + Outer().middle
@@ -0,0 +1,15 @@
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// IGNORE_BACKEND: JVM, JVM_IR
// expected: rv: abc
// KT-19423 variation
val used = "abc"
class Outer {
class User {
val property = used
}
}
val rv = Outer.User().property
@@ -0,0 +1,15 @@
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// expected: rv: abc!
// KT-19423 variation
val used = "abc"
class Outer {
val bang = "!"
inner class User {
val property = used + bang
}
}
val rv = Outer().User().property
@@ -0,0 +1,15 @@
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// IGNORE_BACKEND: JVM, JVM_IR
// expected: rv: abc
// KT-19423 variation
val used = "abc"
object Outer {
class User {
val property = used
}
}
val rv = Outer.User().property
@@ -0,0 +1,12 @@
// !RENDER_DIAGNOSTICS_FULL_TEXT
// TARGET_BACKEND: JVM_IR
// KT-19423 variation
val used = "abc"
class Outer {
val middle = used
<!SCRIPT_CAPTURING_NESTED_CLASS!>class User {
val property = used
}<!>
}
@@ -0,0 +1,26 @@
package
public final class NestedAndOuterClassesCaptureProperty : kotlin.script.templates.standard.ScriptTemplateWithArgs {
public constructor NestedAndOuterClassesCaptureProperty(/*0*/ args: kotlin.Array<kotlin.String>)
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
public final val used: kotlin.String = "abc"
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 Outer {
public constructor Outer()
public final val middle: kotlin.String = "abc"
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 User {
public constructor User()
public final val property: kotlin.String = "abc"
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,11 @@
// !RENDER_DIAGNOSTICS_FULL_TEXT
// TARGET_BACKEND: JVM_IR
// KT-19423 variation
val used = "abc"
class Outer {
<!SCRIPT_CAPTURING_NESTED_CLASS!>class User {
val property = used
}<!>
}
@@ -0,0 +1,25 @@
package
public final class NestedClassCapturesProperty : kotlin.script.templates.standard.ScriptTemplateWithArgs {
public constructor NestedClassCapturesProperty(/*0*/ args: kotlin.Array<kotlin.String>)
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
public final val used: kotlin.String = "abc"
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 Outer {
public constructor Outer()
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 User {
public constructor User()
public final val property: kotlin.String = "abc"
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,11 @@
// !RENDER_DIAGNOSTICS_FULL_TEXT
// TARGET_BACKEND: JVM_IR
// KT-19423 variation
val used = "abc"
object Outer {
<!SCRIPT_CAPTURING_NESTED_CLASS!>class User {
val property = used
}<!>
}
@@ -0,0 +1,25 @@
package
public final class NestedToObjectClassCapturesProperty : kotlin.script.templates.standard.ScriptTemplateWithArgs {
public constructor NestedToObjectClassCapturesProperty(/*0*/ args: kotlin.Array<kotlin.String>)
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
public final val used: kotlin.String = "abc"
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 object Outer {
private constructor Outer()
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 User {
public constructor User()
public final val property: kotlin.String = "abc"
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
}
}
}