Disallow extension properties with backing fields

#KT-1682 Fixed
This commit is contained in:
Alexander Udalov
2014-05-28 19:17:31 +04:00
parent ea31f372aa
commit d78d4bc44c
72 changed files with 297 additions and 578 deletions
@@ -0,0 +1,21 @@
class A {
var result = "Fail"
private var Int.foo: String
get() = result
private set(value) {
result = value
}
fun run(): String {
class O {
fun run() {
42.foo = "OK"
}
}
O().run()
return (-42).foo
}
}
fun box() = A().run()
@@ -1,11 +1,12 @@
class Test {
val Int.foo: String = "OK"
val Int.foo: String
get() = "OK"
fun test(): String {
return 1.foo
}
fun test(): String {
return 1.foo
}
}
fun box(): String {
return Test().test()
}
return Test().test()
}
@@ -1,16 +1,28 @@
class Test {
var Double.fooDouble: String = "fail"
var Long.fooLong: String = "fail"
var doubleStorage = "fail"
var longStorage = "fail"
fun test(): String {
val d = 1.0
d.fooDouble = "O"
val l = 1.toLong()
l.fooLong = "K"
return d.fooDouble + l.fooLong
}
var Double.foo: String
get() = doubleStorage
set(value) {
doubleStorage = value
}
var Long.bar: String
get() = longStorage
set(value) {
longStorage = value
}
fun test(): String {
val d = 1.0
d.foo = "O"
val l = 1L
l.bar = "K"
return d.foo + l.bar
}
}
fun box(): String {
return Test().test()
}
return Test().test()
}
@@ -1,13 +0,0 @@
class Test {
var Int.foo: String = "fail"
fun test(): String {
val i = 1
i.foo = "OK"
return i.foo
}
}
fun box(): String {
return Test().test()
}
@@ -1,15 +1,14 @@
class Test {
val Int.foo: String = "OK"
get() {
val a = $foo
return "OK"
}
val Int.foo: String
get() {
return "OK"
}
fun test(): String {
return 1.foo
}
fun test(): String {
return 1.foo
}
}
fun box(): String {
return Test().test()
}
return Test().test()
}
@@ -1,15 +1,14 @@
class Test {
private val Int.foo: String = "OK"
get() {
val a = $foo
return "OK"
}
private val Int.foo: String
get() {
return "OK"
}
fun test(): String {
return 1.foo
}
fun test(): String {
return 1.foo
}
}
fun box(): String {
return Test().test()
}
return Test().test()
}
@@ -1,16 +1,19 @@
class Test {
var Int.foo: String = "OK"
private set(str: String) {
$foo = str
}
var storage = "Fail"
fun test(): String {
val i = 1
i.foo = "OK"
return i.foo
}
var Int.foo: String
get() = storage
private set(str: String) {
storage = str
}
fun test(): String {
val i = 1
i.foo = "OK"
return i.foo
}
}
fun box(): String {
return Test().test()
}
return Test().test()
}
@@ -1,16 +1,19 @@
class Test {
var Int.foo: String = "fail"
set(str: String) {
$foo = str
}
var storage = "Fail"
fun test(): String {
val i = 1
i.foo = "OK"
return i.foo
}
var Int.foo: String
get() = storage
set(value) {
storage = value
}
fun test(): String {
val i = 1
i.foo = "OK"
return i.foo
}
}
fun box(): String {
return Test().test()
}
return Test().test()
}
@@ -1,5 +1,6 @@
val Int.foo: String = "OK"
val Int.foo: String
get() = "OK"
fun box(): String {
return 1.foo
}
return 1.foo
}
@@ -1,10 +1,22 @@
var Double.fooDouble: String = "fail"
var Long.fooLong: String = "fail"
var fooStorage = "Fail"
var barStorage = "Fail"
var Double.foo: String
get() = fooStorage
set(value) {
fooStorage = value
}
var Long.bar: String
get() = barStorage
set(value) {
barStorage = value
}
fun box(): String {
val d = 1.0
d.fooDouble = "O"
val l = 1.toLong()
l.fooLong = "K"
return d.fooDouble + l.fooLong
}
val d = 1.0
d.foo = "O"
val l = 1L
l.bar = "K"
return d.foo + l.bar
}
@@ -1,17 +0,0 @@
var Double.fooDouble: String = "fail"
set(str: String) {
$fooDouble = str
}
var Long.fooLong: String = "fail"
set(str: String) {
$fooLong = str
}
fun box(): String {
val d = 1.0
d.fooDouble = "O"
val l = 1.toLong()
l.fooLong = "K"
return d.fooDouble + l.fooLong
}
@@ -1,8 +0,0 @@
val Int.foo: String = "OK"
get() {
return $foo
}
fun box(): String {
return 1.foo
}
@@ -1,10 +0,0 @@
var Int.foo: String = "fail"
set(str: String) {
$foo = str
}
fun box(): String {
val i = 1
i.foo = "OK"
return i.foo
}
@@ -1,18 +0,0 @@
class A { }
class B { }
public val A.prop: Int = 0;
public val B.prop: String = "1111";
public val prop: Double = 0.1;
public fun doTest() : String {
if (A().prop != 0) return "fail1"
if (B().prop != "1111") return "fail2"
if (prop != 0.1) return "fail3"
return "OK"
}
fun box() : String {
return doTest()
}
@@ -1,22 +0,0 @@
class A { }
class B { }
class Test {
public val A.prop: Int = 0;
public val B.prop: String = "1111";
public val prop: Double = 0.1;
public fun doTest() : String {
if (A().prop != 0) return "fail1"
if (B().prop != "1111") return "fail2"
if (prop != 0.1) return "fail3"
return "OK"
}
}
fun box() : String {
return Test().doTest()
}
@@ -9,10 +9,10 @@ class B {
}
open class C
val C.attr = A()
val C.attr: A get() = A()
open class D: C()
val D.attr = B()
val D.attr: B get() = B()
fun box(): String {
@@ -3,27 +3,9 @@ val Int.getter: Int
return this@getter
}
var Int.setter1: Int = 2
get() {
return this@setter1
}
set(i: Int) {
$setter1 = this@setter1
}
var Int.setter2: Int = 2
set(i: Int) {
$setter2 = this@setter2
}
fun box(): String {
val i = 1
if (i.getter != 1) return "getter failed"
i.setter1 = 2
if (i.setter1 != 1) return "setter1 failed"
i.setter2 = 2
if (i.setter2 != 1) return "setter2 failed"
return "OK"
}
}
@@ -5,19 +5,9 @@ val Int.getter: Int
}.invoke()
}
var Int.setter: Int = 1
set(i: Int) {
$setter = {
this@setter
}.invoke()
}
fun box(): String {
val i = 1
if (i.getter != 1) return "getter failed"
i.setter = 2
if (i.setter != 1) return "setter failed"
return "OK"
}
}
@@ -7,7 +7,8 @@ val Int.getter: Int
}
var Int.setter: Int = 1
var Int.setter: Int
get() = 1
set(i: Int) {
val extFun = { Int.() ->
this@setter
@@ -24,4 +25,4 @@ fun box(): String {
if (i.setter != 1) return "setter failed"
return "OK"
}
}
@@ -4,50 +4,16 @@ trait Base {
val Int.getter: Int
get() {
return object: Base {
return object : Base {
override fun foo(): Int {
return this@getter
}
}.foo()
}
var Int.setter1: Int = 2
set(i: Int) {
$setter1 = object: Base {
override fun foo(): Int {
this@setter1
return 1
}
}.foo()
}
var Int.setter2: Int = 2
get() {
return object: Base {
override fun foo(): Int {
return this@setter2
}
}.foo()
}
set(i: Int) {
$setter2 = object: Base {
override fun foo(): Int {
this@setter2
return 1
}
}.foo()
}
fun box(): String {
val i = 1
if (i.getter != 1) return "getter failed"
i.setter1 = 2
if (i.setter1 != 1) return "setter1 failed"
i.setter2 = 2
if (i.setter2 != 1) return "setter2 failed"
return "OK"
}
}
@@ -2,7 +2,7 @@ package As
val staticProperty : String = "1"
val String.staticExt = "1"
val String.staticExt: String get() = "1"
open class A(val init: String) {
@@ -10,7 +10,7 @@ open class A(val init: String) {
private val privateProperty : String = init
val String.ext = "1"
val String.ext: String get() = "1"
val Int.myInc : Int
get() = this + 1
@@ -1,5 +1,5 @@
val Int.ext : () -> Int = { 5 }
val Long.ext : Long = 4.ext().toLong() //(c.kt:4)
val y : Long = 10.toLong().ext
val Int.ext: () -> Int get() = { 5 }
val Long.ext: Long get() = 4.ext().toLong() //(c.kt:4)
val y: Long get() = 10L.ext
fun box() : String = if (y == 5.toLong()) "OK" else "fail"
fun box(): String = if (y == 5L) "OK" else "fail: $y"
@@ -1,4 +1,4 @@
val Int.test = "test"
val Int.test: String get() = "test"
fun box(): String {
val x = "a ${1.test}"
@@ -2,7 +2,7 @@ enum class E {
entry
}
val Int.entry = 42
val Long.entry = 239
val Int.entry: Int get() = 42
val Long.entry: Int get() = 239
val e = E.entry
@@ -2,7 +2,7 @@
package outer
fun Int?.optint() : Unit {}
val Int?.optval : Unit = Unit.VALUE
val Int?.optval : Unit get() = Unit.VALUE
fun <T: Any, E> T.foo(<!UNUSED_PARAMETER!>x<!> : E, y : A) : T {
y.plus(1)
@@ -1,4 +1,3 @@
//KT-819 Redeclaration error for extension properties with the same name and different receivers
import java.io.*
@@ -15,16 +14,20 @@ open class A() {
open fun String.foo() {}
open fun Int.foo() {}
open val String.foo = 0
open val Int.foo = 1
open val String.foo: Int
get() = 0
open val Int.foo: Int
get() = 1
}
class B() : A() {
override fun String.foo() {}
override fun Int.foo() {}
override val String.foo = 0
override val Int.foo = 0
override val String.foo: Int
get() = 0
override val Int.foo: Int
get() = 0
fun use(s: String) {
s.foo
@@ -1,6 +1,6 @@
object O
fun Any.foo() = 42
val Any?.bar = 239
val Any?.bar: Int get() = 239
val x = O.foo() + O.bar
@@ -10,4 +10,5 @@ object A {
class B
val B.c : String = "test"
val B.c : String
get() = "test"
@@ -1,4 +1,4 @@
package foo
val Int.<!REDECLARATION!>foo<!> = 2
val Int.<!REDECLARATION!>foo<!> = 3
val Int.<!REDECLARATION!>foo<!>: Int get() = 2
val Int.<!REDECLARATION!>foo<!>: Int get() = 3
@@ -26,5 +26,5 @@ class C {
//KT-1728 Can't invoke extension property as a function
val Int.ext : () -> Int = { 5 }
val x = 1.ext()
val Int.ext : () -> Int get() = { 5 }
val x = 1.ext()
@@ -24,7 +24,8 @@ fun test(a: A) {
//variable as extension
trait B {
}
val B.foo = Foo()
val B.foo: Foo
get() = Foo()
fun test(b: B) {
b.foo()
@@ -22,7 +22,8 @@ fun test(a: A) {
//variable as extension
trait B {}
val B.foo = Foo()
val B.foo: Foo
get() = Foo()
fun test(b: B) {
@@ -40,7 +40,8 @@ fun test(c: C, b: B) {
//variable as extension,
trait D {
}
val D.foo = Foo()
val D.foo: Foo
get() = Foo()
class E {
fun Foo.invoke() {}
@@ -10,10 +10,12 @@ class B {
}
open class C
val C.attr = A()
val C.attr: A
get() = A()
open class D: C()
val D.attr = B()
val D.attr: B
get() = B()
fun main(args: Array<String>) {
@@ -1,10 +1,10 @@
package i
val <T> List<T>.length = <!UNRESOLVED_REFERENCE!>size<!>()
val <T> List<T>.length = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!><!UNRESOLVED_REFERENCE!>size<!>()<!>
val <T> List<T>.length1 : Int get() = size()
val String.bd = <!NO_THIS!>this<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> "!"
val String.bd = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!><!NO_THIS!>this<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> "!"<!>
val String.bd1 : String get() = this + "!"
@@ -13,7 +13,7 @@ class A {
val ii : Int = 1
}
val A.foo = <!UNRESOLVED_REFERENCE!>ii<!>
val A.foo = <!UNRESOLVED_REFERENCE, EXTENSION_PROPERTY_WITH_BACKING_FIELD!>ii<!>
val A.foo1 : Int get() = ii
@@ -22,8 +22,8 @@ class C {
inner class D {}
}
val C.foo : C.D = <!UNRESOLVED_REFERENCE!>D<!>()
val C.foo : C.D = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!><!UNRESOLVED_REFERENCE!>D<!>()<!>
val C.bar : C.D = C().D()
val C.bar : C.D = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!>C().D()<!>
val C.foo1 : C.D get() = D()
val C.foo1 : C.D get() = D()
@@ -1,7 +1,7 @@
trait Base {
fun foo()
}
val String.test: Base = object: Base {
val String.test: Base = <!EXTENSION_PROPERTY_WITH_BACKING_FIELD!>object: Base<!> {
override fun foo() {
this<!UNRESOLVED_REFERENCE!>@test<!>
}
@@ -1,9 +1,9 @@
package test
val Long.date1: Object = java.util.Date()
val Long.date1: Any get() = java.util.Date()
internal val Long.date12: Object = java.util.Date()
internal val Long.date12: Any get() = java.util.Date()
private val Long.date3: java.util.Date = java.util.Date()
private val Long.date3: java.util.Date get() = java.util.Date()
public val Long.date4: java.util.Date = java.util.Date()
public val Long.date4: java.util.Date get() = java.util.Date()
@@ -1,9 +1,9 @@
package test
internal val kotlin.Long.date1: java.lang.Object
internal fun kotlin.Long.<get-date1>(): java.lang.Object
internal val kotlin.Long.date12: java.lang.Object
internal fun kotlin.Long.<get-date12>(): java.lang.Object
internal val kotlin.Long.date1: kotlin.Any
internal fun kotlin.Long.<get-date1>(): kotlin.Any
internal val kotlin.Long.date12: kotlin.Any
internal fun kotlin.Long.<get-date12>(): kotlin.Any
private val kotlin.Long.date3: java.util.Date
private fun kotlin.Long.<get-date3>(): java.util.Date
public val kotlin.Long.date4: java.util.Date
@@ -1,9 +1,28 @@
package test
var Long.date1: Object = java.util.Date()
var Long.date1: Any get() = java.util.Date()
set(value) {}
internal var Long.date12: Object = java.util.Date()
var Long.date2: Any get() = java.util.Date()
protected set(value) {}
private var Long.date3: java.util.Date = java.util.Date()
var Long.date3: Any get() = java.util.Date()
private set(value) {}
public var Long.date5: java.util.Date = java.util.Date()
private var Long.date4: java.util.Date get() = java.util.Date()
set(value) {}
public var Long.date7: java.util.Date get() = java.util.Date()
set(value) {}
public var Long.date8: java.util.Date get() = java.util.Date()
internal set(value) {}
public var Long.date9: java.util.Date get() = java.util.Date()
private set(value) {}
public var Long.date10: java.util.Date get() = java.util.Date()
protected set(value) {}
public var Long.date11: java.util.Date get() = java.util.Date()
public set(value) {}
@@ -1,14 +1,29 @@
package test
internal var kotlin.Long.date1: java.lang.Object
internal fun kotlin.Long.<get-date1>(): java.lang.Object
internal fun kotlin.Long.<set-date1>(/*0*/ <set-?>: java.lang.Object): kotlin.Unit
internal var kotlin.Long.date12: java.lang.Object
internal fun kotlin.Long.<get-date12>(): java.lang.Object
internal fun kotlin.Long.<set-date12>(/*0*/ <set-?>: java.lang.Object): kotlin.Unit
private var kotlin.Long.date3: java.util.Date
private fun kotlin.Long.<get-date3>(): java.util.Date
private fun kotlin.Long.<set-date3>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
public var kotlin.Long.date5: java.util.Date
public fun kotlin.Long.<get-date5>(): java.util.Date
public fun kotlin.Long.<set-date5>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
internal var kotlin.Long.date1: kotlin.Any
internal fun kotlin.Long.<get-date1>(): kotlin.Any
internal fun kotlin.Long.<set-date1>(/*0*/ value: kotlin.Any): kotlin.Unit
public var kotlin.Long.date10: java.util.Date
public fun kotlin.Long.<get-date10>(): java.util.Date
protected fun kotlin.Long.<set-date10>(/*0*/ value: java.util.Date): kotlin.Unit
public var kotlin.Long.date11: java.util.Date
public fun kotlin.Long.<get-date11>(): java.util.Date
public fun kotlin.Long.<set-date11>(/*0*/ value: java.util.Date): kotlin.Unit
internal var kotlin.Long.date2: kotlin.Any
internal fun kotlin.Long.<get-date2>(): kotlin.Any
protected fun kotlin.Long.<set-date2>(/*0*/ value: kotlin.Any): kotlin.Unit
internal var kotlin.Long.date3: kotlin.Any
internal fun kotlin.Long.<get-date3>(): kotlin.Any
private fun kotlin.Long.<set-date3>(/*0*/ value: kotlin.Any): kotlin.Unit
private var kotlin.Long.date4: java.util.Date
private fun kotlin.Long.<get-date4>(): java.util.Date
private fun kotlin.Long.<set-date4>(/*0*/ value: java.util.Date): kotlin.Unit
public var kotlin.Long.date7: java.util.Date
public fun kotlin.Long.<get-date7>(): java.util.Date
public fun kotlin.Long.<set-date7>(/*0*/ value: java.util.Date): kotlin.Unit
public var kotlin.Long.date8: java.util.Date
public fun kotlin.Long.<get-date8>(): java.util.Date
internal fun kotlin.Long.<set-date8>(/*0*/ value: java.util.Date): kotlin.Unit
public var kotlin.Long.date9: java.util.Date
public fun kotlin.Long.<get-date9>(): java.util.Date
private fun kotlin.Long.<set-date9>(/*0*/ value: java.util.Date): kotlin.Unit
@@ -1,28 +0,0 @@
package test
var Long.date1: Object = java.util.Date()
set
var Long.date2: Object = java.util.Date()
protected set
var Long.date3: Object = java.util.Date()
private set
private var Long.date4: java.util.Date = java.util.Date()
set
public var Long.date7: java.util.Date = java.util.Date()
set
public var Long.date8: java.util.Date = java.util.Date()
internal set
public var Long.date9: java.util.Date = java.util.Date()
private set
public var Long.date10: java.util.Date = java.util.Date()
protected set
public var Long.date11: java.util.Date = java.util.Date()
public set
@@ -1,29 +0,0 @@
package test
internal var kotlin.Long.date1: java.lang.Object
internal fun kotlin.Long.<get-date1>(): java.lang.Object
internal fun kotlin.Long.<set-date1>(/*0*/ <set-?>: java.lang.Object): kotlin.Unit
public var kotlin.Long.date10: java.util.Date
public fun kotlin.Long.<get-date10>(): java.util.Date
protected fun kotlin.Long.<set-date10>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
public var kotlin.Long.date11: java.util.Date
public fun kotlin.Long.<get-date11>(): java.util.Date
public fun kotlin.Long.<set-date11>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
internal var kotlin.Long.date2: java.lang.Object
internal fun kotlin.Long.<get-date2>(): java.lang.Object
protected fun kotlin.Long.<set-date2>(/*0*/ <set-?>: java.lang.Object): kotlin.Unit
internal var kotlin.Long.date3: java.lang.Object
internal fun kotlin.Long.<get-date3>(): java.lang.Object
private fun kotlin.Long.<set-date3>(/*0*/ <set-?>: java.lang.Object): kotlin.Unit
private var kotlin.Long.date4: java.util.Date
private fun kotlin.Long.<get-date4>(): java.util.Date
private fun kotlin.Long.<set-date4>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
public var kotlin.Long.date7: java.util.Date
public fun kotlin.Long.<get-date7>(): java.util.Date
public fun kotlin.Long.<set-date7>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
public var kotlin.Long.date8: java.util.Date
public fun kotlin.Long.<get-date8>(): java.util.Date
internal fun kotlin.Long.<set-date8>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
public var kotlin.Long.date9: java.util.Date
public fun kotlin.Long.<get-date9>(): java.util.Date
private fun kotlin.Long.<set-date9>(/*0*/ <set-?>: java.util.Date): kotlin.Unit
@@ -1,13 +0,0 @@
class Test {
class object {
public val Test.prop: Int = 0;
}
}
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext
// FLAGS: ACC_FINAL, ACC_STATIC, ACC_PRIVATE
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$object, prop$ext
// ABSENT: TRUE
@@ -1,13 +0,0 @@
class Test {
class object {
public var Test.prop: Int = 0;
}
}
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext
// FLAGS: ACC_STATIC, ACC_PRIVATE
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$object, prop$ext
// ABSENT: TRUE
@@ -1,18 +0,0 @@
class A { }
class B { }
class Test {
class object {
public val A.prop: Int = 0;
public val B.prop: Int = 0;
}
}
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext$1
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
@@ -1,16 +0,0 @@
class Test {
public val prop: Int = 0;
class object {
public var Test.prop: Int = 0;
}
}
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop
// FLAGS: ACC_PRIVATE, ACC_FINAL
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext
// FLAGS: ACC_STATIC, ACC_PRIVATE
@@ -1,13 +0,0 @@
trait Test {
class object {
public val Test.prop: Int = 0;
}
}
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext
// ABSENT: TRUE
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$object, prop$ext
// FLAGS: ACC_FINAL, ACC_PRIVATE
@@ -1,13 +0,0 @@
trait Test {
class object {
public var Test.prop: Int = 0;
}
}
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop$ext
// ABSENT: TRUE
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$object, prop$ext
// FLAGS: ACC_PRIVATE