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) {
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) {
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);
@@ -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);
}
@@ -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.<TypeParameterDescriptor>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<TypeParameterDescriptor> typeParameters,
ReceiverDescriptor receiver)
{
@NotNull PropertyDescriptor propertyDescriptor, List<TypeParameterDescriptor> 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);
@@ -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);
}