Disallow extension properties with backing fields
#KT-1682 Fixed
This commit is contained in:
@@ -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}"
|
||||
|
||||
Reference in New Issue
Block a user