From 1c19de71f1e5c35724a0e88605bf35e630339219 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 6 Nov 2012 14:05:55 +0400 Subject: [PATCH] Refactoring: getDeclaringScopes() in BodiesResolveContext used to be a map, and now it is a Function. --- .../lang/resolve/BodiesResolveContext.java | 3 +- .../jet/lang/resolve/BodyResolver.java | 8 +-- .../resolve/CachedBodiesResolveContext.java | 7 +- .../jet/lang/resolve/DeclarationResolver.java | 14 ++-- .../lang/resolve/TopDownAnalysisContext.java | 10 ++- .../resolve/lazy/ResolveSessionUtils.java | 66 ++++++++++--------- 6 files changed, 60 insertions(+), 48 deletions(-) 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 3c64cf4ad20..a9d287a5af8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodiesResolveContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodiesResolveContext.java @@ -16,6 +16,7 @@ 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.*; @@ -33,7 +34,7 @@ public interface BodiesResolveContext { Map getObjects(); Map getProperties(); Map getFunctions(); - Map getDeclaringScopes(); + Function getDeclaringScopes(); Map getScripts(); Map getScriptScopes(); 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 13daa9503f5..4bff98b2c57 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -399,7 +399,7 @@ public class BodyResolver { if (initializer != null) { ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor(); if (primaryConstructor != null) { - JetScope declaringScopeForPropertyInitializer = this.context.getDeclaringScopes().get(property); + JetScope declaringScopeForPropertyInitializer = this.context.getDeclaringScopes().apply(property); resolvePropertyInitializer(property, propertyDescriptor, initializer, declaringScopeForPropertyInitializer); } } @@ -419,7 +419,7 @@ public class BodyResolver { computeDeferredType(propertyDescriptor.getReturnType()); - JetScope declaringScope = this.context.getDeclaringScopes().get(property); + JetScope declaringScope = this.context.getDeclaringScopes().apply(property); JetExpression initializer = property.getInitializer(); if (initializer != null) { @@ -431,7 +431,7 @@ public class BodyResolver { } private JetScope makeScopeForPropertyAccessor(@NotNull JetPropertyAccessor accessor, PropertyDescriptor propertyDescriptor) { - JetScope declaringScope = context.getDeclaringScopes().get(accessor); + JetScope declaringScope = context.getDeclaringScopes().apply(accessor); JetScope propertyDeclarationInnerScope = descriptorResolver.getPropertyDeclarationInnerScope( declaringScope, propertyDescriptor.getTypeParameters(), propertyDescriptor.getReceiverParameter(), trace); @@ -490,7 +490,7 @@ public class BodyResolver { computeDeferredType(descriptor.getReturnType()); - JetScope declaringScope = this.context.getDeclaringScopes().get(declaration); + JetScope declaringScope = this.context.getDeclaringScopes().apply(declaration); assert declaringScope != null; resolveFunctionBody(trace, declaration, descriptor, declaringScope); 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 4e9ba78be70..967dc10900f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CachedBodiesResolveContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CachedBodiesResolveContext.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve; +import com.google.common.base.Function; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -38,7 +39,7 @@ public class CachedBodiesResolveContext implements BodiesResolveContext { private final Map objects; private final Map properties; private final Map functions; - private final Map declaringScopes; + private final Function declaringScopes; private final Map scripts; private final Map scriptScopes; @@ -49,7 +50,7 @@ public class CachedBodiesResolveContext implements BodiesResolveContext { objects = Collections.unmodifiableMap(context.getObjects()); properties = Collections.unmodifiableMap(context.getProperties()); functions = Collections.unmodifiableMap(context.getFunctions()); - declaringScopes = Collections.unmodifiableMap(context.getDeclaringScopes()); + declaringScopes = context.getDeclaringScopes(); scripts = Collections.unmodifiableMap(context.getScripts()); scriptScopes = Collections.unmodifiableMap(context.getScriptScopes()); @@ -77,7 +78,7 @@ public class CachedBodiesResolveContext implements BodiesResolveContext { } @Override - public Map getDeclaringScopes() { + public Function getDeclaringScopes() { return declaringScopes; } 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 2f96db9c40a..74cb20d4b1e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -180,7 +180,7 @@ public class DeclarationResolver { SimpleFunctionDescriptor functionDescriptor = descriptorResolver.resolveFunctionDescriptor(namespaceLike.getOwnerForChildren(), scopeForFunctions, function, trace); namespaceLike.addFunctionDescriptor(functionDescriptor); context.getFunctions().put(function, functionDescriptor); - context.getDeclaringScopes().put(function, scopeForFunctions); + context.registerDeclaringScope(function, scopeForFunctions); } @Override @@ -188,12 +188,14 @@ public class DeclarationResolver { PropertyDescriptor propertyDescriptor = descriptorResolver.resolvePropertyDescriptor(namespaceLike.getOwnerForChildren(), scopeForPropertyInitializers, property, trace); namespaceLike.addPropertyDescriptor(propertyDescriptor); context.getProperties().put(property, propertyDescriptor); - context.getDeclaringScopes().put(property, scopeForPropertyInitializers); - if (property.getGetter() != null) { - context.getDeclaringScopes().put(property.getGetter(), scopeForPropertyAccessors); + context.registerDeclaringScope(property, scopeForPropertyInitializers); + JetPropertyAccessor getter = property.getGetter(); + if (getter != null) { + context.registerDeclaringScope(getter, scopeForPropertyAccessors); } - if (property.getSetter() != null) { - context.getDeclaringScopes().put(property.getSetter(), scopeForPropertyAccessors); + JetPropertyAccessor setter = property.getSetter(); + if (setter != null) { + context.registerDeclaringScope(setter, scopeForPropertyAccessors); } } 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 ed81b3ddcba..82aeb9d82d5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -16,6 +16,8 @@ package org.jetbrains.jet.lang.resolve; +import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.collect.Maps; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -138,8 +140,12 @@ public class TopDownAnalysisContext implements BodiesResolveContext { } @Override - public Map getDeclaringScopes() { - return declaringScopes; + public Function getDeclaringScopes() { + return Functions.forMap(declaringScopes); + } + + public void registerDeclaringScope(@NotNull JetDeclaration declaration, @NotNull JetScope scope) { + declaringScopes.put(declaration, scope); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java index c04dcd9f3cb..e9b37743feb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/ResolveSessionUtils.java @@ -16,8 +16,9 @@ package org.jetbrains.jet.lang.resolve.lazy; +import com.google.common.base.Function; +import com.google.common.base.Functions; import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -40,12 +41,20 @@ import java.util.*; * @author Nikolay Krasko */ public class ResolveSessionUtils { + private ResolveSessionUtils() { } - private static class EmptyBodyResolveContext implements BodiesResolveContext { + @SuppressWarnings("unchecked") + private static final BodyResolveContextForLazy EMPTY_CONTEXT = new BodyResolveContextForLazy((Function) Functions.constant(null)); - private Map declarationScopesMap = Collections.emptyMap(); + private static class BodyResolveContextForLazy implements BodiesResolveContext { + + private final Function declaringScopes; + + private BodyResolveContextForLazy(@NotNull Function declaringScopes) { + this.declaringScopes = declaringScopes; + } @Override public Map getClasses() { @@ -68,12 +77,8 @@ public class ResolveSessionUtils { } @Override - public Map getDeclaringScopes() { - return declarationScopesMap; - } - - public void setDeclaringScopes(Map declarationScopes) { - declarationScopesMap = declarationScopes; + public Function getDeclaringScopes() { + return declaringScopes; } @Override @@ -142,7 +147,7 @@ public class ResolveSessionUtils { private static void delegationSpecifierAdditionalResolve(final ResolveSession resolveSession, final JetDelegationSpecifierList specifier, DelegatingBindingTrace trace, JetFile file) { - BodyResolver bodyResolver = createBodyResolver(trace, file, resolveSession.getModuleConfiguration()); + BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getModuleConfiguration()); JetClassOrObject classOrObject = (JetClassOrObject) specifier.getParent(); LazyClassDescriptor descriptor = (LazyClassDescriptor) resolveSession.resolveToDescriptor(classOrObject); @@ -157,42 +162,35 @@ public class ResolveSessionUtils { } private static void propertyAdditionalResolve(final ResolveSession resolveSession, final JetProperty jetProperty, DelegatingBindingTrace trace, JetFile file) { - EmptyBodyResolveContext bodyResolveContext = new EmptyBodyResolveContext(); + final JetScope propertyResolutionScope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration( + jetProperty); + + BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy(new Function() { + @Override + public JetScope apply(JetDeclaration declaration) { + assert declaration.getParent() == jetProperty : "Must be called only for property accessors, but called for " + declaration; + return propertyResolutionScope; + } + }); BodyResolver bodyResolver = createBodyResolver(trace, file, bodyResolveContext, resolveSession.getModuleConfiguration()); PropertyDescriptor descriptor = (PropertyDescriptor) resolveSession.resolveToDescriptor(jetProperty); JetExpression propertyInitializer = jetProperty.getInitializer(); - final JetScope propertyResolutionScope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration( - jetProperty); - if (propertyInitializer != null) { bodyResolver.resolvePropertyInitializer(jetProperty, descriptor, propertyInitializer, propertyResolutionScope); } - addAccessorDeclaringScopes(jetProperty, bodyResolveContext, propertyResolutionScope); bodyResolver.resolvePropertyAccessors(jetProperty, descriptor); } - private static void addAccessorDeclaringScopes( - JetProperty jetProperty, - EmptyBodyResolveContext bodyResolveContext, - JetScope propertyResolutionScope - ) { - ImmutableMap.Builder builder = ImmutableMap.builder(); - for (final JetPropertyAccessor propertyAccessor : jetProperty.getAccessors()) { - builder.put(propertyAccessor, propertyResolutionScope); - } - bodyResolveContext.setDeclaringScopes(builder.build()); - } - private static void functionAdditionalResolve( ResolveSession resolveSession, JetNamedFunction namedFunction, DelegatingBindingTrace trace, JetFile file ) { - BodyResolver bodyResolver = createBodyResolver(trace, file, resolveSession.getModuleConfiguration()); + BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getModuleConfiguration()); JetScope scope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration(namedFunction); FunctionDescriptor functionDescriptor = (FunctionDescriptor) resolveSession.resolveToDescriptor(namedFunction); bodyResolver.resolveFunctionBody(trace, namedFunction, functionDescriptor, scope); @@ -204,7 +202,7 @@ public class ResolveSessionUtils { DelegatingBindingTrace trace, JetFile file ) { - BodyResolver bodyResolver = createBodyResolver(trace, file, resolveSession.getModuleConfiguration()); + BodyResolver bodyResolver = createBodyResolverWithEmptyContext(trace, file, resolveSession.getModuleConfiguration()); JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(classInitializer, JetClassOrObject.class); LazyClassDescriptor classOrObjectDescriptor = (LazyClassDescriptor) resolveSession.resolveToDescriptor(classOrObject); bodyResolver.resolveAnonymousInitializers(classOrObject, classOrObjectDescriptor.getUnsubstitutedPrimaryConstructor(), @@ -213,7 +211,7 @@ public class ResolveSessionUtils { return true; } - private static BodyResolver createBodyResolver(DelegatingBindingTrace trace, JetFile file, EmptyBodyResolveContext bodyResolveContext, + private static BodyResolver createBodyResolver(DelegatingBindingTrace trace, JetFile file, BodyResolveContextForLazy bodyResolveContext, ModuleConfiguration moduleConfiguration) { TopDownAnalysisParameters parameters = new TopDownAnalysisParameters( Predicates.alwaysTrue(), false, true, Collections.emptyList()); @@ -221,8 +219,12 @@ public class ResolveSessionUtils { return bodyResolve.getBodyResolver(); } - private static BodyResolver createBodyResolver(DelegatingBindingTrace trace, JetFile file, ModuleConfiguration moduleConfiguration) { - return createBodyResolver(trace, file, new EmptyBodyResolveContext(), moduleConfiguration); + private static BodyResolver createBodyResolverWithEmptyContext( + DelegatingBindingTrace trace, + JetFile file, + ModuleConfiguration moduleConfiguration + ) { + return createBodyResolver(trace, file, EMPTY_CONTEXT, moduleConfiguration); } private static JetScope getExpressionResolutionScope(@NotNull ResolveSession resolveSession, @NotNull JetExpression expression) {