Local object declarations support (by Pavel Talanov)

This commit is contained in:
Andrey Breslav
2012-02-03 20:45:29 +04:00
parent 0632f90c53
commit 20178a7bb5
5 changed files with 70 additions and 20 deletions
@@ -11,4 +11,14 @@ public class JetObjectDeclarationName extends JetNamedDeclaration {
public JetObjectDeclarationName(@NotNull ASTNode node) { public JetObjectDeclarationName(@NotNull ASTNode node) {
super(node); super(node);
} }
@Override
public void accept(@NotNull JetVisitorVoid visitor) {
visitor.visitObjectDeclarationName(this);
}
@Override
public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
return visitor.visitObjectDeclarationName(this, data);
}
} }
@@ -391,6 +391,10 @@ public class JetVisitor<R, D> extends PsiElementVisitor {
public R visitObjectDeclaration(JetObjectDeclaration declaration, D data) { public R visitObjectDeclaration(JetObjectDeclaration declaration, D data) {
return visitNamedDeclaration(declaration, data); return visitNamedDeclaration(declaration, data);
} }
public R visitObjectDeclarationName(JetObjectDeclarationName declarationName, D data) {
return visitNamedDeclaration(declarationName, data);
}
public R visitBindingPattern(JetBindingPattern pattern, D data) { public R visitBindingPattern(JetBindingPattern pattern, D data) {
return visitPattern(pattern, data); return visitPattern(pattern, data);
@@ -162,7 +162,7 @@ public class JetVisitorVoid extends PsiElementVisitor {
visitExpression(expression); visitExpression(expression);
} }
// public void visitNewExpression(JetNewExpression expression) { // public void visitNewExpression(JetNewExpression expression) {
// visitExpression(expression); // visitExpression(expression);
// } // }
// //
@@ -390,6 +390,10 @@ public class JetVisitorVoid extends PsiElementVisitor {
visitNamedDeclaration(declaration); visitNamedDeclaration(declaration);
} }
public void visitObjectDeclarationName(JetObjectDeclarationName declaration) {
visitNamedDeclaration(declaration);
}
public void visitBindingPattern(JetBindingPattern pattern) { public void visitBindingPattern(JetBindingPattern pattern) {
visitPattern(pattern); visitPattern(pattern);
} }
@@ -253,14 +253,14 @@ public class DescriptorResolver {
variableType = getVarargParameterType(type); variableType = getVarargParameterType(type);
} }
MutableValueParameterDescriptor valueParameterDescriptor = new ValueParameterDescriptorImpl( MutableValueParameterDescriptor valueParameterDescriptor = new ValueParameterDescriptorImpl(
declarationDescriptor, declarationDescriptor,
index, index,
annotationResolver.createAnnotationStubs(valueParameter.getModifierList()), annotationResolver.createAnnotationStubs(valueParameter.getModifierList()),
JetPsiUtil.safeName(valueParameter.getName()), JetPsiUtil.safeName(valueParameter.getName()),
valueParameter.isMutable(), valueParameter.isMutable(),
variableType, variableType,
valueParameter.getDefaultValue() != null, valueParameter.getDefaultValue() != null,
varargElementType varargElementType
); );
trace.record(BindingContext.VALUE_PARAMETER, valueParameter, valueParameterDescriptor); trace.record(BindingContext.VALUE_PARAMETER, valueParameter, valueParameterDescriptor);
@@ -442,21 +442,36 @@ public class DescriptorResolver {
return variableDescriptor; 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(); JetModifierList modifierList = objectDeclaration.getModifierList();
Visibility visibility = resolveVisibilityFromModifiers(objectDeclaration.getModifierList());
PropertyDescriptor propertyDescriptor = new PropertyDescriptor( PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
containingDeclaration, containingDeclaration,
annotationResolver.createAnnotationStubs(modifierList), annotationResolver.createAnnotationStubs(modifierList),
Modality.FINAL, Modality.FINAL,
resolveVisibilityFromModifiers(objectDeclaration.getModifierList()), visibility,
false, false,
true, true,
JetPsiUtil.safeName(objectDeclaration.getName()) JetPsiUtil.safeName(objectDeclaration.getName())
); );
propertyDescriptor.setType(classDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), ReceiverDescriptor.NO_RECEIVER); propertyDescriptor.setType(classDescriptor.getDefaultType(), Collections.<TypeParameterDescriptor>emptyList(), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDeclaration), ReceiverDescriptor.NO_RECEIVER);
propertyDescriptor.initialize(null, null); propertyDescriptor.initialize(createDefaultGetter(propertyDescriptor), null);
JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration(); JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration();
if (nameAsDeclaration != null) { if (nameAsDeclaration != null) {
trace.record(BindingContext.OBJECT_DECLARATION, nameAsDeclaration, propertyDescriptor); trace.record(BindingContext.OBJECT_DECLARATION, nameAsDeclaration, propertyDescriptor);
@@ -464,10 +479,26 @@ public class DescriptorResolver {
return propertyDescriptor; 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, public JetScope getPropertyDeclarationInnerScope(@NotNull JetScope outerScope,
@NotNull PropertyDescriptor propertyDescriptor, List<TypeParameterDescriptor> typeParameters, @NotNull PropertyDescriptor propertyDescriptor, List<TypeParameterDescriptor> typeParameters,
ReceiverDescriptor receiver) ReceiverDescriptor receiver) {
{
WritableScopeImpl result = new WritableScopeImpl(outerScope, propertyDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Property declaration inner scope"); WritableScopeImpl result = new WritableScopeImpl(outerScope, propertyDescriptor, new TraceBasedRedeclarationHandler(trace)).setDebugName("Property declaration inner scope");
for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) { for (TypeParameterDescriptor typeParameterDescriptor : typeParameters) {
result.addTypeParameterDescriptor(typeParameterDescriptor); result.addTypeParameterDescriptor(typeParameterDescriptor);
@@ -613,7 +644,7 @@ public class DescriptorResolver {
} }
return defaultModality; return defaultModality;
} }
@NotNull @NotNull
/*package*/ static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList) { /*package*/ static Visibility resolveVisibilityFromModifiers(@Nullable JetModifierList modifierList) {
return resolveVisibilityFromModifiers(modifierList, Visibility.INTERNAL); return resolveVisibilityFromModifiers(modifierList, Visibility.INTERNAL);
@@ -63,8 +63,9 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
TopDownAnalyzer.processObject(context.semanticServices, context.trace, scope, scope.getContainingDeclaration(), declaration); TopDownAnalyzer.processObject(context.semanticServices, context.trace, scope, scope.getContainingDeclaration(), declaration);
ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration); ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration);
if (classDescriptor != null) { if (classDescriptor != null) {
PropertyDescriptor propertyDescriptor = context.getDescriptorResolver().resolveObjectDeclarationAsPropertyDescriptor(scope.getContainingDeclaration(), declaration, classDescriptor); VariableDescriptor variableDescriptor = context.getDescriptorResolver()
scope.addPropertyDescriptor(propertyDescriptor); .resolveObjectDeclaration(scope.getContainingDeclaration(), declaration, classDescriptor);
scope.addVariableDescriptor(variableDescriptor);
} }
return DataFlowUtils.checkStatementType(declaration, context); return DataFlowUtils.checkStatementType(declaration, context);
} }