Change local objects resolution, delete LocalVariableDescriptorForObject

Local objects are now resolved as global ones (with derived class objects)
This commit is contained in:
Alexander Udalov
2013-10-31 19:02:22 +04:00
parent 2967b69c4a
commit edc37bd499
5 changed files with 5 additions and 140 deletions
@@ -1,47 +0,0 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.descriptors.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptorForObject;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.List;
public class LocalVariableDescriptorForObject extends LocalVariableDescriptor implements VariableDescriptorForObject {
private final ClassDescriptor objectClass;
public LocalVariableDescriptorForObject(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull List<AnnotationDescriptor> annotations,
@NotNull Name name,
@NotNull ClassDescriptor objectClass
) {
super(containingDeclaration, annotations, name, objectClass.getDefaultType(), false);
this.objectClass = objectClass;
}
@NotNull
@Override
public ClassDescriptor getObjectClass() {
return objectClass;
}
}
@@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -363,24 +364,17 @@ public class AnnotationResolver {
}
private static boolean isEnumProperty(@NotNull PropertyDescriptor descriptor) {
// TODO: doesn't return true anymore
ClassifierDescriptor classifier = descriptor.getType().getConstructor().getDeclarationDescriptor();
return classifier != null &&
DescriptorUtils.isEnumClass(classifier) &&
DescriptorUtils.isEnumClassObject(descriptor.getContainingDeclaration());
}
@NotNull
public List<AnnotationDescriptor> getResolvedAnnotations(@Nullable JetModifierList modifierList, BindingTrace trace) {
if (modifierList == null) {
return Collections.emptyList();
}
return getResolvedAnnotations(modifierList.getAnnotationEntries(), trace);
}
@SuppressWarnings("MethodMayBeStatic")
@NotNull
public List<AnnotationDescriptor> getResolvedAnnotations(List<JetAnnotationEntry> annotations, BindingTrace trace) {
List<AnnotationDescriptor> result = Lists.newArrayList();
public List<AnnotationDescriptor> getResolvedAnnotations(@NotNull List<JetAnnotationEntry> annotations, @NotNull BindingTrace trace) {
List<AnnotationDescriptor> result = new ArrayList<AnnotationDescriptor>(annotations.size());
for (JetAnnotationEntry annotation : annotations) {
AnnotationDescriptor annotationDescriptor = trace.get(BindingContext.ANNOTATION, annotation);
if (annotationDescriptor == null) {
@@ -816,77 +816,6 @@ public class DescriptorResolver {
return variableDescriptor;
}
@NotNull
public VariableDescriptor resolveObjectDeclaration(
@NotNull JetScope scope,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull JetClassOrObject objectDeclaration,
@NotNull ClassDescriptor classDescriptor, BindingTrace trace
) {
boolean isProperty = (containingDeclaration instanceof NamespaceDescriptor) || (containingDeclaration instanceof ClassDescriptor);
if (isProperty) {
return resolveObjectDeclarationAsPropertyDescriptor(scope, containingDeclaration, objectDeclaration, classDescriptor, trace);
}
else {
return resolveObjectDeclarationAsLocalVariable(containingDeclaration, objectDeclaration, classDescriptor, trace);
}
}
@NotNull
public PropertyDescriptor resolveObjectDeclarationAsPropertyDescriptor(
@NotNull JetScope scope,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull JetClassOrObject objectDeclaration,
@NotNull ClassDescriptor classDescriptor, BindingTrace trace
) {
JetModifierList modifierList = objectDeclaration.getModifierList();
PropertyDescriptorImpl propertyDescriptor = new PropertyDescriptorForObjectImpl(
containingDeclaration,
annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace),
resolveVisibilityFromModifiers(objectDeclaration, getDefaultVisibilityForObjectPropertyDescriptor(classDescriptor)),
JetPsiUtil.safeName(objectDeclaration.getName()),
classDescriptor
);
propertyDescriptor.setType(getTypeForObjectDeclaration(classDescriptor), Collections.<TypeParameterDescriptor>emptyList(),
getExpectedThisObjectIfNeeded(containingDeclaration), NO_RECEIVER_PARAMETER);
propertyDescriptor.initialize(null, null);
JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration();
if (nameAsDeclaration != null) {
trace.record(BindingContext.OBJECT_DECLARATION, nameAsDeclaration, propertyDescriptor);
}
return propertyDescriptor;
}
@NotNull
private static JetType getTypeForObjectDeclaration(@NotNull ClassDescriptor objectClassDescriptor) {
if (objectClassDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
DeclarationDescriptor containingDeclaration = objectClassDescriptor.getContainingDeclaration().getContainingDeclaration();
assert containingDeclaration instanceof ClassDescriptor;
ClassDescriptor enumClass = (ClassDescriptor) containingDeclaration;
assert enumClass.getKind() == ClassKind.ENUM_CLASS;
return enumClass.getDefaultType();
}
return objectClassDescriptor.getDefaultType();
}
@NotNull
private VariableDescriptor resolveObjectDeclarationAsLocalVariable(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull JetClassOrObject objectDeclaration,
@NotNull ClassDescriptor classDescriptor, BindingTrace trace
) {
VariableDescriptorImpl variableDescriptor = new LocalVariableDescriptorForObject(
containingDeclaration,
annotationResolver.getResolvedAnnotations(objectDeclaration.getModifierList(), trace),
JetPsiUtil.safeName(objectDeclaration.getName()),
classDescriptor);
JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration();
if (nameAsDeclaration != null) {
trace.record(BindingContext.VARIABLE, nameAsDeclaration, variableDescriptor);
}
return variableDescriptor;
}
@NotNull
public PropertyDescriptor resolvePropertyDescriptor(
@NotNull DeclarationDescriptor containingDeclaration,
@@ -895,7 +824,6 @@ public class DescriptorResolver {
@NotNull BindingTrace trace,
@NotNull DataFlowInfo dataFlowInfo
) {
JetModifierList modifierList = property.getModifierList();
boolean isVar = property.isVar();
@@ -241,12 +241,4 @@ public class ModifiersChecker {
}
return Visibilities.INTERNAL;
}
@NotNull
public static Visibility getDefaultVisibilityForObjectPropertyDescriptor(@NotNull ClassDescriptor objectClassDescriptor) {
if (objectClassDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
return Visibilities.PUBLIC;
}
return Visibilities.INTERNAL;
}
}
@@ -88,9 +88,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
context.replaceScope(scope).replaceContextDependency(INDEPENDENT), scope.getContainingDeclaration(), declaration);
ClassDescriptor classDescriptor = context.trace.getBindingContext().get(BindingContext.CLASS, declaration);
if (classDescriptor != null) {
VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver()
.resolveObjectDeclaration(scope, scope.getContainingDeclaration(), declaration, classDescriptor, context.trace);
scope.addVariableDescriptor(variableDescriptor);
scope.addClassifierDescriptor(classDescriptor);
}
return DataFlowUtils.checkStatementType(declaration, context, context.dataFlowInfo);
}