From 55811ad1a31a9b3e71e9396825fe1cb7173e8f0b Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Thu, 2 Feb 2012 20:09:15 +0400 Subject: [PATCH] added generator and rule classes preparing for migration to lazy name and scope evaluation. --- .../translate/context/TranslationContext.java | 83 ++++++++++++++----- .../context/generator/Generator.java | 45 ++++++++++ .../translate/context/generator/Rule.java | 13 +++ 3 files changed, 121 insertions(+), 20 deletions(-) create mode 100644 translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java create mode 100644 translator/src/org/jetbrains/k2js/translate/context/generator/Rule.java diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 4181e68b0a2..8dc1b9235c7 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -2,6 +2,7 @@ package org.jetbrains.k2js.translate.context; import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor; @@ -11,11 +12,11 @@ import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetPropertyAccessor; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.k2js.translate.context.declaration.DeclarationFacade; +import org.jetbrains.k2js.translate.context.generator.Generator; +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.jet.lang.resolve.DescriptorUtils.getFQName; - /** * @author Pavel Talanov */ @@ -25,6 +26,14 @@ public final class TranslationContext { private final DynamicContext dynamicContext; @NotNull private final StaticContext staticContext; + @NotNull + private final Generator names = + nameGenerator(); + + + @NotNull + private final Generator scopes = + new Generator(); @NotNull public static TranslationContext rootContext(@NotNull StaticContext staticContext) { @@ -103,24 +112,6 @@ public final class TranslationContext { return staticContext.getScopeForElement(element); } - @NotNull - public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) { - //TODO: rewrite - if (aliaser().hasAliasForDeclaration(descriptor)) { - return aliaser().getAliasForDeclaration(descriptor); - } - if (standardClasses().isStandardObject(descriptor)) { - return standardClasses().getStandardObjectName(descriptor); - } - if (dynamicContext.isDeclared(descriptor)) { - return dynamicContext.getLocalName(descriptor); - } - if (staticContext.isDeclared(descriptor)) { - return staticContext.getGlobalName(descriptor); - } - throw new AssertionError("Undefined descriptor: " + getFQName(descriptor)); - } - @NotNull public JsNameRef getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) { if (standardClasses().isStandardObject(descriptor)) { @@ -197,4 +188,56 @@ public final class TranslationContext { public DeclarationFacade declarationFacade() { return staticContext.getDeclarationFacade(); } + + @NotNull + public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) { + return names.get(descriptor); + } + + @NotNull + private Generator nameGenerator() { + Generator nameGenerator = new Generator(); + nameGenerator.addRule(new Rule() { + @Override + @Nullable + public JsName apply(@NotNull DeclarationDescriptor data) { + if (aliaser().hasAliasForDeclaration(data)) { + return aliaser().getAliasForDeclaration(data); + } + return null; + } + }); + nameGenerator.addRule(new Rule() { + @Override + @Nullable + public JsName apply(@NotNull DeclarationDescriptor data) { + if (!standardClasses().isStandardObject(data)) { + return null; + } + return standardClasses().getStandardObjectName(data); + } + }); + nameGenerator.addRule(new Rule() { + @Override + @Nullable + public JsName apply(@NotNull DeclarationDescriptor descriptor) { + if (dynamicContext.isDeclared(descriptor)) { + return dynamicContext.getLocalName(descriptor); + } + return null; + } + }); + nameGenerator.addRule(new Rule() { + @Override + @Nullable + public JsName apply(@NotNull DeclarationDescriptor descriptor) { + if (staticContext.isDeclared(descriptor)) { + return staticContext.getGlobalName(descriptor); + } + return null; + } + }); + return nameGenerator; + } + } diff --git a/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java b/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java new file mode 100644 index 00000000000..babeba28ec6 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/context/generator/Generator.java @@ -0,0 +1,45 @@ +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 java.util.List; +import java.util.Map; + +/** + * @author Pavel Talanov + */ +public final class Generator { + + + @NotNull + private final Map values = Maps.newHashMap(); + @NotNull + private final List> rules = Lists.newArrayList(); + + public void addRule(@NotNull Rule rule) { + rules.add(rule); + } + + @NotNull + public V get(@NotNull K data) { + V result = values.get(data); + if (result != null) { + return result; + } + return generate(data); + } + + @NotNull + private V generate(@NotNull K data) { + V result = null; + for (Rule rule : rules) { + result = rule.apply(data); + if (result != null) { + return result; + } + } + throw new AssertionError("No rule applicable to generate result for " + data.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 new file mode 100644 index 00000000000..f7e12db28fb --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/context/generator/Rule.java @@ -0,0 +1,13 @@ +package org.jetbrains.k2js.translate.context.generator; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Pavel Talanov + */ +public interface Rule { + + @Nullable + V apply(@NotNull K data); +}