From 158fccbac5fac55b150d68c7c35c92f36fff38be Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Sat, 12 Nov 2011 22:56:47 +0400 Subject: [PATCH] Added Translation class for better instance creation control over the code. --- .idea/workspace.xml | 308 ++++++++++-------- .../k2js/translate/ClassBodyVisitor.java | 7 +- .../k2js/translate/ClassTranslator.java | 7 +- .../k2js/translate/DeclarationTranslator.java | 7 +- .../k2js/translate/DeclarationVisitor.java | 9 +- .../k2js/translate/ExpressionTranslator.java | 7 +- .../k2js/translate/ExpressionVisitor.java | 27 +- .../k2js/translate/FunctionTranslator.java | 18 +- .../k2js/translate/GenerationState.java | 2 +- .../k2js/translate/InitializerVisitor.java | 4 +- .../k2js/translate/NamespaceTranslator.java | 9 +- ...tionTranslator.java => OperatorTable.java} | 2 +- .../translate/PropertyAccessTranslator.java | 11 +- .../jetbrains/k2js/translate/Translation.java | 48 +++ .../k2js/translate/TranslatorVisitor.java | 7 +- .../org/jetbrains/k2js/test/FunctionTest.java | 5 + .../cases/functionWithTwoParametersCall.kt | 9 + 17 files changed, 314 insertions(+), 173 deletions(-) rename translator/src/org/jetbrains/k2js/translate/{OperationTranslator.java => OperatorTable.java} (97%) create mode 100644 translator/src/org/jetbrains/k2js/translate/Translation.java create mode 100644 translator/testFiles/function/cases/functionWithTwoParametersCall.kt diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 49065793425..08af16cc207 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,13 +6,23 @@ - + + + - + + + + + + + + - + + @@ -37,7 +47,7 @@ - + - + @@ -925,7 +974,7 @@ - + @@ -963,7 +1012,7 @@ @@ -999,116 +1049,118 @@ - + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - + - + + + + + + + + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java b/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java index 34062c741b9..03653c393e8 100644 --- a/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java @@ -31,7 +31,7 @@ public final class ClassBodyVisitor extends TranslatorVisitor visitNamedFunction(@NotNull JetNamedFunction expression, @NotNull TranslationContext context) { List properties = new ArrayList(); - properties.add((new FunctionTranslator(context)).translateAsMethod(expression)); + properties.add(Translation.functionTranslator(context).translateAsMethod(expression)); return properties; } @@ -138,11 +138,10 @@ public final class ClassBodyVisitor extends TranslatorVisitor { @NotNull @@ -21,7 +22,7 @@ public class DeclarationVisitor extends TranslatorVisitor { public JsStatement visitProperty(@NotNull JetProperty expression, @NotNull TranslationContext context) { JsName propertyName = context.declareLocalName(getPropertyName(expression)); JsNameRef jsPropertyNameReference = context.getNamespaceQualifiedReference(propertyName); - JsExpression jsInitExpression = translateInitializer(expression, context); + JsExpression jsInitExpression = translateInitializerForProperty(expression, context); JsExpression result; if (jsInitExpression != null) { result = AstUtil.newAssignment(jsPropertyNameReference, jsInitExpression); @@ -34,15 +35,13 @@ public class DeclarationVisitor extends TranslatorVisitor { @NotNull @Override public JsStatement visitClass(@NotNull JetClass expression, @NotNull TranslationContext context) { - ClassTranslator translator = new ClassTranslator(context); - return translator.translateClass(expression); + return Translation.classTranslator(context).translateClass(expression); } @NotNull @Override public JsStatement visitNamedFunction(@NotNull JetNamedFunction expression, @NotNull TranslationContext context) { - FunctionTranslator functionTranslator = new FunctionTranslator(context); - return AstUtil.convertToStatement(functionTranslator.translateAsFunction(expression)); + return AstUtil.convertToStatement(Translation.functionTranslator(context).translateAsFunction(expression)); } } diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java b/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java index 6bbf698f72a..db6423619d3 100644 --- a/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java @@ -11,7 +11,12 @@ public final class ExpressionTranslator extends AbstractTranslator { final private ExpressionVisitor visitor = new ExpressionVisitor(); - public ExpressionTranslator(@NotNull TranslationContext context) { + @NotNull + public static ExpressionTranslator newInstance(@NotNull TranslationContext context) { + return new ExpressionTranslator(context); + } + + private ExpressionTranslator(@NotNull TranslationContext context) { super(context); } diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java index af89e9ea60b..ea4da276545 100644 --- a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java @@ -93,12 +93,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { public JsInvocation translateAsSetterCall(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { JetToken jetOperationToken = (JetToken) expression.getOperationToken(); - if (!OperationTranslator.isAssignment(jetOperationToken)) { + if (!OperatorTable.isAssignment(jetOperationToken)) { return null; } - PropertyAccessTranslator translator = new PropertyAccessTranslator(context); JetExpression leftExpression = expression.getLeft(); - JsInvocation setterCall = translator.resolveAsPropertySet(leftExpression); + JsInvocation setterCall = Translation.propertyAccessTranslator(context).resolveAsPropertySet(leftExpression); if (setterCall == null) { return null; } @@ -116,7 +115,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { assert rightExpression != null : "Binary expression should have a right expression"; JsExpression right = AstUtil.convertToExpression(rightExpression.accept(this, context)); JetToken jetOperationToken = (JetToken) expression.getOperationToken(); - return new JsBinaryOperation(OperationTranslator.getBinaryOperator(jetOperationToken), left, right); + return new JsBinaryOperation(OperatorTable.getBinaryOperator(jetOperationToken), left, right); } //TODO support other cases @@ -140,8 +139,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { return nameRef; } - PropertyAccessTranslator propertyAccessTranslator = new PropertyAccessTranslator(context); - JsInvocation getterCall = propertyAccessTranslator.resolveAsPropertyGet(expression); + JsInvocation getterCall = Translation.propertyAccessTranslator(context).resolveAsPropertyGet(expression); if (getterCall != null) { return getterCall; } @@ -159,7 +157,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { // assume it is a local variable declaration public JsNode visitProperty(@NotNull JetProperty expression, @NotNull TranslationContext context) { JsName jsPropertyName = context.declareLocalName(getPropertyName(expression)); - JsExpression jsInitExpression = translateInitializer(expression, context); + JsExpression jsInitExpression = translateInitializerForProperty(expression, context); return AstUtil.newVar(jsPropertyName, jsInitExpression); } @@ -318,10 +316,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Nullable private JsInvocation translateAsGetterCall(@NotNull JetDotQualifiedExpression expression, @NotNull TranslationContext context) { - JsInvocation result; - PropertyAccessTranslator translator = new PropertyAccessTranslator(context); - result = translator.resolveAsPropertyGet(expression); - return result; + return Translation.propertyAccessTranslator(context).resolveAsPropertyGet(expression); } @NotNull @@ -354,5 +349,15 @@ public final class ExpressionVisitor extends TranslatorVisitor { return selector; } + //TODO: implement unary operations +// @Override +// @NotNull +// public JsNode visitPrefixExpression(@NotNull JetUnaryExpression expression, +// @NotNull TranslationContext context) { +// JsExpression baseExpression = AstUtil.convertToExpression(expression.accept(this, context)); +// expression +// +// } + } diff --git a/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java index 2d1af093534..ee513c04409 100644 --- a/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java @@ -3,7 +3,6 @@ package org.jetbrains.k2js.translate; import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.util.AstUtil; import com.sun.istack.internal.NotNull; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetParameter; @@ -16,7 +15,12 @@ import java.util.List; */ public final class FunctionTranslator extends AbstractTranslator { - public FunctionTranslator(@NotNull TranslationContext context) { + @NotNull + public static FunctionTranslator newInstance(@NotNull TranslationContext context) { + return new FunctionTranslator(context); + } + + private FunctionTranslator(@NotNull TranslationContext context) { super(context); } @@ -51,20 +55,14 @@ public final class FunctionTranslator extends AbstractTranslator { JetExpression jetBodyExpression = jetFunction.getBodyExpression(); //TODO support them ffs assert jetBodyExpression != null : "Function without body not supported at the moment"; - JsNode body = (new ExpressionTranslator(functionContext(jetFunction))).translate(jetBodyExpression); + JsNode body = Translation.expressionTranslator + (translationContext().newFunction(jetFunction)).translate(jetBodyExpression); if (jetFunction.hasBlockBody()) { return AstUtil.convertToBlock(body); } return AstUtil.convertToBlock(new JsReturn(AstUtil.convertToExpression((body)))); } - @NotNull - private TranslationContext functionContext(@NotNull JetNamedFunction jetFunction) { - FunctionDescriptor descriptor = - BindingUtils.getFunctionDescriptor(translationContext().bindingContext(), jetFunction); - return translationContext().newFunction(descriptor); - } - @NotNull private List translateParameters(@NotNull List jetParameters, @NotNull JsScope functionScope) { diff --git a/translator/src/org/jetbrains/k2js/translate/GenerationState.java b/translator/src/org/jetbrains/k2js/translate/GenerationState.java index 3d6ddf0fc34..a04e6143a95 100644 --- a/translator/src/org/jetbrains/k2js/translate/GenerationState.java +++ b/translator/src/org/jetbrains/k2js/translate/GenerationState.java @@ -25,7 +25,7 @@ public final class GenerationState { NamespaceDescriptor descriptor = BindingUtils.getNamespaceDescriptor(bindingContext, namespace); DeclarationExtractor extractor = new DeclarationExtractor(); extractor.extractDeclarations(descriptor, result.getRootScope()); - (new NamespaceTranslator(TranslationContext.rootContext(result, bindingContext, extractor))) + Translation.namespaceTranslator(TranslationContext.rootContext(result, bindingContext, extractor)) .generateAst(namespace); return result; } diff --git a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java index c68778b1026..6f20520fe9b 100644 --- a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java @@ -77,8 +77,8 @@ public class InitializerVisitor extends TranslatorVisitor> { @NotNull private JsStatement translateInitializer(@NotNull JetProperty property, @NotNull TranslationContext context, @NotNull JetExpression initializer) { - ExpressionTranslator translator = new ExpressionTranslator(context); - JsExpression initExpression = AstUtil.convertToExpression(translator.translate(initializer)); + JsExpression initExpression = AstUtil.convertToExpression(Translation.expressionTranslator(context) + .translate(initializer)); return assignmentToBackingField(property, initExpression, context); } diff --git a/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java b/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java index 43d846e8468..492d9402374 100644 --- a/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java @@ -14,7 +14,12 @@ import java.util.List; */ public final class NamespaceTranslator extends AbstractTranslator { - public NamespaceTranslator(@NotNull TranslationContext context) { + @NotNull + public static NamespaceTranslator newInstance(@NotNull TranslationContext context) { + return new NamespaceTranslator(context); + } + + private NamespaceTranslator(@NotNull TranslationContext context) { super(context); } @@ -40,7 +45,7 @@ public final class NamespaceTranslator extends AbstractTranslator { @NotNull private JsBlock translateDeclarations(@NotNull JetNamespace namespace, @NotNull TranslationContext newContext) { - DeclarationTranslator declarationTranslator = new DeclarationTranslator(newContext); + DeclarationTranslator declarationTranslator = Translation.declarationTranslator(newContext); JsBlock namespaceDeclarations = new JsBlock(); for (JetDeclaration declaration : namespace.getDeclarations()) { namespaceDeclarations.addStatement(declarationTranslator.translateDeclaration(declaration)); diff --git a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/OperatorTable.java similarity index 97% rename from translator/src/org/jetbrains/k2js/translate/OperationTranslator.java rename to translator/src/org/jetbrains/k2js/translate/OperatorTable.java index 64c20676240..e8f490b8791 100644 --- a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/OperatorTable.java @@ -11,7 +11,7 @@ import java.util.Map; /** * @author Talanov Pavel */ -public final class OperationTranslator { +public final class OperatorTable { private static Map map = new HashMap(); diff --git a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java index acd9717da51..f794596e4ee 100644 --- a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java @@ -23,7 +23,12 @@ import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; //TODO ask for code review. Class has messy code. public final class PropertyAccessTranslator extends AbstractTranslator { - public PropertyAccessTranslator(@NotNull TranslationContext context) { + @NotNull + public static PropertyAccessTranslator newInstance(@NotNull TranslationContext context) { + return new PropertyAccessTranslator(context); + } + + private PropertyAccessTranslator(@NotNull TranslationContext context) { super(context); } @@ -50,8 +55,8 @@ public final class PropertyAccessTranslator extends AbstractTranslator { @NotNull private JsInvocation translateReceiverAndReturnAccessorInvocation (@NotNull JetDotQualifiedExpression dotQualifiedExpression, @NotNull JsName accessorName) { - ExpressionTranslator translator = new ExpressionTranslator(translationContext()); - JsNode node = translator.translate(dotQualifiedExpression.getReceiverExpression()); + JsNode node = Translation.expressionTranslator(translationContext()) + .translate(dotQualifiedExpression.getReceiverExpression()); JsNameRef result = accessorName.makeRef(); result.setQualifier(AstUtil.convertToExpression(node)); return AstUtil.newInvocation(result); diff --git a/translator/src/org/jetbrains/k2js/translate/Translation.java b/translator/src/org/jetbrains/k2js/translate/Translation.java new file mode 100644 index 00000000000..8866493fd7d --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/Translation.java @@ -0,0 +1,48 @@ +package org.jetbrains.k2js.translate; + +import com.google.dart.compiler.backend.js.ast.JsNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetExpression; + +/** + * @author Talanov Pavel + *

+ * This class is a factory for obtaining instances of translators. + */ +public final class Translation { + + @NotNull + static public ExpressionTranslator expressionTranslator(@NotNull TranslationContext context) { + return ExpressionTranslator.newInstance(context); + } + + @NotNull + static public FunctionTranslator functionTranslator(@NotNull TranslationContext context) { + return FunctionTranslator.newInstance(context); + } + + @NotNull + static public PropertyAccessTranslator propertyAccessTranslator(@NotNull TranslationContext context) { + return PropertyAccessTranslator.newInstance(context); + } + + @NotNull + static public NamespaceTranslator namespaceTranslator(@NotNull TranslationContext context) { + return NamespaceTranslator.newInstance(context); + } + + @NotNull + static public ClassTranslator classTranslator(@NotNull TranslationContext context) { + return ClassTranslator.newInstance(context); + } + + @NotNull + static public DeclarationTranslator declarationTranslator(@NotNull TranslationContext context) { + return DeclarationTranslator.newInstance(context); + } + + @NotNull + static public JsNode translateExpression(@NotNull JetExpression expression, @NotNull TranslationContext context) { + return expressionTranslator(context).translate(expression); + } +} diff --git a/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java b/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java index 37d10b76a15..b3b9f9d29b4 100644 --- a/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java @@ -40,12 +40,13 @@ public class TranslatorVisitor extends JetVisitor { @Nullable - protected JsExpression translateInitializer(@NotNull JetProperty declaration, @NotNull TranslationContext context) { + protected JsExpression translateInitializerForProperty(@NotNull JetProperty declaration, + @NotNull TranslationContext context) { JsExpression jsInitExpression = null; JetExpression initializer = declaration.getInitializer(); if (initializer != null) { - jsInitExpression = AstUtil.convertToExpression( - (new ExpressionTranslator(context)).translate(initializer)); + jsInitExpression = AstUtil.convertToExpression(Translation.expressionTranslator(context) + .translate(initializer)); } return jsInitExpression; } diff --git a/translator/test/org/jetbrains/k2js/test/FunctionTest.java b/translator/test/org/jetbrains/k2js/test/FunctionTest.java index 0b63cd8ef8e..37a3539e430 100644 --- a/translator/test/org/jetbrains/k2js/test/FunctionTest.java +++ b/translator/test/org/jetbrains/k2js/test/FunctionTest.java @@ -80,4 +80,9 @@ public final class FunctionTest extends TranslationTest { public void functionUsedBeforeDeclaration() throws Exception { testFooBoxIsTrue("functionUsedBeforeDeclaration.kt"); } + + @Test + public void functionWithTwoParametersCall() throws Exception { + testFooBoxIsTrue("functionWithTwoParametersCall.kt"); + } } diff --git a/translator/testFiles/function/cases/functionWithTwoParametersCall.kt b/translator/testFiles/function/cases/functionWithTwoParametersCall.kt new file mode 100644 index 00000000000..34af313a91f --- /dev/null +++ b/translator/testFiles/function/cases/functionWithTwoParametersCall.kt @@ -0,0 +1,9 @@ +namespace foo + +fun sum(param1 : Int, param2 : Int) : Int { + return param1 + param2; +} + +fun box() : Boolean { + return (sum(1, 5) == 6) +} \ No newline at end of file