From 534375f975aa46c080e6de7fe677aacb7f891dac Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Sun, 5 Feb 2012 17:10:44 +0400 Subject: [PATCH] a bunch or refactoring and TODO fixes --- .../translate/context/DynamicContext.java | 9 +++++++ .../k2js/translate/context/Namer.java | 6 +++++ .../translate/context/TranslationContext.java | 10 +++++--- .../ClassDeclarationTranslator.java | 8 ++---- .../declaration/NamespaceTranslator.java | 6 ++++- .../expression/ExpressionVisitor.java | 10 +++----- .../expression/FunctionTranslator.java | 25 ++++++------------- .../translate/expression/WhenTranslator.java | 2 +- .../k2js/translate/utils/PsiUtils.java | 8 ++++++ 9 files changed, 49 insertions(+), 35 deletions(-) diff --git a/translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java b/translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java index ef1057b8745..2a79dfce9d5 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java @@ -16,10 +16,13 @@ public class DynamicContext { return new DynamicContext(scope, scope, new JsBlock()); } + //TODO: current/block scope logic unclear. is it necessary? @NotNull private NamingScope currentScope; + @NotNull private NamingScope blockScope; + @NotNull private JsBlock currentBlock; @@ -34,6 +37,11 @@ public class DynamicContext { return new DynamicContext(currentScope.innerScope(scope), blockScope, currentBlock); } + @NotNull + public NamingScope getScope() { + return blockScope; + } + @NotNull public DynamicContext innerBlock(@NotNull JsBlock block) { return new DynamicContext(currentScope, currentScope, block); @@ -47,6 +55,7 @@ public class DynamicContext { return new TemporaryVariable(temporaryName, initExpression); } + @NotNull public JsScope jsScope() { return currentScope.jsScope(); diff --git a/translator/src/org/jetbrains/k2js/translate/context/Namer.java b/translator/src/org/jetbrains/k2js/translate/context/Namer.java index 3f12455cb2b..803136f3042 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/Namer.java +++ b/translator/src/org/jetbrains/k2js/translate/context/Namer.java @@ -24,6 +24,12 @@ public final class Namer { private static final String SUPER_METHOD_NAME = "super_init"; private static final String KOTLIN_OBJECT_NAME = "Kotlin"; private static final String ANONYMOUS_NAMESPACE = "Anonymous"; + private static final String RECEIVER_PARAMETER_NAME = "receiver"; + + @NotNull + public static String getReceiverParameterName() { + return RECEIVER_PARAMETER_NAME; + } @NotNull public static String getAnonymousNamespaceName() { diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 77d1bf4b06a..cca19943014 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -123,13 +123,17 @@ public final class TranslationContext { return staticContext.getStandardClasses(); } + @NotNull + public NamingScope getScope() { + return dynamicContext.getScope(); + } + @NotNull public JsScope jsScope() { return dynamicContext.jsScope(); } - @NotNull - public JsBlock jsBlock() { - return dynamicContext.jsBlock(); + public void addStatementToCurrentBlock(@NotNull JsStatement statement) { + dynamicContext.jsBlock().addStatement(statement); } } diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index ef3ed421540..eff36cabf93 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -5,7 +5,6 @@ import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.k2js.translate.context.Namer; @@ -20,14 +19,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsForNamespace; - /** * @author Pavel Talanov *

* Generates a big block where are all the classes(objects representing them) are created. */ -//TODO: declaration translator receives NamespaceDescriptor while actually should receive all declarations in namespace public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull @@ -41,9 +37,9 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @Nullable private JsStatement declarationsStatement = null; - public ClassDeclarationTranslator(@NotNull TranslationContext context, @NotNull NamespaceDescriptor namespace) { + public ClassDeclarationTranslator(@NotNull TranslationContext context, @NotNull List declarationList) { super(context); - this.namespaceDeclarations = getDeclarationsForNamespace(context.bindingContext(), namespace); + this.namespaceDeclarations = declarationList; this.localToGlobalClassName = new HashMap(); this.dummyFunctionScope = new JsScope(context().jsScope(), "class declaration function"); } diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java index 5390c8cdacc..f1133ea17b7 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java @@ -4,6 +4,7 @@ import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; @@ -12,6 +13,8 @@ import org.jetbrains.k2js.translate.general.Translation; import java.util.ArrayList; import java.util.List; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsForNamespace; + /** * @author Pavel.Talanov *

