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 @@
-
+
@@ -93,15 +103,6 @@
-
-
-
-
-
-
-
-
-
@@ -134,7 +135,7 @@
-
+
@@ -149,10 +150,10 @@
-
+
-
+
@@ -176,10 +177,10 @@
-
+
-
+
@@ -189,92 +190,96 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -300,22 +305,22 @@
@@ -494,6 +499,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -909,7 +958,7 @@
-
+
@@ -925,7 +974,7 @@
-
+
@@ -963,7 +1012,7 @@
-
+
@@ -990,6 +1039,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