Synthetic properties: correct behaviour for method hierarchies

This commit is contained in:
Valentin Kipyatkov
2015-07-17 23:25:14 +03:00
parent 367e294452
commit 612c009f6b
19 changed files with 559 additions and 28 deletions
@@ -0,0 +1,29 @@
// FILE: KotlinFile.kt
open class KotlinClass {
public open fun getSomething1(): Int = 1
public open fun setSomething2(value: Int) {}
}
fun foo(javaClass: JavaClass) {
useInt(javaClass.getSomething1())
useInt(javaClass.<!UNRESOLVED_REFERENCE!>something1<!>)
javaClass.setSomething2(javaClass.getSomething2() + 1)
javaClass.something2 = javaClass.something2 + 1
}
fun useInt(<!UNUSED_PARAMETER!>i<!>: Int) {}
// FILE: JavaClass.java
public class JavaClass extends KotlinClass implements JavaInterface {
public int getSomething1() { return 1; }
public int getSomething2() { return 1; }
public void setSomething2(int value) {}
}
// FILE: JavaInterface.java
public class JavaInterface {
int getSomething2();
}
@@ -0,0 +1,31 @@
package
internal fun foo(/*0*/ javaClass: JavaClass): kotlin.Unit
internal fun useInt(/*0*/ i: kotlin.Int): kotlin.Unit
public open class JavaClass : KotlinClass, JavaInterface {
public constructor JavaClass()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun getSomething1(): kotlin.Int
public open override /*1*/ fun getSomething2(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ fun setSomething2(/*0*/ value: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class JavaInterface {
public constructor JavaInterface()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public/*package*/ open fun getSomething2(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal open class KotlinClass {
public constructor KotlinClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun getSomething1(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open fun setSomething2(/*0*/ value: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,52 @@
// FILE: KotlinFile.kt
abstract class KotlinClass : JavaClass(), KotlinInterface, JavaInterface {
override fun getSomething1(): Int = 1
override fun getSomething3(): String = ""
override fun setSomething4(value: String) {}
override fun getSomething5(): String = ""
}
interface KotlinInterface {
public fun getSomething1(): Int
public fun getSomething4(): String
}
fun foo(k: KotlinClass) {
useInt(k.getSomething1())
useInt(k.something1)
useInt(k.getSomething2())
useInt(k.something2)
useString(k.getSomething3())
useString(k.something3)
k.setSomething4("")
k.something4 += ""
k.setSomething4(<!NULL_FOR_NONNULL_TYPE!>null<!>)
k.something4 = null
useString(k.getSomething5())
useString(k.something5)
k.setSomething5(1)
k.something5 = <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>
}
fun useInt(<!UNUSED_PARAMETER!>i<!>: Int) {}
fun useString(<!UNUSED_PARAMETER!>i<!>: String) {}
// FILE: JavaClass.java
public class JavaClass {
public int getSomething1() { return 1; }
public int getSomething2() { return 1; }
public Object getSomething3() { return null; }
}
// FILE: JavaInterface.java
public interface JavaInterface {
String getSomething4();
void setSomething4(String value);
Object getSomething5();
void setSomething5(Object value);
}
@@ -0,0 +1,47 @@
package
internal fun foo(/*0*/ k: KotlinClass): kotlin.Unit
internal fun useInt(/*0*/ i: kotlin.Int): kotlin.Unit
internal fun useString(/*0*/ i: kotlin.String): kotlin.Unit
public open class JavaClass {
public constructor JavaClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun getSomething1(): kotlin.Int
public open fun getSomething2(): kotlin.Int
public open fun getSomething3(): kotlin.Any!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething4(): kotlin.String!
public abstract fun getSomething5(): kotlin.Any!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract fun setSomething4(/*0*/ value: kotlin.String!): kotlin.Unit
public abstract fun setSomething5(/*0*/ value: kotlin.Any!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal abstract class KotlinClass : JavaClass, KotlinInterface, JavaInterface {
public constructor KotlinClass()
public open override /*3*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ fun getSomething1(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun getSomething2(): kotlin.Int
public open override /*1*/ fun getSomething3(): kotlin.String
public abstract override /*2*/ /*fake_override*/ fun getSomething4(): kotlin.String!
public open override /*1*/ fun getSomething5(): kotlin.String
public open override /*3*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ fun setSomething4(/*0*/ value: kotlin.String): kotlin.Unit
public abstract override /*1*/ /*fake_override*/ fun setSomething5(/*0*/ value: kotlin.Any!): kotlin.Unit
public open override /*3*/ /*fake_override*/ fun toString(): kotlin.String
}
internal interface KotlinInterface {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething1(): kotlin.Int
public abstract fun getSomething4(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,25 @@
// FILE: KotlinFile.kt
abstract class KotlinClass : JavaInterface1, JavaInterface2 {
override fun getSomething(): String = ""
}
fun foo(k: KotlinClass) {
useString(k.getSomething())
useString(k.something)
if (<!SENSELESS_COMPARISON!>k.something == null<!>) return
k.setSomething(1)
<!VAL_REASSIGNMENT!>k.something<!> = <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>
}
fun useString(<!UNUSED_PARAMETER!>i<!>: String) {}
// FILE: JavaInterface1.java
public interface JavaInterface1 {
String getSomething();
}
// FILE: JavaInterface2.java
public interface JavaInterface2 {
void setSomething(int value);
}
@@ -0,0 +1,29 @@
package
public /*synthesized*/ fun JavaInterface1(/*0*/ function: () -> kotlin.String!): JavaInterface1
public /*synthesized*/ fun JavaInterface2(/*0*/ function: (kotlin.Int) -> kotlin.Unit): JavaInterface2
internal fun foo(/*0*/ k: KotlinClass): kotlin.Unit
internal fun useString(/*0*/ i: kotlin.String): kotlin.Unit
public interface JavaInterface1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface2 {
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 abstract fun setSomething(/*0*/ value: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal abstract class KotlinClass : JavaInterface1, JavaInterface2 {
public constructor KotlinClass()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun getSomething(): kotlin.String
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.Int): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,25 @@
// FILE: KotlinFile.kt
abstract class KotlinClass : JavaInterface1, JavaInterface2 {
override fun getSomething(): String = ""
}
fun foo(k: KotlinClass) {
useString(k.getSomething())
useString(k.something)
if (<!SENSELESS_COMPARISON!>k.something == null<!>) return
k.setSomething("")
<!VAL_REASSIGNMENT!>k.something<!> = ""
}
fun useString(<!UNUSED_PARAMETER!>i<!>: String) {}
// FILE: JavaInterface1.java
public interface JavaInterface1 {
String getSomething();
}
// FILE: JavaInterface2.java
public interface JavaInterface2 {
void setSomething(String value);
}
@@ -0,0 +1,29 @@
package
public /*synthesized*/ fun JavaInterface1(/*0*/ function: () -> kotlin.String!): JavaInterface1
public /*synthesized*/ fun JavaInterface2(/*0*/ function: (kotlin.String!) -> kotlin.Unit): JavaInterface2
internal fun foo(/*0*/ k: KotlinClass): kotlin.Unit
internal fun useString(/*0*/ i: kotlin.String): kotlin.Unit
public interface JavaInterface1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface2 {
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 abstract fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal abstract class KotlinClass : JavaInterface1, JavaInterface2 {
public constructor KotlinClass()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun getSomething(): kotlin.String
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,28 @@
// FILE: KotlinFile.kt
abstract class KotlinClass : JavaInterface3 {
override fun getSomething(): String = ""
}
fun foo(k: KotlinClass) {
useString(k.getSomething())
useString(k.something)
if (<!SENSELESS_COMPARISON!>k.something == null<!>) return
k.setSomething("")
<!VAL_REASSIGNMENT!>k.something<!> = ""
}
fun useString(<!UNUSED_PARAMETER!>i<!>: String) {}
// FILE: JavaInterface1.java
public interface JavaInterface1 {
String getSomething();
}
// FILE: JavaInterface2.java
public interface JavaInterface2 {
void setSomething(String value);
}
// FILE: JavaInterface3.java
public interface JavaInterface3 extends JavaInterface1, JavaInterface2 {}
@@ -0,0 +1,37 @@
package
public /*synthesized*/ fun JavaInterface1(/*0*/ function: () -> kotlin.String!): JavaInterface1
public /*synthesized*/ fun JavaInterface2(/*0*/ function: (kotlin.String!) -> kotlin.Unit): JavaInterface2
internal fun foo(/*0*/ k: KotlinClass): kotlin.Unit
internal fun useString(/*0*/ i: kotlin.String): kotlin.Unit
public interface JavaInterface1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface2 {
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 abstract fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface3 : JavaInterface1, JavaInterface2 {
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ /*fake_override*/ fun getSomething(): kotlin.String!
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
internal abstract class KotlinClass : JavaInterface3 {
public constructor KotlinClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun getSomething(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,29 @@
// FILE: KotlinFile.kt
abstract class KotlinClass : JavaInterface3 {
override fun getSomething(): String = ""
}
fun foo(k: KotlinClass) {
useString(k.getSomething())
useString(k.something)
if (<!SENSELESS_COMPARISON!>k.something == null<!>) return
k.setSomething("")
k.something = ""
}
fun useString(<!UNUSED_PARAMETER!>i<!>: String) {}
// FILE: JavaInterface1.java
public interface JavaInterface1 {
String getSomething();
}
// FILE: JavaInterface2.java
public interface JavaInterface2 {
String getSomething();
void setSomething(String value);
}
// FILE: JavaInterface3.java
public interface JavaInterface3 extends JavaInterface1, JavaInterface2 {}
@@ -0,0 +1,37 @@
package
public /*synthesized*/ fun JavaInterface1(/*0*/ function: () -> kotlin.String!): JavaInterface1
internal fun foo(/*0*/ k: KotlinClass): kotlin.Unit
internal fun useString(/*0*/ i: kotlin.String): kotlin.Unit
public interface JavaInterface1 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface2 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun getSomething(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface JavaInterface3 : JavaInterface1, JavaInterface2 {
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*2*/ /*fake_override*/ fun getSomething(): kotlin.String!
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}
internal abstract class KotlinClass : JavaInterface3 {
public constructor KotlinClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun getSomething(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.String!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,22 @@
// FILE: KotlinFile.kt
fun foo(o: JavaClass2) {
useString(o.something)
o.something = ""
o.setSomething(1)
o.something = <!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!> // we generate extension property for JavaClass2 with more specific type
o.something += "1"
}
fun useString(<!UNUSED_PARAMETER!>i<!>: String) {}
// FILE: JavaClass1.java
public class JavaClass1 {
public Object getSomething() { return null; }
public void setSomething(Object value) { }
}
// FILE: JavaClass2.java
public class JavaClass2 extends JavaClass1 {
public String getSomething() { return ""; }
}
@@ -0,0 +1,22 @@
package
internal fun foo(/*0*/ o: JavaClass2): kotlin.Unit
internal fun useString(/*0*/ i: kotlin.String): kotlin.Unit
public open class JavaClass1 {
public constructor JavaClass1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open fun getSomething(): kotlin.Any!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open fun setSomething(/*0*/ value: kotlin.Any!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class JavaClass2 : JavaClass1 {
public constructor JavaClass2()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ fun getSomething(): kotlin.String!
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun setSomething(/*0*/ value: kotlin.Any!): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}