From ca579e25b7ee5e2feda3d2ec5e785d66e1de0ab8 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 20 Apr 2011 16:25:35 +0400 Subject: [PATCH] $field is only allowed in property accessors --- .../jetbrains/jet/lang/resolve/TopDownAnalyzer.java | 9 ++++++--- idea/testData/checker/Properties.jet | 10 ++++++++++ .../checker/infos/PropertiesWithBackingFields.jet | 5 +++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 8ba07b1e507..2a15f01943e 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -244,7 +244,6 @@ public class TopDownAnalyzer { declaringScopes.put(property, declaringScope); PropertyDescriptor descriptor = classDescriptorResolver.resolvePropertyDescriptor(declaringScope.getContainingDeclaration(), declaringScope, property); declaringScope.addVariableDescriptor(descriptor); - declaringScope.addPropertyDescriptorByFieldName("$" + descriptor.getName(), descriptor); properties.put(property, descriptor); } @@ -302,6 +301,7 @@ public class TopDownAnalyzer { if (expression instanceof JetSimpleNameExpression) { JetSimpleNameExpression simpleNameExpression = (JetSimpleNameExpression) expression; if (simpleNameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) { + // This check may be considered redundant as long as $x is only accessible from accessors to $x if (descriptor == propertyDescriptor) { // TODO : original? recordFieldAccessFromAccessor(propertyDescriptor); } @@ -310,16 +310,19 @@ public class TopDownAnalyzer { } }; + WritableScope accessorScope = semanticServices.createWritableScope(declaringScope, declaringScope.getContainingDeclaration()); + accessorScope.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor); + JetPropertyAccessor getter = declaration.getGetter(); PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter(); if (getter != null && getterDescriptor != null) { - resolveFunctionBody(fieldAccessTrackingTrace, getter, getterDescriptor, declaringScope); + resolveFunctionBody(fieldAccessTrackingTrace, getter, getterDescriptor, accessorScope); } JetPropertyAccessor setter = declaration.getSetter(); PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter(); if (setter != null && setterDescriptor != null) { - resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, declaringScope); + resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope); } } } diff --git a/idea/testData/checker/Properties.jet b/idea/testData/checker/Properties.jet index dfb95218f5b..5b4ea09bb1d 100644 --- a/idea/testData/checker/Properties.jet +++ b/idea/testData/checker/Properties.jet @@ -8,3 +8,13 @@ val xx : Int = 1 + x get() : Int = 1 set(ref value : Long) {$x = value} + +class Test { + var a : Int + var b : Int get() = $a; set(x) {a = x; $a = x} + + this() { + $b = $a + a = $b + } +} \ No newline at end of file diff --git a/idea/testData/checker/infos/PropertiesWithBackingFields.jet b/idea/testData/checker/infos/PropertiesWithBackingFields.jet index 50dd6ec31c2..0a1d8911788 100644 --- a/idea/testData/checker/infos/PropertiesWithBackingFields.jet +++ b/idea/testData/checker/infos/PropertiesWithBackingFields.jet @@ -15,6 +15,8 @@ class Test { get() { return 1 } val c4 : Int get() { 1 } + val c5 : Int + get() { $c5 + 1 } abstract var y : Int abstract var y1 : Int get @@ -28,4 +30,7 @@ class Test { var v2 : Int get set var v3 : Int get() = 1; set var v4 : Int get() = 1; set(x){} + + var v5 : Int get() = 1; set(x){$v5 = x} + var v6 : Int get() = $v6 + 1; set(x){} } \ No newline at end of file