Refine INSTANCE_ACCESS_BEFORE_SUPER_CALL check

- Detect usages of unitialized `this` as extension receiver argument
- Make it work within object literal created before super call

 #KT-9120 Fixed
 #KT-8289 Fixed
This commit is contained in:
Denis Zharkov
2015-12-17 16:49:11 +03:00
parent ba180f915a
commit 0d7c8635b3
17 changed files with 182 additions and 62 deletions
@@ -0,0 +1,15 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun A.foobar() = 3
class A {
fun foo() = 1
constructor(x: () -> Int)
constructor() : this(
{
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foo<!>() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this<!>.foo() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this@A<!>.foo() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foobar<!>()
})
}
@@ -0,0 +1,12 @@
package
public fun A.foobar(): kotlin.Int
public final class A {
public constructor A()
public constructor A(/*0*/ x: () -> kotlin.Int)
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,12 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun A.foobar() = 3
class A {
fun foo() = 1
constructor(x: Any?)
constructor() : this(object {
fun bar() = <!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foo<!>() + <!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this@A<!>.foo() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foobar<!>() + <!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>super@A<!>.hashCode()
})
}
@@ -0,0 +1,12 @@
package
public fun A.foobar(): kotlin.Int
public final class A {
public constructor A()
public constructor A(/*0*/ x: kotlin.Any?)
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,11 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun A.foobar() = 3
class A {
fun foo() = 1
constructor( x: Any = object {
fun bar() = <!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foo<!>() + <!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this@A<!>.foo() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foobar<!>()
})
}
@@ -0,0 +1,11 @@
package
public fun A.foobar(): kotlin.Int
public final class A {
public constructor A(/*0*/ x: kotlin.Any = ...)
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,15 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
fun A.foobar() = 1
val A.prop: Int get() = 2
class A {
constructor(x: Int)
constructor() : this(
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>foobar<!>() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this<!>.foobar() +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>prop<!> +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this<!>.prop +
<!INSTANCE_ACCESS_BEFORE_SUPER_CALL!>this@A<!>.prop
)
}
@@ -0,0 +1,12 @@
package
public val A.prop: kotlin.Int
public fun A.foobar(): kotlin.Int
public final class A {
public constructor A()
public constructor A(/*0*/ x: 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
}