BodiesResolveContext.getClasses()'s key is JetClassOrObject

This has no effect right now, but is a preparation for the objects refactoring,
when BodiesResolveContext.getObjects() will be dropped
This commit is contained in:
Alexander Udalov
2013-11-11 20:41:20 +04:00
parent 008e5f0b13
commit 27f832a713
11 changed files with 85 additions and 71 deletions
@@ -31,7 +31,7 @@ import java.util.Map;
public interface BodiesResolveContext {
Collection<JetFile> getFiles();
Map<JetClass, MutableClassDescriptor> getClasses();
Map<JetClassOrObject, MutableClassDescriptor> getClasses();
Map<JetObjectDeclaration, MutableClassDescriptor> getObjects();
Map<JetProperty, PropertyDescriptor> getProperties();
Map<JetNamedFunction, SimpleFunctionDescriptor> getFunctions();
@@ -159,7 +159,7 @@ public class BodyResolver {
private void resolveDelegationSpecifierLists() {
// TODO : Make sure the same thing is not initialized twice
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveDelegationSpecifierList(entry.getKey(), entry.getValue());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
@@ -335,7 +335,7 @@ public class BodyResolver {
}
private void resolveClassAnnotations() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnnotationArguments(entry.getValue().getScopeForSupertypeResolution(), entry.getKey());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
@@ -344,7 +344,7 @@ public class BodyResolver {
}
private void resolveAnonymousInitializers() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnonymousInitializers(entry.getKey(), entry.getValue());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
@@ -377,8 +377,9 @@ public class BodyResolver {
}
private void resolvePrimaryConstructorParameters() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass klass = entry.getKey();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
if (!(entry.getKey() instanceof JetClass)) continue;
JetClass klass = (JetClass) entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
ConstructorDescriptor unsubstitutedPrimaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor();
@@ -412,8 +413,9 @@ public class BodyResolver {
// Member properties
Set<JetProperty> processed = Sets.newHashSet();
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass jetClass = entry.getKey();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
if (!(entry.getKey() instanceof JetClass)) continue;
JetClass jetClass = (JetClass) entry.getKey();
if (!context.completeAnalysisNeeded(jetClass)) continue;
MutableClassDescriptor classDescriptor = entry.getValue();
@@ -20,7 +20,9 @@ import com.google.common.base.Function;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
@@ -37,7 +39,7 @@ import java.util.Map;
*/
public class CachedBodiesResolveContext implements BodiesResolveContext {
private final Collection<JetFile> files;
private final Map<JetClass, MutableClassDescriptor> classes;
private final Map<JetClassOrObject, MutableClassDescriptor> classes;
private final Map<JetObjectDeclaration, MutableClassDescriptor> objects;
private final Map<JetProperty, PropertyDescriptor> properties;
private final Map<JetNamedFunction, SimpleFunctionDescriptor> functions;
@@ -68,7 +70,7 @@ public class CachedBodiesResolveContext implements BodiesResolveContext {
}
@Override
public Map<JetClass, MutableClassDescriptor> getClasses() {
public Map<JetClassOrObject, MutableClassDescriptor> getClasses() {
return classes;
}
@@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.types.JetType;
import javax.inject.Inject;
import java.util.List;
import java.util.Map;
import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
@@ -49,7 +48,7 @@ public class ControlFlowAnalyzer {
if (!bodiesResolveContext.completeAnalysisNeeded(file)) continue;
checkDeclarationContainer(file);
}
for (JetClass aClass : bodiesResolveContext.getClasses().keySet()) {
for (JetClassOrObject aClass : bodiesResolveContext.getClasses().keySet()) {
if (!bodiesResolveContext.completeAnalysisNeeded(aClass)) continue;
checkDeclarationContainer(aClass);
}
@@ -127,35 +127,33 @@ public class DeclarationResolver {
}
private void resolveAnnotationConstructors() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
if (DescriptorUtils.isAnnotationClass(classDescriptor)) {
processPrimaryConstructor(classDescriptor, entry.getKey());
if (classOrObject instanceof JetClass && DescriptorUtils.isAnnotationClass(classDescriptor)) {
processPrimaryConstructor(classDescriptor, (JetClass) classOrObject);
}
}
}
private void resolveConstructorHeaders() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
if (!DescriptorUtils.isAnnotationClass(classDescriptor)) {
processPrimaryConstructor(classDescriptor, entry.getKey());
if (classOrObject instanceof JetClass && !DescriptorUtils.isAnnotationClass(classDescriptor)) {
processPrimaryConstructor(classDescriptor, (JetClass) classOrObject);
}
}
}
private void resolveAnnotationStubsOnClassesAndConstructors() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass jetClass = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
resolveAnnotationsForClassOrObject(annotationResolver, jetClass, descriptor);
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnnotationsForClassOrObject(annotationResolver, entry.getKey(), entry.getValue());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
JetObjectDeclaration objectDeclaration = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
resolveAnnotationsForClassOrObject(annotationResolver, objectDeclaration, descriptor);
resolveAnnotationsForClassOrObject(annotationResolver, entry.getKey(), entry.getValue());
}
}
@@ -175,31 +173,27 @@ public class DeclarationResolver {
resolveFunctionAndPropertyHeaders(namespace.getDeclarations(), namespaceScope, namespaceScope, namespaceScope, namespaceDescriptor);
}
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass jetClass = entry.getKey();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
JetClassBody jetClassBody = jetClass.getBody();
JetClassBody jetClassBody = classOrObject.getBody();
if (classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS && jetClassBody != null) {
trace.report(ANNOTATION_CLASS_WITH_BODY.on(jetClassBody));
}
resolveFunctionAndPropertyHeaders(
jetClass.getDeclarations(), classDescriptor.getScopeForMemberResolution(),
classOrObject.getDeclarations(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getBuilder());
// processPrimaryConstructor(classDescriptor, jetClass);
// for (JetSecondaryConstructor jetConstructor : jetClass.getSecondaryConstructors()) {
// processSecondaryConstructor(classDescriptor, jetConstructor);
// }
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
JetObjectDeclaration object = entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
resolveFunctionAndPropertyHeaders(object.getDeclarations(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getBuilder());
classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getBuilder());
}
scriptHeaderResolver.resolveScriptDeclarations();
@@ -274,11 +268,11 @@ public class DeclarationResolver {
}
private void createFunctionsForDataClasses() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass jetClass = entry.getKey();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClassOrObject klass = entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
if (jetClass.hasPrimaryConstructor() && KotlinBuiltIns.getInstance().isData(classDescriptor)) {
if (klass instanceof JetClass && klass.hasPrimaryConstructor() && KotlinBuiltIns.getInstance().isData(classDescriptor)) {
ConstructorDescriptor constructor = DescriptorUtils.getConstructorOfDataClass(classDescriptor);
createComponentFunctions(classDescriptor, constructor);
createCopyFunction(classDescriptor, constructor);
@@ -48,14 +48,20 @@ public class DeclarationsChecker {
}
public void process(@NotNull BodiesResolveContext bodiesResolveContext) {
Map<JetClass, MutableClassDescriptor> classes = bodiesResolveContext.getClasses();
for (Map.Entry<JetClass, MutableClassDescriptor> entry : classes.entrySet()) {
JetClass aClass = entry.getKey();
Map<JetClassOrObject, MutableClassDescriptor> classes = bodiesResolveContext.getClasses();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : classes.entrySet()) {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor classDescriptor = entry.getValue();
if (!bodiesResolveContext.completeAnalysisNeeded(aClass)) continue;
if (!bodiesResolveContext.completeAnalysisNeeded(classOrObject)) continue;
checkClass(aClass, classDescriptor);
modifiersChecker.checkModifiersForDeclaration(aClass, classDescriptor);
if (classOrObject instanceof JetClass) {
checkClass((JetClass) classOrObject, classDescriptor);
}
else if (classOrObject instanceof JetObjectDeclaration) {
checkObject((JetObjectDeclaration) classOrObject);
}
modifiersChecker.checkModifiersForDeclaration(classOrObject, classDescriptor);
}
Map<JetObjectDeclaration, MutableClassDescriptor> objects = bodiesResolveContext.getObjects();
@@ -23,7 +23,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
@@ -60,7 +59,7 @@ public class OverloadResolver {
MultiMap<ClassDescriptor, ConstructorDescriptor> inClasses = pair.first;
MultiMap<Key, ConstructorDescriptor> inNamespaces = pair.second;
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
checkOverloadsInAClass(entry.getValue(), entry.getKey(), inClasses.get(entry.getValue()));
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
@@ -94,8 +93,7 @@ public class OverloadResolver {
MultiMap<ClassDescriptor, ConstructorDescriptor> inClasses = MultiMap.create();
MultiMap<Key, ConstructorDescriptor> inNamespaces = MultiMap.create();
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
MutableClassDescriptor klass = entry.getValue();
for (MutableClassDescriptor klass : context.getClasses().values()) {
DeclarationDescriptor containingDeclaration = klass.getContainingDeclaration();
if (containingDeclaration instanceof NamespaceDescriptor) {
NamespaceDescriptor namespaceDescriptor = (NamespaceDescriptor) containingDeclaration;
@@ -213,7 +213,7 @@ public class OverrideResolver {
}
private void checkOverrides() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
checkOverridesInAClass(entry.getValue(), entry.getKey());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
@@ -41,7 +41,7 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
private DataFlowInfo outerDataFlowInfo = DataFlowInfo.EMPTY;
private final Map<JetClass, MutableClassDescriptor> classes = Maps.newLinkedHashMap();
private final Map<JetClassOrObject, MutableClassDescriptor> classes = Maps.newLinkedHashMap();
private final Map<JetObjectDeclaration, MutableClassDescriptor> objects = Maps.newLinkedHashMap();
protected final Map<JetFile, NamespaceDescriptorImpl> namespaceDescriptors = Maps.newHashMap();
private List<MutableClassDescriptorLite> classesTopologicalOrder = null;
@@ -107,7 +107,7 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
}
@Override
public Map<JetClass, MutableClassDescriptor> getClasses() {
public Map<JetClassOrObject, MutableClassDescriptor> getClasses() {
return classes;
}
@@ -183,6 +183,7 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
this.classesTopologicalOrder = classesTopologicalOrder;
}
@Override
@NotNull
public DataFlowInfo getOuterDataFlowInfo() {
return outerDataFlowInfo;
@@ -149,7 +149,7 @@ public class TypeHierarchyResolver {
checkTypesInClassHeaders(); // Check bounds in the types used in generic bounds and supertype lists
}
@Nullable
@NotNull
private Collection<JetDeclarationContainer> collectNamespacesAndClassifiers(
@NotNull JetScope outerScope,
@NotNull NamespaceLikeBuilder owner,
@@ -176,29 +176,38 @@ public class TypeHierarchyResolver {
}
private void createTypeConstructors() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass jetClass = entry.getKey();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
descriptorResolver.resolveMutableClassDescriptor(jetClass, descriptor, trace);
descriptor.createTypeConstructor();
if (classOrObject instanceof JetClass) {
descriptorResolver.resolveMutableClassDescriptor((JetClass) classOrObject, descriptor, trace);
descriptor.createTypeConstructor();
}
else if (classOrObject instanceof JetObjectDeclaration) {
initializeObject((JetObjectDeclaration) classOrObject, descriptor);
}
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
JetObjectDeclaration objectDeclaration = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
descriptor.setModality(Modality.FINAL);
descriptor.setVisibility(resolveVisibilityFromModifiers(objectDeclaration, getDefaultClassVisibility(descriptor)));
descriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
descriptor.createTypeConstructor();
initializeObject(entry.getKey(), entry.getValue());
}
}
private static void initializeObject(@NotNull JetObjectDeclaration declaration, @NotNull MutableClassDescriptor descriptor) {
descriptor.setModality(Modality.FINAL);
descriptor.setVisibility(resolveVisibilityFromModifiers(declaration, getDefaultClassVisibility(descriptor)));
descriptor.setTypeParameterDescriptors(Collections.<TypeParameterDescriptor>emptyList());
descriptor.createTypeConstructor();
}
private void resolveTypesInClassHeaders() {
for (Map.Entry<JetClass, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClass jetClass = entry.getKey();
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
descriptorResolver.resolveGenericBounds(jetClass, descriptor.getScopeForSupertypeResolution(),
(List) descriptor.getTypeConstructor().getParameters(), trace);
descriptorResolver.resolveSupertypesForMutableClassDescriptor(jetClass, descriptor, trace);
if (classOrObject instanceof JetClass) {
descriptorResolver.resolveGenericBounds((JetClass) classOrObject, descriptor.getScopeForSupertypeResolution(),
(List) descriptor.getTypeConstructor().getParameters(), trace);
}
descriptorResolver.resolveSupertypesForMutableClassDescriptor(classOrObject, descriptor, trace);
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
JetClassOrObject jetClass = entry.getKey();
@@ -395,11 +404,14 @@ public class TypeHierarchyResolver {
}
private void checkTypesInClassHeaders() {
for (JetClass jetClass : context.getClasses().keySet()) {
for (JetDelegationSpecifier delegationSpecifier : jetClass.getDelegationSpecifiers()) {
for (JetClassOrObject classOrObject : context.getClasses().keySet()) {
for (JetDelegationSpecifier delegationSpecifier : classOrObject.getDelegationSpecifiers()) {
checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference());
}
if (!(classOrObject instanceof JetClass)) continue;
JetClass jetClass = (JetClass) classOrObject;
for (JetTypeParameter jetTypeParameter : jetClass.getTypeParameters()) {
checkBoundsForTypeInClassHeader(jetTypeParameter.getExtendsBound());
}
@@ -428,7 +428,7 @@ public class ResolveElementCache {
}
@Override
public Map<JetClass, MutableClassDescriptor> getClasses() {
public Map<JetClassOrObject, MutableClassDescriptor> getClasses() {
return Collections.emptyMap();
}