From 1b986b6d2b9dca63d4c4a0a78c812d4bc4963cbf Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Thu, 2 Feb 2012 20:33:54 +0400 Subject: [PATCH] refactored naming scopes to initialize lazily --- .../k2js/translate/context/StaticContext.java | 14 ----- .../translate/context/TranslationContext.java | 57 ++++++++++++++----- .../context/generator/Generator.java | 23 ++++---- .../translate/context/generator/Rule.java | 5 +- 4 files changed, 58 insertions(+), 41 deletions(-) diff --git a/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index 80d35e611d8..b6aa00a85f0 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -6,13 +6,11 @@ import com.google.dart.compiler.backend.js.ast.JsProgram; import com.google.dart.compiler.backend.js.ast.JsRootScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.k2js.translate.context.declaration.DeclarationFacade; import org.jetbrains.k2js.translate.context.declaration.Declarations; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; -import org.jetbrains.k2js.translate.utils.BindingUtils; public class StaticContext { @@ -111,18 +109,6 @@ public class StaticContext { return standardClasses; } - //TODO: helper method outdated - @NotNull - public NamingScope getScopeForDescriptor(@NotNull DeclarationDescriptor descriptor) { - return declarationFacade.getKotlinDeclarations().getScope(descriptor); - } - - @NotNull - public NamingScope getScopeForElement(@NotNull JetElement element) { - DeclarationDescriptor descriptor = BindingUtils.getDescriptorForElement(bindingContext, element); - return getScopeForDescriptor(descriptor); - } - //TODO: consider using nullable return value instead @NotNull public JsName getGlobalName(@NotNull DeclarationDescriptor descriptor) { diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 8dc1b9235c7..6222e9627da 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -17,6 +17,8 @@ import org.jetbrains.k2js.translate.context.generator.Rule; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.BindingUtils; +import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getContainingDeclaration; + /** * @author Pavel Talanov */ @@ -27,13 +29,10 @@ public final class TranslationContext { @NotNull private final StaticContext staticContext; @NotNull - private final Generator names = - nameGenerator(); - - + private final Generator names = nameGenerator(); @NotNull - private final Generator scopes = - new Generator(); + private final Generator scopes = scopeGenerator(); + @NotNull public static TranslationContext rootContext(@NotNull StaticContext staticContext) { @@ -104,12 +103,13 @@ public final class TranslationContext { @NotNull public NamingScope getScopeForDescriptor(@NotNull DeclarationDescriptor descriptor) { - return staticContext.getScopeForDescriptor(descriptor); + return scopes.get(descriptor); } @NotNull public NamingScope getScopeForElement(@NotNull JetElement element) { - return staticContext.getScopeForElement(element); + DeclarationDescriptor descriptorForElement = BindingUtils.getDescriptorForElement(bindingContext(), element); + return getScopeForDescriptor(descriptorForElement); } @NotNull @@ -195,9 +195,9 @@ public final class TranslationContext { } @NotNull - private Generator nameGenerator() { - Generator nameGenerator = new Generator(); - nameGenerator.addRule(new Rule() { + private Generator nameGenerator() { + Generator nameGenerator = new Generator(); + nameGenerator.addRule(new Rule() { @Override @Nullable public JsName apply(@NotNull DeclarationDescriptor data) { @@ -207,7 +207,7 @@ public final class TranslationContext { return null; } }); - nameGenerator.addRule(new Rule() { + nameGenerator.addRule(new Rule() { @Override @Nullable public JsName apply(@NotNull DeclarationDescriptor data) { @@ -217,7 +217,7 @@ public final class TranslationContext { return standardClasses().getStandardObjectName(data); } }); - nameGenerator.addRule(new Rule() { + nameGenerator.addRule(new Rule() { @Override @Nullable public JsName apply(@NotNull DeclarationDescriptor descriptor) { @@ -227,7 +227,7 @@ public final class TranslationContext { return null; } }); - nameGenerator.addRule(new Rule() { + nameGenerator.addRule(new Rule() { @Override @Nullable public JsName apply(@NotNull DeclarationDescriptor descriptor) { @@ -240,4 +240,33 @@ public final class TranslationContext { return nameGenerator; } + @NotNull + private Generator scopeGenerator() { + Generator scopeGenerator = new Generator(); + Rule generateNewScopesForNamespaceDescriptors = new Rule() { + @Override + public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { + if (!(descriptor instanceof NamespaceDescriptor)) { + return null; + } + return staticContext.getRootScope().innerScope("Namespace " + descriptor.getName()); + } + }; + Rule generateInnerScopesForFunctions = new Rule() { + @Override + public NamingScope apply(@NotNull DeclarationDescriptor descriptor) { +// if (!(descriptor instanceof FunctionDescriptor)) { +// return null; +// } + DeclarationDescriptor containingDeclaration = getContainingDeclaration(descriptor); + NamingScope enclosingScope = getScopeForDescriptor(containingDeclaration); + return enclosingScope.innerScope("scope for member " + descriptor.getName()); + } + }; + scopeGenerator.addRule(generateNewScopesForNamespaceDescriptors); + scopeGenerator.addRule(generateInnerScopesForFunctions); + + return scopeGenerator; + } + } diff --git a/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java b/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java index babeba28ec6..713e9b0724c 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java +++ b/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java @@ -3,6 +3,7 @@ package org.jetbrains.k2js.translate.context.generator; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import java.util.List; import java.util.Map; @@ -10,36 +11,36 @@ import java.util.Map; /** * @author Pavel Talanov */ -public final class Generator { +public final class Generator { @NotNull - private final Map values = Maps.newHashMap(); + private final Map values = Maps.newHashMap(); @NotNull - private final List> rules = Lists.newArrayList(); + private final List> rules = Lists.newArrayList(); - public void addRule(@NotNull Rule rule) { + public void addRule(@NotNull Rule rule) { rules.add(rule); } @NotNull - public V get(@NotNull K data) { - V result = values.get(data); + public V get(@NotNull DeclarationDescriptor descriptor) { + V result = values.get(descriptor); if (result != null) { return result; } - return generate(data); + return generate(descriptor); } @NotNull - private V generate(@NotNull K data) { + private V generate(@NotNull DeclarationDescriptor descriptor) { V result = null; - for (Rule rule : rules) { - result = rule.apply(data); + for (Rule rule : rules) { + result = rule.apply(descriptor); if (result != null) { return result; } } - throw new AssertionError("No rule applicable to generate result for " + data.toString()); + throw new AssertionError("No rule applicable to generate result for " + descriptor.toString()); } } diff --git a/translator/src/org/jetbrains/k2js/translate/context/generator/Rule.java b/translator/src/org/jetbrains/k2js/translate/context/generator/Rule.java index f7e12db28fb..dd9c8802114 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/generator/Rule.java +++ b/translator/src/org/jetbrains/k2js/translate/context/generator/Rule.java @@ -2,12 +2,13 @@ package org.jetbrains.k2js.translate.context.generator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; /** * @author Pavel Talanov */ -public interface Rule { +public interface Rule { @Nullable - V apply(@NotNull K data); + V apply(@NotNull DeclarationDescriptor descriptor); }