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