K2: add checker detecting protected Java field shadowed by a property
This commit is contained in:
committed by
teamcity
parent
6234da4c86
commit
949a39b80f
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
// FILE: A.java
|
||||
|
||||
package base;
|
||||
|
||||
class A {
|
||||
public String f = "OK";
|
||||
}
|
||||
|
||||
// FILE: B.kt
|
||||
|
||||
package base
|
||||
|
||||
open class B : <!EXPOSED_SUPER_CLASS!>A<!>() {
|
||||
private val f = "FAIL"
|
||||
}
|
||||
|
||||
// FILE: C.java
|
||||
|
||||
import base.B;
|
||||
|
||||
public class C extends B {}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun box(): String {
|
||||
return C().f
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
// FILE: A.java
|
||||
|
||||
package base;
|
||||
|
||||
class A {
|
||||
public String f = "OK";
|
||||
}
|
||||
|
||||
// FILE: B.kt
|
||||
|
||||
package base
|
||||
|
||||
open class B : <!EXPOSED_SUPER_CLASS!>A()<!> {
|
||||
private val f = "FAIL"
|
||||
}
|
||||
|
||||
// FILE: C.java
|
||||
|
||||
import base.B;
|
||||
|
||||
public class C extends B {}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun box(): String {
|
||||
return C().f
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package
|
||||
|
||||
public fun box(): kotlin.String
|
||||
|
||||
public open class C : base.B {
|
||||
public constructor C()
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val f: kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ var f: 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
|
||||
}
|
||||
|
||||
package base {
|
||||
|
||||
public/*package*/ open class A {
|
||||
public/*package*/ constructor A()
|
||||
public final var f: 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
|
||||
}
|
||||
|
||||
public open class B : base.A {
|
||||
public constructor B()
|
||||
private final val f: kotlin.String = "FAIL"
|
||||
public final override /*1*/ /*fake_override*/ var f: 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
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
// FILE: A.java
|
||||
|
||||
package base;
|
||||
|
||||
public class A {
|
||||
String f = "OK";
|
||||
}
|
||||
|
||||
// FILE: B.kt
|
||||
|
||||
package base
|
||||
|
||||
open class B : A() {
|
||||
private val f = "FAIL"
|
||||
}
|
||||
|
||||
// FILE: C.java
|
||||
|
||||
import base.B;
|
||||
|
||||
public class C extends B {}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun box(): String {
|
||||
return C().<!INVISIBLE_REFERENCE!>f<!>
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
// FILE: A.java
|
||||
|
||||
package base;
|
||||
|
||||
public class A {
|
||||
String f = "OK";
|
||||
}
|
||||
|
||||
// FILE: B.kt
|
||||
|
||||
package base
|
||||
|
||||
open class B : A() {
|
||||
private val f = "FAIL"
|
||||
}
|
||||
|
||||
// FILE: C.java
|
||||
|
||||
import base.B;
|
||||
|
||||
public class C extends B {}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun box(): String {
|
||||
return C().<!INVISIBLE_MEMBER!>f<!>
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
package
|
||||
|
||||
public fun box(): kotlin.String
|
||||
|
||||
public open class C : base.B {
|
||||
public constructor C()
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val f: kotlin.String
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var f: 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
|
||||
}
|
||||
|
||||
package base {
|
||||
|
||||
public open class A {
|
||||
public constructor A()
|
||||
public/*package*/ final var f: 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
|
||||
}
|
||||
|
||||
public open class B : base.A {
|
||||
public constructor B()
|
||||
private final val f: kotlin.String = "FAIL"
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var f: 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
|
||||
}
|
||||
}
|
||||
Vendored
+94
@@ -0,0 +1,94 @@
|
||||
// FILE: BaseJava.java
|
||||
|
||||
package base;
|
||||
|
||||
public class BaseJava {
|
||||
protected String a = "TARGET";
|
||||
|
||||
String b = "";
|
||||
}
|
||||
|
||||
class DerivedJava extends BaseKotlin {
|
||||
protected String a = "";
|
||||
}
|
||||
|
||||
// FILE: Base.kt
|
||||
|
||||
package base
|
||||
|
||||
abstract class BaseKotlin
|
||||
|
||||
open class Intermediate : BaseJava() {
|
||||
private val a = ""
|
||||
}
|
||||
|
||||
class Derived : Intermediate() {
|
||||
fun foo() = this::a // Same package
|
||||
}
|
||||
|
||||
private class DerivedFromDerivedJava : DerivedJava() {
|
||||
fun foo() = this::a // Property class is a subclass of the field class
|
||||
}
|
||||
|
||||
// FILE: Derived.kt
|
||||
|
||||
package derived
|
||||
|
||||
import base.BaseJava
|
||||
|
||||
open class Intermediate : BaseJava() {
|
||||
private val a = ""
|
||||
|
||||
private val b = ""
|
||||
}
|
||||
|
||||
open class IntermediateWithoutField : BaseJava() {
|
||||
private val a get() = ""
|
||||
}
|
||||
|
||||
open class IntermediatePublic : BaseJava() {
|
||||
val a = ""
|
||||
}
|
||||
|
||||
class Derived : Intermediate() {
|
||||
// This should be the first erroneous place (only in K2)
|
||||
fun foo() = this::<!JAVA_SHADOWED_PROTECTED_FIELD_REFERENCE!>a<!>
|
||||
|
||||
fun bar() = a // Non-reference
|
||||
|
||||
fun baz() = this::<!UNRESOLVED_REFERENCE!>b<!> // Non-protected
|
||||
}
|
||||
|
||||
typealias Alias = Intermediate
|
||||
|
||||
class DerivedAlias : Alias() {
|
||||
// This should be the second erroneous place (only in K2)
|
||||
fun foo() = this::<!JAVA_SHADOWED_PROTECTED_FIELD_REFERENCE!>a<!>
|
||||
}
|
||||
|
||||
fun local() {
|
||||
open class LocalIntermediate : BaseJava() {
|
||||
private val a = ""
|
||||
}
|
||||
|
||||
class LocalDerived : LocalIntermediate() {
|
||||
// This should be the third and the last erroneous place (only in K2)
|
||||
fun foo() = this::<!JAVA_SHADOWED_PROTECTED_FIELD_REFERENCE!>a<!>
|
||||
}
|
||||
}
|
||||
|
||||
class DerivedWithoutBackingField : IntermediateWithoutField() {
|
||||
fun foo() = this::a // No shadowing backing field
|
||||
}
|
||||
|
||||
class DerivedPublic : IntermediatePublic() {
|
||||
fun foo() = this::a // Visible property
|
||||
}
|
||||
|
||||
class DirectlyDerived : BaseJava() {
|
||||
fun foo() = this::a // No property at all
|
||||
}
|
||||
|
||||
fun test(d: Derived) {
|
||||
d::<!UNRESOLVED_REFERENCE!>a<!> // Field is also invisible
|
||||
}
|
||||
Vendored
+94
@@ -0,0 +1,94 @@
|
||||
// FILE: BaseJava.java
|
||||
|
||||
package base;
|
||||
|
||||
public class BaseJava {
|
||||
protected String a = "TARGET";
|
||||
|
||||
String b = "";
|
||||
}
|
||||
|
||||
class DerivedJava extends BaseKotlin {
|
||||
protected String a = "";
|
||||
}
|
||||
|
||||
// FILE: Base.kt
|
||||
|
||||
package base
|
||||
|
||||
abstract class BaseKotlin
|
||||
|
||||
open class Intermediate : BaseJava() {
|
||||
private val a = ""
|
||||
}
|
||||
|
||||
class Derived : Intermediate() {
|
||||
fun foo() = this::a // Same package
|
||||
}
|
||||
|
||||
private class DerivedFromDerivedJava : DerivedJava() {
|
||||
fun foo() = this::a // Property class is a subclass of the field class
|
||||
}
|
||||
|
||||
// FILE: Derived.kt
|
||||
|
||||
package derived
|
||||
|
||||
import base.BaseJava
|
||||
|
||||
open class Intermediate : BaseJava() {
|
||||
private val a = ""
|
||||
|
||||
private val b = ""
|
||||
}
|
||||
|
||||
open class IntermediateWithoutField : BaseJava() {
|
||||
private val a get() = ""
|
||||
}
|
||||
|
||||
open class IntermediatePublic : BaseJava() {
|
||||
val a = ""
|
||||
}
|
||||
|
||||
class Derived : Intermediate() {
|
||||
// This should be the first erroneous place (only in K2)
|
||||
fun foo() = this::a
|
||||
|
||||
fun bar() = a // Non-reference
|
||||
|
||||
fun baz() = this::<!INVISIBLE_MEMBER!>b<!> // Non-protected
|
||||
}
|
||||
|
||||
typealias Alias = Intermediate
|
||||
|
||||
class DerivedAlias : Alias() {
|
||||
// This should be the second erroneous place (only in K2)
|
||||
fun foo() = this::a
|
||||
}
|
||||
|
||||
fun local() {
|
||||
open class LocalIntermediate : BaseJava() {
|
||||
private val a = ""
|
||||
}
|
||||
|
||||
class LocalDerived : LocalIntermediate() {
|
||||
// This should be the third and the last erroneous place (only in K2)
|
||||
fun foo() = this::a
|
||||
}
|
||||
}
|
||||
|
||||
class DerivedWithoutBackingField : IntermediateWithoutField() {
|
||||
fun foo() = this::a // No shadowing backing field
|
||||
}
|
||||
|
||||
class DerivedPublic : IntermediatePublic() {
|
||||
fun foo() = this::a // Visible property
|
||||
}
|
||||
|
||||
class DirectlyDerived : BaseJava() {
|
||||
fun foo() = this::a // No property at all
|
||||
}
|
||||
|
||||
fun test(d: Derived) {
|
||||
d::<!INVISIBLE_MEMBER!>a<!> // Field is also invisible
|
||||
}
|
||||
Vendored
+153
@@ -0,0 +1,153 @@
|
||||
package
|
||||
|
||||
package base {
|
||||
|
||||
public open class BaseJava {
|
||||
public constructor BaseJava()
|
||||
protected/*protected and package*/ final var a: kotlin.String!
|
||||
public/*package*/ final var b: 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
|
||||
}
|
||||
|
||||
public abstract class BaseKotlin {
|
||||
public constructor BaseKotlin()
|
||||
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 Derived : base.Intermediate {
|
||||
public constructor Derived()
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val a: kotlin.String
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var b: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<kotlin.String!>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
private final class DerivedFromDerivedJava : base.DerivedJava {
|
||||
public constructor DerivedFromDerivedJava()
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<kotlin.String!>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public/*package*/ open class DerivedJava : base.BaseKotlin {
|
||||
public/*package*/ constructor DerivedJava()
|
||||
protected/*protected and package*/ final var a: 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
|
||||
}
|
||||
|
||||
public open class Intermediate : base.BaseJava {
|
||||
public constructor Intermediate()
|
||||
private final val a: kotlin.String = ""
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var b: 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
|
||||
}
|
||||
}
|
||||
|
||||
package derived {
|
||||
public fun local(): kotlin.Unit
|
||||
public fun test(/*0*/ d: derived.Derived): kotlin.Unit
|
||||
|
||||
public final class Derived : derived.Intermediate {
|
||||
public constructor Derived()
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val a: kotlin.String
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val b: kotlin.String
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: kotlin.String!
|
||||
public final fun bar(): kotlin.String!
|
||||
public final fun baz(): kotlin.reflect.KMutableProperty0<kotlin.String!>
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<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 DerivedAlias : derived.Alias /* = derived.Intermediate */ {
|
||||
public constructor DerivedAlias()
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val a: kotlin.String
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val b: kotlin.String
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<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 DerivedPublic : derived.IntermediatePublic {
|
||||
public constructor DerivedPublic()
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
public final override /*1*/ /*fake_override*/ val a: kotlin.String
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<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 DerivedWithoutBackingField : derived.IntermediateWithoutField {
|
||||
public constructor DerivedWithoutBackingField()
|
||||
invisible_fake final override /*1*/ /*fake_override*/ val a: kotlin.String
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<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 DirectlyDerived : base.BaseJava {
|
||||
public constructor DirectlyDerived()
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: kotlin.String!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(): kotlin.reflect.KMutableProperty0<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 Intermediate : base.BaseJava {
|
||||
public constructor Intermediate()
|
||||
private final val a: kotlin.String = ""
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
private final val b: kotlin.String = ""
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: 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
|
||||
}
|
||||
|
||||
public open class IntermediatePublic : base.BaseJava {
|
||||
public constructor IntermediatePublic()
|
||||
public final val a: kotlin.String = ""
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: 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
|
||||
}
|
||||
|
||||
public open class IntermediateWithoutField : base.BaseJava {
|
||||
public constructor IntermediateWithoutField()
|
||||
private final val a: kotlin.String
|
||||
protected/*protected and package*/ final override /*1*/ /*fake_override*/ var a: kotlin.String!
|
||||
invisible_fake final override /*1*/ /*fake_override*/ var b: 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
|
||||
}
|
||||
public typealias Alias = derived.Intermediate
|
||||
}
|
||||
Reference in New Issue
Block a user