Drop BodiesResolveContext.getObjects()

Objects are stored in the same place where classes are
This commit is contained in:
Alexander Udalov
2013-10-30 22:41:20 +04:00
parent 6c74b10f6c
commit 197eaa0b2e
12 changed files with 28 additions and 115 deletions
@@ -19,7 +19,9 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.base.Function;
import com.intellij.psi.PsiElement;
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;
@@ -32,7 +34,6 @@ import java.util.Map;
public interface BodiesResolveContext {
Collection<JetFile> getFiles();
Map<JetClassOrObject, MutableClassDescriptor> getClasses();
Map<JetObjectDeclaration, MutableClassDescriptor> getObjects();
Map<JetProperty, PropertyDescriptor> getProperties();
Map<JetNamedFunction, SimpleFunctionDescriptor> getFunctions();
Function<JetDeclaration, JetScope> getDeclaringScopes();
@@ -160,18 +160,13 @@ public class BodyResolver {
private void resolveDelegationSpecifierLists() {
// TODO : Make sure the same thing is not initialized twice
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveDelegationSpecifierList(entry.getKey(), entry.getValue());
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
resolveDelegationSpecifierList(classOrObject, descriptor,
descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForSupertypeResolution(),
descriptor.getScopeForMemberResolution());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
resolveDelegationSpecifierList(entry.getKey(), entry.getValue());
}
}
private void resolveDelegationSpecifierList(JetClassOrObject jetClass, MutableClassDescriptor descriptor) {
resolveDelegationSpecifierList(jetClass, descriptor,
descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForSupertypeResolution(),
descriptor.getScopeForMemberResolution());
}
public void resolveDelegationSpecifierList(@NotNull JetClassOrObject jetClass, @NotNull final ClassDescriptor descriptor,
@@ -338,23 +333,15 @@ public class BodyResolver {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnnotationArguments(entry.getValue().getScopeForSupertypeResolution(), entry.getKey());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
resolveAnnotationArguments(entry.getValue().getScopeForSupertypeResolution(), entry.getKey());
}
}
private void resolveAnonymousInitializers() {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnonymousInitializers(entry.getKey(), entry.getValue());
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
resolveAnonymousInitializers(classOrObject, descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForInitializers());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
resolveAnonymousInitializers(entry.getKey(), entry.getValue());
}
}
private void resolveAnonymousInitializers(JetClassOrObject jetClassOrObject, MutableClassDescriptor classDescriptor) {
resolveAnonymousInitializers(jetClassOrObject, classDescriptor.getUnsubstitutedPrimaryConstructor(),
classDescriptor.getScopeForInitializers());
}
public void resolveAnonymousInitializers(JetClassOrObject jetClassOrObject,
@@ -40,7 +40,6 @@ import java.util.Map;
public class CachedBodiesResolveContext implements BodiesResolveContext {
private final Collection<JetFile> files;
private final Map<JetClassOrObject, MutableClassDescriptor> classes;
private final Map<JetObjectDeclaration, MutableClassDescriptor> objects;
private final Map<JetProperty, PropertyDescriptor> properties;
private final Map<JetNamedFunction, SimpleFunctionDescriptor> functions;
private final Function<JetDeclaration, JetScope> declaringScopes;
@@ -53,7 +52,6 @@ public class CachedBodiesResolveContext implements BodiesResolveContext {
public CachedBodiesResolveContext(TopDownAnalysisContext context) {
files = Collections.unmodifiableCollection(context.getFiles());
classes = Collections.unmodifiableMap(context.getClasses());
objects = Collections.unmodifiableMap(context.getObjects());
properties = Collections.unmodifiableMap(context.getProperties());
functions = Collections.unmodifiableMap(context.getFunctions());
declaringScopes = context.getDeclaringScopes();
@@ -74,11 +72,6 @@ public class CachedBodiesResolveContext implements BodiesResolveContext {
return classes;
}
@Override
public Map<JetObjectDeclaration, MutableClassDescriptor> getObjects() {
return objects;
}
@Override
public Map<JetProperty, PropertyDescriptor> getProperties() {
return properties;
@@ -52,10 +52,6 @@ public class ControlFlowAnalyzer {
if (!bodiesResolveContext.completeAnalysisNeeded(aClass)) continue;
checkDeclarationContainer(aClass);
}
for (JetObjectDeclaration objectDeclaration : bodiesResolveContext.getObjects().keySet()) {
if (!bodiesResolveContext.completeAnalysisNeeded(objectDeclaration)) continue;
checkDeclarationContainer(objectDeclaration);
}
for (Map.Entry<JetNamedFunction, SimpleFunctionDescriptor> entry : bodiesResolveContext.getFunctions().entrySet()) {
JetNamedFunction function = entry.getKey();
SimpleFunctionDescriptor functionDescriptor = entry.getValue();
@@ -150,18 +150,12 @@ public class DeclarationResolver {
private void resolveAnnotationStubsOnClassesAndConstructors() {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnnotationsForClassOrObject(annotationResolver, entry.getKey(), entry.getValue());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
resolveAnnotationsForClassOrObject(annotationResolver, entry.getKey(), entry.getValue());
}
}
private void resolveAnnotationsForClassOrObject(AnnotationResolver annotationResolver, JetClassOrObject jetClass, MutableClassDescriptor descriptor) {
JetModifierList modifierList = jetClass.getModifierList();
if (modifierList != null) {
descriptor.getAnnotations().addAll(annotationResolver.resolveAnnotationsWithoutArguments(
descriptor.getScopeForSupertypeResolution(), modifierList, trace));
JetModifierList modifierList = entry.getKey().getModifierList();
if (modifierList != null) {
MutableClassDescriptor descriptor = entry.getValue();
descriptor.getAnnotations().addAll(annotationResolver.resolveAnnotationsWithoutArguments(
descriptor.getScopeForSupertypeResolution(), modifierList, trace));
}
}
}
@@ -187,14 +181,6 @@ public class DeclarationResolver {
classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getBuilder());
}
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());
}
scriptHeaderResolver.resolveScriptDeclarations();
@@ -389,8 +375,7 @@ public class DeclarationResolver {
}
private void checkRedeclarationsInInnerClassNames() {
Iterable<MutableClassDescriptor> classesAndObjects = Iterables.concat(context.getClasses().values(), context.getObjects().values());
for (MutableClassDescriptor classDescriptor : classesAndObjects) {
for (MutableClassDescriptor classDescriptor : context.getClasses().values()) {
if (classDescriptor.getKind() == ClassKind.CLASS_OBJECT) {
// Class objects should be considered during analysing redeclarations in classes
continue;
@@ -64,16 +64,6 @@ public class DeclarationsChecker {
modifiersChecker.checkModifiersForDeclaration(classOrObject, classDescriptor);
}
Map<JetObjectDeclaration, MutableClassDescriptor> objects = bodiesResolveContext.getObjects();
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : objects.entrySet()) {
JetObjectDeclaration objectDeclaration = entry.getKey();
MutableClassDescriptor objectDescriptor = entry.getValue();
if (!bodiesResolveContext.completeAnalysisNeeded(objectDeclaration)) continue;
checkObject(objectDeclaration);
modifiersChecker.checkModifiersForDeclaration(objectDeclaration, objectDescriptor);
}
Map<JetNamedFunction, SimpleFunctionDescriptor> functions = bodiesResolveContext.getFunctions();
for (Map.Entry<JetNamedFunction, SimpleFunctionDescriptor> entry : functions.entrySet()) {
JetNamedFunction function = entry.getKey();
@@ -62,9 +62,6 @@ public class OverloadResolver {
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()) {
checkOverloadsInAClass(entry.getValue(), entry.getKey(), inClasses.get(entry.getValue()));
}
checkOverloadsInANamespace(inNamespaces);
}
@@ -84,10 +84,7 @@ public class OverrideResolver {
* Generate fake overrides and add overridden descriptors to existing descriptors.
*/
private void generateOverridesAndDelegation() {
Set<MutableClassDescriptor> ourClasses = new HashSet<MutableClassDescriptor>();
ourClasses.addAll(context.getClasses().values());
ourClasses.addAll(context.getObjects().values());
Set<MutableClassDescriptor> ourClasses = new HashSet<MutableClassDescriptor>(context.getClasses().values());
Set<ClassifierDescriptor> processed = new HashSet<ClassifierDescriptor>();
for (MutableClassDescriptorLite klass : ContainerUtil.reverse(context.getClassesTopologicalOrder())) {
@@ -224,9 +221,6 @@ public class OverrideResolver {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
checkOverridesInAClass(entry.getValue(), entry.getKey());
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
checkOverridesInAClass(entry.getValue(), entry.getKey());
}
}
protected void checkOverridesInAClass(@NotNull MutableClassDescriptor classDescriptor, @NotNull JetClassOrObject klass) {
@@ -655,17 +649,14 @@ public class OverrideResolver {
}
private void checkParameterOverridesForAllClasses() {
List<MutableClassDescriptor> allClasses = Lists.newArrayList(context.getClasses().values());
allClasses.addAll(context.getObjects().values());
for (MutableClassDescriptor classDescriptor : allClasses) {
Collection<CallableMemberDescriptor> members = classDescriptor.getAllCallableMembers();
for (CallableMemberDescriptor member : members) {
for (MutableClassDescriptor classDescriptor : context.getClasses().values()) {
for (CallableMemberDescriptor member : classDescriptor.getAllCallableMembers()) {
checkOverridesForParameters(member);
}
}
}
private void checkOverridesForParameters(CallableMemberDescriptor declared) {
private void checkOverridesForParameters(@NotNull CallableMemberDescriptor declared) {
boolean noDeclaration = declared.getKind() != CallableMemberDescriptor.Kind.DECLARATION;
if (!noDeclaration) {
// No check if the function is not marked as 'override'
@@ -42,7 +42,6 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
private DataFlowInfo outerDataFlowInfo = DataFlowInfo.EMPTY;
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;
@@ -111,11 +110,6 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
return classes;
}
@Override
public Map<JetObjectDeclaration, MutableClassDescriptor> getObjects() {
return objects;
}
public Map<JetFile, WritableScope> getNamespaceScopes() {
return namespaceScopes;
}
@@ -142,9 +142,6 @@ public class TopDownAnalyzer {
for (MutableClassDescriptor mutableClassDescriptor : context.getClasses().values()) {
mutableClassDescriptor.lockScopes();
}
for (MutableClassDescriptor mutableClassDescriptor : context.getObjects().values()) {
mutableClassDescriptor.lockScopes();
}
for (Map.Entry<JetFile, WritableScope> namespaceScope : context.getNamespaceScopes().entrySet()) {
// todo: this is hack in favor of REPL
if(!namespaceScope.getKey().isScript())
@@ -21,7 +21,6 @@ import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNameIdentifierOwner;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
@@ -188,9 +187,6 @@ public class TypeHierarchyResolver {
initializeObject((JetObjectDeclaration) classOrObject, descriptor);
}
}
for (Map.Entry<JetObjectDeclaration, MutableClassDescriptor> entry : context.getObjects().entrySet()) {
initializeObject(entry.getKey(), entry.getValue());
}
}
private static void initializeObject(@NotNull JetObjectDeclaration declaration, @NotNull MutableClassDescriptor descriptor) {
@@ -209,23 +205,20 @@ public class TypeHierarchyResolver {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
if (classOrObject instanceof JetClass) {
//noinspection unchecked
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();
MutableClassDescriptor descriptor = entry.getValue();
descriptorResolver.resolveSupertypesForMutableClassDescriptor(jetClass, descriptor, trace);
}
}
private List<MutableClassDescriptorLite> topologicallySortClassesAndObjects() {
// A topsort is needed only for better diagnostics:
// edges that get removed to disconnect loops are more reasonable in this case
//noinspection unchecked
return DFS.topologicalOrder(
ContainerUtil.<MutableClassDescriptorLite>concat(context.getClasses().values(), context.getObjects().values()),
(Iterable) context.getClasses().values(),
new DFS.Neighbors<MutableClassDescriptorLite>() {
@NotNull
@Override
@@ -425,12 +418,6 @@ public class TypeHierarchyResolver {
checkBoundsForTypeInClassHeader(constraint.getBoundTypeReference());
}
}
for (JetObjectDeclaration object : context.getObjects().keySet()) {
for (JetDelegationSpecifier delegationSpecifier : object.getDelegationSpecifiers()) {
checkBoundsForTypeInClassHeader(delegationSpecifier.getTypeReference());
}
}
}
private void checkBoundsForTypeInClassHeader(@Nullable JetTypeReference typeReference) {
@@ -523,7 +510,7 @@ public class TypeHierarchyResolver {
MutableClassDescriptor classObjectDescriptor =
createClassDescriptorForObject(objectDeclaration, getClassObjectName(owner.getOwnerForChildren().getName()),
ClassKind.CLASS_OBJECT);
context.getObjects().put(objectDeclaration, classObjectDescriptor);
context.getClasses().put(objectDeclaration, classObjectDescriptor);
NamespaceLikeBuilder.ClassObjectStatus status = owner.setClassObjectDescriptor(classObjectDescriptor);
switch (status) {
@@ -432,11 +432,6 @@ public class ResolveElementCache {
return Collections.emptyMap();
}
@Override
public Map<JetObjectDeclaration, MutableClassDescriptor> getObjects() {
return Collections.emptyMap();
}
@Override
public Map<JetProperty, PropertyDescriptor> getProperties() {
return Collections.emptyMap();