From d9c08e38daa7825dbcd2efff159fcf01ca99949f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 18 Apr 2011 22:54:32 +0400 Subject: [PATCH] $fieldName resolved --- .../jetbrains/jet/lang/resolve/JetScope.java | 7 +++ .../jet/lang/resolve/JetScopeAdapter.java | 5 ++ .../jet/lang/resolve/JetScopeImpl.java | 5 ++ .../jet/lang/resolve/SubstitutingScope.java | 5 ++ .../jet/lang/resolve/TopDownAnalyzer.java | 1 + .../jet/lang/resolve/WritableScope.java | 24 +++++++++ .../resolve/java/JavaClassMembersScope.java | 5 ++ .../jetbrains/jet/lang/types/ErrorUtils.java | 5 ++ .../jet/lang/types/JetTypeInferrer.java | 49 ++++++++++++------- idea/testData/checker/Properties.jet | 5 +- 10 files changed, 92 insertions(+), 19 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/resolve/JetScope.java b/idea/src/org/jetbrains/jet/lang/resolve/JetScope.java index 2c4edf2299c..55c0eb62bf4 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/JetScope.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/JetScope.java @@ -38,4 +38,11 @@ public interface JetScope { @NotNull Collection getDeclarationsByLabel(String labelName); + + /** + * @param fieldName includes the "$" + * @return the property declaring this field, if any + */ + @Nullable + PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName); } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java b/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java index 7c8d465269f..7b1e07c50b3 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java @@ -54,4 +54,9 @@ public class JetScopeAdapter implements JetScope { public Collection getDeclarationsByLabel(String labelName) { return scope.getDeclarationsByLabel(labelName); } + + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + return scope.getPropertyByFieldReference(fieldName); + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java b/idea/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java index 83bb5e2b8ff..2c6b8ca5a74 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/JetScopeImpl.java @@ -42,4 +42,9 @@ public abstract class JetScopeImpl implements JetScope { public Collection getDeclarationsByLabel(String labelName) { return Collections.emptyList(); } + + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + return null; + } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java b/idea/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java index 76686de0a2d..a4e3930d9c4 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/SubstitutingScope.java @@ -73,4 +73,9 @@ public class SubstitutingScope implements JetScope { public Collection getDeclarationsByLabel(String labelName) { throw new UnsupportedOperationException(); // TODO } + + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + throw new UnsupportedOperationException(); // TODO + } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 3b55d47cb2f..63c5aae5b84 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -243,6 +243,7 @@ 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); } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/WritableScope.java b/idea/src/org/jetbrains/jet/lang/resolve/WritableScope.java index 48daf603d5e..21f4fa722a3 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/WritableScope.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/WritableScope.java @@ -17,6 +17,10 @@ public class WritableScope extends JetScopeAdapter { @NotNull private final DeclarationDescriptor ownerDeclarationDescriptor; + // FieldNames include "$" + @Nullable + private Map propertyDescriptorsByFieldNames; + @Nullable private Map variableDescriptors; @Nullable @@ -270,4 +274,24 @@ public class WritableScope extends JetScopeAdapter { } this.thisType = thisType; } + + @SuppressWarnings({"NullableProblems"}) + @NotNull + private Map getPropertyDescriptorsByFieldNames() { + if (propertyDescriptorsByFieldNames == null) { + propertyDescriptorsByFieldNames = new HashMap(); + } + return propertyDescriptorsByFieldNames; + } + + public void addPropertyDescriptorByFieldName(@NotNull String fieldName, PropertyDescriptor propertyDescriptor) { + getPropertyDescriptorsByFieldNames().put(fieldName, propertyDescriptor); + } + + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + PropertyDescriptor descriptor = getPropertyDescriptorsByFieldNames().get(fieldName); + if (descriptor != null) return descriptor; + return super.getPropertyByFieldReference(fieldName); + } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index c310ee228ae..b8ee58cfa9d 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -37,6 +37,11 @@ public class JavaClassMembersScope implements JetScope { throw new UnsupportedOperationException(); // TODO } + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + return null; + } + @Override public ClassifierDescriptor getClassifier(@NotNull String name) { for (PsiClass innerClass : psiClass.getAllInnerClasses()) { diff --git a/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 8661e7d7f0b..91c9300edc1 100644 --- a/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/idea/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -53,6 +53,11 @@ public class ErrorUtils { return Collections.emptyList(); } + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + return null; // TODO : review + } + }; private static final FunctionGroup ERROR_FUNCTION_GROUP = new FunctionGroup() { diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 4b0706488ab..141d9d51709 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -440,25 +440,38 @@ public class JetTypeInferrer { public void visitSimpleNameExpression(JetSimpleNameExpression expression) { // TODO : other members // TODO : type substitutions??? - String referencedName = expression.getReferencedName(); - if (referencedName != null) { - VariableDescriptor variable = scope.getVariable(referencedName); - if (variable != null) { - trace.recordReferenceResolution(expression, variable); - result = variable.getOutType(); - if (result == null) { - semanticServices.getErrorHandler().genericError(expression.getNode(), "This variable is not readable in this context"); - } - return; - } else { - NamespaceDescriptor namespace = scope.getNamespace(referencedName); - if (namespace != null) { - trace.recordReferenceResolution(expression, namespace); - result = namespace.getNamespaceType(); - return; - } + if (expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) { + PropertyDescriptor property = scope.getPropertyByFieldReference(expression.getReferencedName()); + if (property == null) { + semanticServices.getErrorHandler().unresolvedReference(expression); + } + else { + trace.recordReferenceResolution(expression, property); + result = property.getOutType(); + } + } + else { + assert expression.getReferencedNameElementType() == JetTokens.IDENTIFIER; + String referencedName = expression.getReferencedName(); + if (referencedName != null) { + VariableDescriptor variable = scope.getVariable(referencedName); + if (variable != null) { + trace.recordReferenceResolution(expression, variable); + result = variable.getOutType(); + if (result == null) { + semanticServices.getErrorHandler().genericError(expression.getNode(), "This variable is not readable in this context"); + } + return; + } else { + NamespaceDescriptor namespace = scope.getNamespace(referencedName); + if (namespace != null) { + trace.recordReferenceResolution(expression, namespace); + result = namespace.getNamespaceType(); + return; + } + } + semanticServices.getErrorHandler().unresolvedReference(expression); } - semanticServices.getErrorHandler().unresolvedReference(expression); } } diff --git a/idea/testData/checker/Properties.jet b/idea/testData/checker/Properties.jet index b96992e50ef..dfb95218f5b 100644 --- a/idea/testData/checker/Properties.jet +++ b/idea/testData/checker/Properties.jet @@ -1,6 +1,9 @@ var x : Int = 1 + x get() : Int = 1 - set(ref value : Long) {$x = value} + set(ref value : Long) { + $x = value.int + $x = 1.lng + } val xx : Int = 1 + x get() : Int = 1