diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodiesResolveContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodiesResolveContext.java index 115a3c88071..54761cd0d60 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodiesResolveContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodiesResolveContext.java @@ -31,7 +31,7 @@ import java.util.Map; public interface BodiesResolveContext { Collection getFiles(); - Map getClasses(); + Map getClasses(); Map getObjects(); Map getProperties(); Map getFunctions(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 45008535b9a..5d9aadd9161 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -159,7 +159,7 @@ public class BodyResolver { private void resolveDelegationSpecifierLists() { // TODO : Make sure the same thing is not initialized twice - for (Map.Entry entry : context.getClasses().entrySet()) { + for (Map.Entry entry : context.getClasses().entrySet()) { resolveDelegationSpecifierList(entry.getKey(), entry.getValue()); } for (Map.Entry entry : context.getObjects().entrySet()) { @@ -335,7 +335,7 @@ public class BodyResolver { } private void resolveClassAnnotations() { - for (Map.Entry entry : context.getClasses().entrySet()) { + for (Map.Entry entry : context.getClasses().entrySet()) { resolveAnnotationArguments(entry.getValue().getScopeForSupertypeResolution(), entry.getKey()); } for (Map.Entry entry : context.getObjects().entrySet()) { @@ -344,7 +344,7 @@ public class BodyResolver { } private void resolveAnonymousInitializers() { - for (Map.Entry entry : context.getClasses().entrySet()) { + for (Map.Entry entry : context.getClasses().entrySet()) { resolveAnonymousInitializers(entry.getKey(), entry.getValue()); } for (Map.Entry entry : context.getObjects().entrySet()) { @@ -377,8 +377,9 @@ public class BodyResolver { } private void resolvePrimaryConstructorParameters() { - for (Map.Entry entry : context.getClasses().entrySet()) { - JetClass klass = entry.getKey(); + for (Map.Entry 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 processed = Sets.newHashSet(); - for (Map.Entry entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); + for (Map.Entry entry : context.getClasses().entrySet()) { + if (!(entry.getKey() instanceof JetClass)) continue; + JetClass jetClass = (JetClass) entry.getKey(); if (!context.completeAnalysisNeeded(jetClass)) continue; MutableClassDescriptor classDescriptor = entry.getValue(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CachedBodiesResolveContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CachedBodiesResolveContext.java index e3f8df6d843..875f0a74e02 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CachedBodiesResolveContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CachedBodiesResolveContext.java @@ -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 files; - private final Map classes; + private final Map classes; private final Map objects; private final Map properties; private final Map functions; @@ -68,7 +70,7 @@ public class CachedBodiesResolveContext implements BodiesResolveContext { } @Override - public Map getClasses() { + public Map getClasses() { return classes; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java index 3bf6a586695..07b5d4cf04f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java @@ -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); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index d47d8f6c9ab..2b923ac1a3e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -127,35 +127,33 @@ public class DeclarationResolver { } private void resolveAnnotationConstructors() { - for (Map.Entry entry : context.getClasses().entrySet()) { + for (Map.Entry 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 entry : context.getClasses().entrySet()) { + for (Map.Entry 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 entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); - MutableClassDescriptor descriptor = entry.getValue(); - resolveAnnotationsForClassOrObject(annotationResolver, jetClass, descriptor); + for (Map.Entry entry : context.getClasses().entrySet()) { + resolveAnnotationsForClassOrObject(annotationResolver, entry.getKey(), entry.getValue()); } for (Map.Entry 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 entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); + for (Map.Entry 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 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 entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); + for (Map.Entry 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); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 53db624a27f..e5887dac5db 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -48,14 +48,20 @@ public class DeclarationsChecker { } public void process(@NotNull BodiesResolveContext bodiesResolveContext) { - Map classes = bodiesResolveContext.getClasses(); - for (Map.Entry entry : classes.entrySet()) { - JetClass aClass = entry.getKey(); + Map classes = bodiesResolveContext.getClasses(); + for (Map.Entry 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 objects = bodiesResolveContext.getObjects(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index b6fa118fe2d..93b1f33f8e7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -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 inClasses = pair.first; MultiMap inNamespaces = pair.second; - for (Map.Entry entry : context.getClasses().entrySet()) { + for (Map.Entry entry : context.getClasses().entrySet()) { checkOverloadsInAClass(entry.getValue(), entry.getKey(), inClasses.get(entry.getValue())); } for (Map.Entry entry : context.getObjects().entrySet()) { @@ -94,8 +93,7 @@ public class OverloadResolver { MultiMap inClasses = MultiMap.create(); MultiMap inNamespaces = MultiMap.create(); - for (Map.Entry 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; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 023b895c093..d77f3d94995 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -213,7 +213,7 @@ public class OverrideResolver { } private void checkOverrides() { - for (Map.Entry entry : context.getClasses().entrySet()) { + for (Map.Entry entry : context.getClasses().entrySet()) { checkOverridesInAClass(entry.getValue(), entry.getKey()); } for (Map.Entry entry : context.getObjects().entrySet()) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java index b00cb57d3dc..399274d498e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -41,7 +41,7 @@ public class TopDownAnalysisContext implements BodiesResolveContext { private DataFlowInfo outerDataFlowInfo = DataFlowInfo.EMPTY; - private final Map classes = Maps.newLinkedHashMap(); + private final Map classes = Maps.newLinkedHashMap(); private final Map objects = Maps.newLinkedHashMap(); protected final Map namespaceDescriptors = Maps.newHashMap(); private List classesTopologicalOrder = null; @@ -107,7 +107,7 @@ public class TopDownAnalysisContext implements BodiesResolveContext { } @Override - public Map getClasses() { + public Map getClasses() { return classes; } @@ -183,6 +183,7 @@ public class TopDownAnalysisContext implements BodiesResolveContext { this.classesTopologicalOrder = classesTopologicalOrder; } + @Override @NotNull public DataFlowInfo getOuterDataFlowInfo() { return outerDataFlowInfo; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index 974746a8051..55f4f8f91ff 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -149,7 +149,7 @@ public class TypeHierarchyResolver { checkTypesInClassHeaders(); // Check bounds in the types used in generic bounds and supertype lists } - @Nullable + @NotNull private Collection collectNamespacesAndClassifiers( @NotNull JetScope outerScope, @NotNull NamespaceLikeBuilder owner, @@ -176,29 +176,38 @@ public class TypeHierarchyResolver { } private void createTypeConstructors() { - for (Map.Entry entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); + for (Map.Entry 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 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(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.emptyList()); + descriptor.createTypeConstructor(); + } + private void resolveTypesInClassHeaders() { - for (Map.Entry entry : context.getClasses().entrySet()) { - JetClass jetClass = entry.getKey(); + for (Map.Entry 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 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()); } diff --git a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java index 47cf7e99734..5936b142d81 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/ResolveElementCache.java @@ -428,7 +428,7 @@ public class ResolveElementCache { } @Override - public Map getClasses() { + public Map getClasses() { return Collections.emptyMap(); }