backing fields resolve changed

KT-462 Consider allowing initializing properties via property names when it is safe
KT-598 Allow to use backing fields after this expression
This commit is contained in:
svtk
2011-12-06 22:41:19 +04:00
parent 6f314c09b0
commit ec55dddfcd
36 changed files with 422 additions and 215 deletions
@@ -24,7 +24,7 @@ class WithC() {
{
val z = <!UNRESOLVED_REFERENCE!>b<!>
val zz = x
val zzz = <!NO_BACKING_FIELD!>$a<!>
val zzz = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!>
}
this(a : Int) : this() {
@@ -1,4 +1,4 @@
var x : Int = 1 + x
var x : Int = 1 + x
get() : Int = 1
set(<!REF_SETTER_PARAMETER!>ref<!> value : <!WRONG_SETTER_PARAMETER_TYPE!>Long<!>) {
$x = value.int
@@ -14,16 +14,16 @@
class Test() {
var a : Int = 111
var b : Int get() = <!UNRESOLVED_REFERENCE!>$a<!>; set(x) {a = x; <!UNRESOLVED_REFERENCE!>$a<!> = x}
var b : Int get() = $a; set(x) {a = x; $a = x}
this(i : Int) : this() {
<!NO_BACKING_FIELD!>$b<!> = $a
$a = <!NO_BACKING_FIELD!>$b<!>
a = <!NO_BACKING_FIELD!>$b<!>
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!> = $a
$a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!>
a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!>
}
fun f() {
<!UNRESOLVED_REFERENCE!>$b<!> = <!UNRESOLVED_REFERENCE!>$a<!>
a = <!UNRESOLVED_REFERENCE!>$b<!>
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!> = $a
a = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$b<!>
}
public val <!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>i<!> = 1
}
@@ -137,14 +137,14 @@ class AnonymousInitializers(var a: String, val b: String) {
{
<!VAL_REASSIGNMENT!>$i<!> = 13
<!NO_BACKING_FIELD, VAL_REASSIGNMENT!>$j<!> = 30
j = 34
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$j<!> = 30
<!VAL_REASSIGNMENT!>j<!> = 34
}
val k: String
{
if (1 < 3) {
<!INITIALIZATION_USING_BACKING_FIELD!>k<!> = "a"
k = "a"
}
else {
$k = "b"
@@ -288,7 +288,7 @@ class TestObjectExpression() {
val <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>y<!> : Int
{
if (true)
<!INITIALIZATION_USING_BACKING_FIELD!>x<!> = 12
x = 12
else
$x = 1
}
@@ -349,4 +349,4 @@ fun test(m : M) {
fun test1(m : M) {
<!VAL_REASSIGNMENT!>m.x<!>++
m.y--
}
}
@@ -1,4 +1,4 @@
class ReadByAnotherPropertyInitializer() {
val a = 1
fun ff() = <!UNRESOLVED_REFERENCE!>$a<!>
fun ff() = $a
}
@@ -2,6 +2,6 @@ abstract class ReadNonexistent() {
abstract val aa: Int
{
val x = <!NO_BACKING_FIELD!>$aa<!>
val x = <!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$aa<!>
}
}
}
@@ -1,5 +1,5 @@
abstract class ReadNonexistent {
abstract val aa: Int
fun ff() = <!UNRESOLVED_REFERENCE!>$aa<!>
}
fun ff() = <!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$aa<!>
}
@@ -3,6 +3,6 @@ class ReadNonexistent() {
get() = 1
{
val x = <!NO_BACKING_FIELD!>$a<!>
val x = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!>
}
}
}
@@ -2,5 +2,5 @@ class CustomValNoBackingField() {
val a: Int
get() = 1
val b = <!NO_BACKING_FIELD!>$a<!>
}
val b = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!>
}
@@ -1,7 +1,6 @@
val y = 1
class A() {
{
val x = <!UNRESOLVED_REFERENCE!>$y<!>
}
}
class CustomValNoBackingField() {
val a: Int
get() = 1
val b = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$a<!>
}
@@ -2,6 +2,6 @@ val y = 1
class A() {
{
<!UNRESOLVED_REFERENCE!>$y<!> = 1
<!INACCESSIBLE_BACKING_FIELD!>$y<!> = 1
}
}
}
@@ -0,0 +1,172 @@
//KT-462 Consider allowing initializing properties via property names when it is safe
//KT-598 Allow to use backing fields after this expression
namespace kt462
abstract class TestInitializationWithoutBackingField() {
val valWithBackingField : Int
{
valWithBackingField = 2
}
val valWithoutBackingField : Int
get() = 42
{
<!VAL_REASSIGNMENT!>valWithoutBackingField<!> = 45
}
var finalDefaultVar : Int
{
finalDefaultVar = 3
}
open var openVar : Int
{
<!INITIALIZATION_USING_BACKING_FIELD_OPEN_SETTER!>openVar<!> = 4
}
var varWithCustomSetter : Int
set(v: Int) {
$varWithCustomSetter = v
}
{
<!INITIALIZATION_USING_BACKING_FIELD_CUSTOM_SETTER!>varWithCustomSetter<!> = 3
}
var varWithoutBackingField : Int
get() = 3
set(v: Int) {}
{
varWithoutBackingField = 4
}
abstract var abstractVar : Int
{
abstractVar = 34
}
}
abstract class TestInitializationThroughBackingField() {
val valWithBackingField : Int
{
$valWithBackingField = 2
}
val valWithoutBackingField : Int
get() = 42
{
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$valWithoutBackingField<!> = 45
}
var finalDefaultVar : Int
{
$finalDefaultVar = 3
}
open var openVar : Int
{
$openVar = 4
}
var varWithCustomSetter : Int
set(v: Int) {
$varWithCustomSetter = v
}
{
$varWithCustomSetter = 3
}
var varWithoutBackingField : Int
get() = 3
set(v: Int) {}
{
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$varWithoutBackingField<!> = 4
}
abstract var abstractVar : Int
{
<!NO_BACKING_FIELD_ABSTRACT_PROPERTY!>$abstractVar<!> = 34
}
}
class TestBackingFieldsVisibility() {
var a : Int = 712
{
$a = 37
this.$a = 357
}
fun foo() {
$a = 334
this.$a = 347
}
fun foo(a: TestBackingFieldsVisibility) {
val <!UNUSED_VARIABLE!>b<!> : Int = 3
<!UNRESOLVED_REFERENCE!>$b<!> = 342
<!INACCESSIBLE_BACKING_FIELD!>a.$a<!> = 3
}
val x = <!INACCESSIBLE_BACKING_FIELD!>$namespaceLevelVar<!>
class Inner() {
val z = this@TestBackingFieldsVisibility.$x
}
<!ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS!>abstract<!> val w = 11
get() = $w //test there is no second error here
}
val namespaceLevelVar = 11
class T() {
val z : Int get() = 42
{
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>this.$z<!> = 34
}
fun foo() {
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS!>this.$z<!> = 343
}
val a = object {
val x = <!NO_BACKING_FIELD_CUSTOM_ACCESSORS, NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$z<!>
{
<!NO_BACKING_FIELD_CUSTOM_ACCESSORS, NO_BACKING_FIELD_CUSTOM_ACCESSORS!>$z<!> = 23
}
}
var x: Int = 2
get() {
val <!UNUSED_VARIABLE!>o<!> = object {
{
$x = 34
}
fun foo() {
$x = 23
}
}
return 1
}
var r: Int = $x
set(v: Int) {
if (true) {
$r = 33
}
else {
$r = 35
}
}
fun bar() {
$x = 34
val <!UNUSED_VARIABLE!>o<!> = object {
val y = $x
{
$x = 422
}
}
}
}
@@ -5,7 +5,7 @@ namespace kt510
public open class Identifier1() {
var field : Boolean
{
<!INITIALIZATION_USING_BACKING_FIELD!>field<!> = false; // error
field = false; // error
}
}
@@ -13,6 +13,6 @@ public open class Identifier1() {
public open class Identifier2() {
var field : Boolean
{
<!INITIALIZATION_USING_BACKING_FIELD!>this.field<!> = false;
this.field = false;
}
}