Change local objects resolution, delete LocalVariableDescriptorForObject
Local objects are now resolved as global ones (with derived class objects)
This commit is contained in:
-47
@@ -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 org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -363,24 +364,17 @@ public class AnnotationResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isEnumProperty(@NotNull PropertyDescriptor descriptor) {
|
private static boolean isEnumProperty(@NotNull PropertyDescriptor descriptor) {
|
||||||
|
// TODO: doesn't return true anymore
|
||||||
ClassifierDescriptor classifier = descriptor.getType().getConstructor().getDeclarationDescriptor();
|
ClassifierDescriptor classifier = descriptor.getType().getConstructor().getDeclarationDescriptor();
|
||||||
return classifier != null &&
|
return classifier != null &&
|
||||||
DescriptorUtils.isEnumClass(classifier) &&
|
DescriptorUtils.isEnumClass(classifier) &&
|
||||||
DescriptorUtils.isEnumClassObject(descriptor.getContainingDeclaration());
|
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")
|
@SuppressWarnings("MethodMayBeStatic")
|
||||||
@NotNull
|
@NotNull
|
||||||
public List<AnnotationDescriptor> getResolvedAnnotations(List<JetAnnotationEntry> annotations, BindingTrace trace) {
|
public List<AnnotationDescriptor> getResolvedAnnotations(@NotNull List<JetAnnotationEntry> annotations, @NotNull BindingTrace trace) {
|
||||||
List<AnnotationDescriptor> result = Lists.newArrayList();
|
List<AnnotationDescriptor> result = new ArrayList<AnnotationDescriptor>(annotations.size());
|
||||||
for (JetAnnotationEntry annotation : annotations) {
|
for (JetAnnotationEntry annotation : annotations) {
|
||||||
AnnotationDescriptor annotationDescriptor = trace.get(BindingContext.ANNOTATION, annotation);
|
AnnotationDescriptor annotationDescriptor = trace.get(BindingContext.ANNOTATION, annotation);
|
||||||
if (annotationDescriptor == null) {
|
if (annotationDescriptor == null) {
|
||||||
|
|||||||
@@ -816,77 +816,6 @@ public class DescriptorResolver {
|
|||||||
return variableDescriptor;
|
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
|
@NotNull
|
||||||
public PropertyDescriptor resolvePropertyDescriptor(
|
public PropertyDescriptor resolvePropertyDescriptor(
|
||||||
@NotNull DeclarationDescriptor containingDeclaration,
|
@NotNull DeclarationDescriptor containingDeclaration,
|
||||||
@@ -895,7 +824,6 @@ public class DescriptorResolver {
|
|||||||
@NotNull BindingTrace trace,
|
@NotNull BindingTrace trace,
|
||||||
@NotNull DataFlowInfo dataFlowInfo
|
@NotNull DataFlowInfo dataFlowInfo
|
||||||
) {
|
) {
|
||||||
|
|
||||||
JetModifierList modifierList = property.getModifierList();
|
JetModifierList modifierList = property.getModifierList();
|
||||||
boolean isVar = property.isVar();
|
boolean isVar = property.isVar();
|
||||||
|
|
||||||
|
|||||||
@@ -241,12 +241,4 @@ public class ModifiersChecker {
|
|||||||
}
|
}
|
||||||
return Visibilities.INTERNAL;
|
return Visibilities.INTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static Visibility getDefaultVisibilityForObjectPropertyDescriptor(@NotNull ClassDescriptor objectClassDescriptor) {
|
|
||||||
if (objectClassDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
|
|
||||||
return Visibilities.PUBLIC;
|
|
||||||
}
|
|
||||||
return Visibilities.INTERNAL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-3
@@ -88,9 +88,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito
|
|||||||
context.replaceScope(scope).replaceContextDependency(INDEPENDENT), scope.getContainingDeclaration(), declaration);
|
context.replaceScope(scope).replaceContextDependency(INDEPENDENT), 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) {
|
||||||
VariableDescriptor variableDescriptor = context.expressionTypingServices.getDescriptorResolver()
|
scope.addClassifierDescriptor(classDescriptor);
|
||||||
.resolveObjectDeclaration(scope, scope.getContainingDeclaration(), declaration, classDescriptor, context.trace);
|
|
||||||
scope.addVariableDescriptor(variableDescriptor);
|
|
||||||
}
|
}
|
||||||
return DataFlowUtils.checkStatementType(declaration, context, context.dataFlowInfo);
|
return DataFlowUtils.checkStatementType(declaration, context, context.dataFlowInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user