Local object declarations support (by Pavel Talanov)
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
+3
-2
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user