@@ -35,7 +38,8 @@ public final class NamespaceTranslator extends AbstractTranslator { super(context.newDeclaration(namespace)); this.namespace = namespace; this.namespaceName = context.getNameForDescriptor(namespace); - this.classDeclarationTranslator = new ClassDeclarationTranslator(context(), namespace); + List namespaceDeclarations = getDeclarationsForNamespace(context.bindingContext(), namespace); + this.classDeclarationTranslator = new ClassDeclarationTranslator(context(), namespaceDeclarations); } @NotNull diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 91f26f0d1b1..96b3efa7324 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -26,6 +26,7 @@ import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.*; +import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationName; import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateInitializerForProperty; /** @@ -149,7 +150,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { JsNode mutatedIfStatement = AstUtil.mutateLastExpression(ifStatement, saveResultToTemporaryMutator); JsStatement resultingStatement = AstUtil.convertToStatement(mutatedIfStatement); - context.jsBlock().addStatement(resultingStatement); + context.addStatementToCurrentBlock(resultingStatement); return result.nameReference(); } @@ -388,11 +389,8 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitObjectDeclaration(@NotNull JetObjectDeclaration expression, @NotNull TranslationContext context) { - //TODO: util - JetObjectDeclarationName nameAsDeclaration = expression.getNameAsDeclaration(); - assert nameAsDeclaration != null; - DeclarationDescriptor descriptor = getDescriptorForElement(context.bindingContext(), - nameAsDeclaration); + JetObjectDeclarationName objectDeclarationName = getObjectDeclarationName(expression); + DeclarationDescriptor descriptor = getDescriptorForElement(context.bindingContext(), objectDeclarationName); JsName propertyName = context.getNameForDescriptor(descriptor); JsExpression value = ClassTranslator.generateClassCreationExpression(expression, context); return AstUtil.newVar(propertyName, value); diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 2bd5e8145f8..14e14552784 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -8,6 +8,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; @@ -34,9 +35,6 @@ public final class FunctionTranslator extends AbstractTranslator { } //TODO: implement more generic and safe way - @NotNull - private static final String RECEIVER_PARAMETER_NAME = "receiver"; - @NotNull private final JetDeclarationWithBody functionDeclaration; @NotNull @@ -105,7 +103,7 @@ public final class FunctionTranslator extends AbstractTranslator { @NotNull private JsFunction createFunctionObject() { if (isDeclaration()) { - return functionWithScope(context().getScopeForElement((JetDeclaration) functionDeclaration)); + return functionWithScope(context().getScopeForElement(functionDeclaration)); } if (isLiteral()) { //TODO: look into @@ -130,25 +128,16 @@ public final class FunctionTranslator extends AbstractTranslator { return (!functionDeclaration.hasBlockBody()) && (!JetStandardClasses.isUnit(functionReturnType)); } - //TODO: refactor @NotNull private JsBlock wrapWithReturnIfNeeded(@NotNull JsNode body, boolean needsReturn) { if (!needsReturn) { return AstUtil.convertToBlock(body); } - if (body instanceof JsExpression) { - return AstUtil.convertToBlock(new JsReturn(AstUtil.convertToExpression(body))); - } - if (body instanceof JsBlock) { - JsBlock bodyBlock = (JsBlock) body; - addReturnToBlockStatement(bodyBlock); - return bodyBlock; - } - throw new AssertionError("Invalid node as functionDeclaration body"); + return AstUtil.convertToBlock(lastExpressionReturned(body)); } - private void addReturnToBlockStatement(@NotNull JsBlock bodyBlock) { - AstUtil.mutateLastExpression(bodyBlock, new AstUtil.Mutator() { + private JsNode lastExpressionReturned(@NotNull JsNode body) { + return AstUtil.mutateLastExpression(body, new AstUtil.Mutator() { @Override @NotNull public JsNode mutate(@NotNull JsNode node) { @@ -187,8 +176,8 @@ public final class FunctionTranslator extends AbstractTranslator { private void mayBeAddThisParameterForExtensionFunction(@NotNull List jsParameters) { if (isExtensionFunction()) { - //TODO: dont do this - JsName receiver = functionBodyContext.jsScope().declareName(RECEIVER_PARAMETER_NAME); + //TODO: don't do this + JsName receiver = functionBodyContext.jsScope().declareName(Namer.getReceiverParameterName()); DeclarationDescriptor expectedReceiverDescriptor = getExpectedReceiverDescriptor(descriptor); assert expectedReceiverDescriptor != null; context().aliaser().setAliasForThis(expectedReceiverDescriptor, receiver); diff --git a/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java index 21871633516..c1065139c25 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java @@ -48,7 +48,7 @@ public class WhenTranslator extends AbstractTranslator { JsFor resultingFor = generateDummyFor(); List entries = translateEntries(); resultingFor.setBody(AstUtil.newBlock(entries)); - context().jsBlock().addStatement(resultingFor); + context().addStatementToCurrentBlock(resultingFor); return result.nameReference(); } diff --git a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java index 4432cb51d46..2ab4717e6db 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java @@ -119,6 +119,14 @@ public final class PsiUtils { return (JetObjectDeclaration) parent; } + @NotNull + public static JetObjectDeclarationName getObjectDeclarationName(@NotNull JetObjectDeclaration objectDeclaration) { + //TODO: util + JetObjectDeclarationName nameAsDeclaration = objectDeclaration.getNameAsDeclaration(); + assert nameAsDeclaration != null; + return nameAsDeclaration; + } + @NotNull public static String getNamespaceName(@NotNull JetFile psiFile) { JetNamespaceHeader namespaceHeader = psiFile.getNamespaceHeader();