From 20178a7bb57dd9446fa9defee85c53037b79cf9e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 3 Feb 2012 20:45:29 +0400 Subject: [PATCH] Local object declarations support (by Pavel Talanov) --- .../lang/psi/JetObjectDeclarationName.java | 10 +++ .../jetbrains/jet/lang/psi/JetVisitor.java | 4 ++ .../jet/lang/psi/JetVisitorVoid.java | 6 +- .../jet/lang/resolve/DescriptorResolver.java | 65 ++++++++++++++----- .../ExpressionTypingVisitorForStatements.java | 5 +- 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclarationName.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclarationName.java index f64da39750e..04dfb0e1ae1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclarationName.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclarationName.java @@ -11,4 +11,14 @@ public class JetObjectDeclarationName extends JetNamedDeclaration { public JetObjectDeclarationName(@NotNull ASTNode node) { super(node); } + + @Override + public void accept(@NotNull JetVisitorVoid visitor) { + visitor.visitObjectDeclarationName(this); + } + + @Override + public R accept(@NotNull JetVisitor visitor, D data) { + return visitor.visitObjectDeclarationName(this, data); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 3ee47fabe56..f6e496a4344 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -391,6 +391,10 @@ public class JetVisitor extends PsiElementVisitor { public R visitObjectDeclaration(JetObjectDeclaration declaration, D data) { return visitNamedDeclaration(declaration, data); } + + public R visitObjectDeclarationName(JetObjectDeclarationName declarationName, D data) { + return visitNamedDeclaration(declarationName, data); + } public R visitBindingPattern(JetBindingPattern pattern, D data) { return visitPattern(pattern, data); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java index 5b9ba0db1c4..915f216f8ec 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java @@ -162,7 +162,7 @@ public class JetVisitorVoid extends PsiElementVisitor { visitExpression(expression); } -// public void visitNewExpression(JetNewExpression expression) { + // public void visitNewExpression(JetNewExpression expression) { // visitExpression(expression); // } // @@ -390,6 +390,10 @@ public class JetVisitorVoid extends PsiElementVisitor { visitNamedDeclaration(declaration); } + public void visitObjectDeclarationName(JetObjectDeclarationName declaration) { + visitNamedDeclaration(declaration); + } + public void visitBindingPattern(JetBindingPattern pattern) { visitPattern(pattern); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index be3aaf207ee..4680867e228 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -253,14 +253,14 @@ public class DescriptorResolver { variableType = getVarargParameterType(type); } MutableValueParameterDescriptor valueParameterDescriptor = new ValueParameterDescriptorImpl( - declarationDescriptor, - index, - annotationResolver.createAnnotationStubs(valueParameter.getModifierList()), - JetPsiUtil.safeName(valueParameter.getName()), - valueParameter.isMutable(), - variableType, - valueParameter.getDefaultValue() != null, - varargElementType + declarationDescriptor, + index, + annotationResolver.createAnnotationStubs(valueParameter.getModifierList()), + JetPsiUtil.safeName(valueParameter.getName()), + valueParameter.isMutable(), + variableType, + valueParameter.getDefaultValue() != null, + varargElementType ); trace.record(BindingContext.VALUE_PARAMETER, valueParameter, valueParameterDescriptor); @@ -442,21 +442,36 @@ public class DescriptorResolver { return variableDescriptor; } - public PropertyDescriptor resolveObjectDeclarationAsPropertyDescriptor(@NotNull DeclarationDescriptor containingDeclaration, JetClassOrObject objectDeclaration, @NotNull ClassDescriptor classDescriptor) { + @NotNull + public VariableDescriptor resolveObjectDeclaration(@NotNull DeclarationDescriptor containingDeclaration, + @NotNull JetClassOrObject objectDeclaration, + @NotNull ClassDescriptor classDescriptor) { + boolean isProperty = (containingDeclaration instanceof NamespaceDescriptor) + || (containingDeclaration instanceof ClassDescriptor); + if (isProperty) { + return resolveObjectDeclarationAsPropertyDescriptor(containingDeclaration, objectDeclaration, classDescriptor); + } else { + return resolveObjectDeclarationAsLocalVariable(containingDeclaration, objectDeclaration, classDescriptor); + } + } + + @NotNull + public PropertyDescriptor resolveObjectDeclarationAsPropertyDescriptor(@NotNull DeclarationDescriptor containingDeclaration, + @NotNull JetClassOrObject objectDeclaration, + @NotNull ClassDescriptor classDescriptor) { JetModifierList modifierList = objectDeclaration.getModifierList(); + Visibility visibility = resolveVisibilityFromModifiers(objectDeclaration.getModifierList()); PropertyDescriptor propertyDescriptor = new PropertyDescriptor( containingDeclaration, annotationResolver.createAnnotationStubs(modifierList), Modality.FINAL, - resolveVisibilityFromModifiers(objectDeclaration.getModifierList()), + visibility, false, true, JetPsiUtil.safeName(objectDeclaration.getName()) ); - propertyDescriptor.setType(classDescriptor.getDefaultType(), Collections.emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), ReceiverDescriptor.NO_RECEIVER); - propertyDescriptor.initialize(null, null); - + propertyDescriptor.initialize(createDefaultGetter(propertyDescriptor), null); JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration(); if (nameAsDeclaration != null) { trace.record(BindingContext.OBJECT_DECLARATION, nameAsDeclaration, propertyDescriptor); @@ -464,10 +479,26 @@ public class DescriptorResolver { return propertyDescriptor; } + @NotNull + private VariableDescriptor resolveObjectDeclarationAsLocalVariable(@NotNull DeclarationDescriptor containingDeclaration, + @NotNull JetClassOrObject objectDeclaration, + @NotNull ClassDescriptor classDescriptor) { + VariableDescriptorImpl variableDescriptor = new LocalVariableDescriptor( + containingDeclaration, + annotationResolver.createAnnotationStubs(objectDeclaration.getModifierList()), + JetPsiUtil.safeName(objectDeclaration.getName()), + classDescriptor.getDefaultType(), + /*isVar =*/ false); + JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration(); + if (nameAsDeclaration != null) { + trace.record(BindingContext.VARIABLE, nameAsDeclaration, variableDescriptor); + } + return variableDescriptor; + } + public JetScope getPropertyDeclarationInnerScope(@NotNull JetScope outerScope, - @NotNull PropertyDescriptor propertyDescriptor, List typeParameters, - ReceiverDescriptor receiver) - { + @NotNull PropertyDescriptor propertyDescriptor, List typeParameters, + ReceiverDescriptor receiver) { WritableScopeImpl result = new WritableScopeImpl(outerScope, propertyDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Property declaration inner scope"); for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) { result.addTypeParameterDescriptor(typeParameterDescriptor); @@ -613,7 +644,7 @@ public class DescriptorResolver { } return defaultModality; } - + @NotNull /*package*/ static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList) { return resolveVisibilityFromModifiers(modifierList, Visibility.INTERNAL); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index 715b697741d..d67dfa79ff3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -63,8 +63,9 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito TopDownAnalyzer.processObject(context.semanticServices, context.trace, scope, scope.getContainingDeclaration(), declaration); ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration); if (classDescriptor != null) { - PropertyDescriptor propertyDescriptor = context.getDescriptorResolver().resolveObjectDeclarationAsPropertyDescriptor(scope.getContainingDeclaration(), declaration, classDescriptor); - scope.addPropertyDescriptor(propertyDescriptor); + VariableDescriptor variableDescriptor = context.getDescriptorResolver() + .resolveObjectDeclaration(scope.getContainingDeclaration(), declaration, classDescriptor); + scope.addVariableDescriptor(variableDescriptor); } return DataFlowUtils.checkStatementType(declaration, context); }