$field is only allowed in property accessors
This commit is contained in:
@@ -244,7 +244,6 @@ public class TopDownAnalyzer {
|
|||||||
declaringScopes.put(property, declaringScope);
|
declaringScopes.put(property, declaringScope);
|
||||||
PropertyDescriptor descriptor = classDescriptorResolver.resolvePropertyDescriptor(declaringScope.getContainingDeclaration(), declaringScope, property);
|
PropertyDescriptor descriptor = classDescriptorResolver.resolvePropertyDescriptor(declaringScope.getContainingDeclaration(), declaringScope, property);
|
||||||
declaringScope.addVariableDescriptor(descriptor);
|
declaringScope.addVariableDescriptor(descriptor);
|
||||||
declaringScope.addPropertyDescriptorByFieldName("$" + descriptor.getName(), descriptor);
|
|
||||||
properties.put(property, descriptor);
|
properties.put(property, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,6 +301,7 @@ public class TopDownAnalyzer {
|
|||||||
if (expression instanceof JetSimpleNameExpression) {
|
if (expression instanceof JetSimpleNameExpression) {
|
||||||
JetSimpleNameExpression simpleNameExpression = (JetSimpleNameExpression) expression;
|
JetSimpleNameExpression simpleNameExpression = (JetSimpleNameExpression) expression;
|
||||||
if (simpleNameExpression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
|
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?
|
if (descriptor == propertyDescriptor) { // TODO : original?
|
||||||
recordFieldAccessFromAccessor(propertyDescriptor);
|
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();
|
JetPropertyAccessor getter = declaration.getGetter();
|
||||||
PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter();
|
PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter();
|
||||||
if (getter != null && getterDescriptor != null) {
|
if (getter != null && getterDescriptor != null) {
|
||||||
resolveFunctionBody(fieldAccessTrackingTrace, getter, getterDescriptor, declaringScope);
|
resolveFunctionBody(fieldAccessTrackingTrace, getter, getterDescriptor, accessorScope);
|
||||||
}
|
}
|
||||||
|
|
||||||
JetPropertyAccessor setter = declaration.getSetter();
|
JetPropertyAccessor setter = declaration.getSetter();
|
||||||
PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter();
|
PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter();
|
||||||
if (setter != null && setterDescriptor != null) {
|
if (setter != null && setterDescriptor != null) {
|
||||||
resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, declaringScope);
|
resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,3 +8,13 @@
|
|||||||
val xx : Int = 1 + x
|
val xx : Int = 1 + x
|
||||||
get() : Int = 1
|
get() : Int = 1
|
||||||
<error>set(ref value : Long) {$x = value}</error>
|
<error>set(ref value : Long) {$x = value}</error>
|
||||||
|
|
||||||
|
class Test {
|
||||||
|
var a : Int
|
||||||
|
var b : Int get() = <error>$a</error>; set(x) {a = x; <error>$a</error> = x}
|
||||||
|
|
||||||
|
this() {
|
||||||
|
<error>$b</error> = <error>$a</error>
|
||||||
|
a = <error>$b</error>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,6 +15,8 @@ class Test {
|
|||||||
<info>get</info>() { return 1 }
|
<info>get</info>() { return 1 }
|
||||||
val c4 : Int
|
val c4 : Int
|
||||||
<info>get</info>() { 1 }
|
<info>get</info>() { 1 }
|
||||||
|
val <info>c5</info> : Int
|
||||||
|
<info>get</info>() { $c5 + 1 }
|
||||||
|
|
||||||
<info>abstract</info> var y : Int
|
<info>abstract</info> var y : Int
|
||||||
<info>abstract</info> var y1 : Int <info>get</info>
|
<info>abstract</info> var y1 : Int <info>get</info>
|
||||||
@@ -28,4 +30,7 @@ class Test {
|
|||||||
var <info>v2</info> : Int <info>get</info> <info>set</info>
|
var <info>v2</info> : Int <info>get</info> <info>set</info>
|
||||||
var <info>v3</info> : Int <info>get</info>() = 1; <info>set</info>
|
var <info>v3</info> : Int <info>get</info>() = 1; <info>set</info>
|
||||||
var v4 : Int <info>get</info>() = 1; <info>set</info>(x){}
|
var v4 : Int <info>get</info>() = 1; <info>set</info>(x){}
|
||||||
|
|
||||||
|
var <info>v5</info> : Int <info>get</info>() = 1; <info>set</info>(x){$v5 = x}
|
||||||
|
var <info>v6</info> : Int <info>get</info>() = $v6 + 1; <info>set</info>(x){}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user