diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index d126ffc6a3e..2f2649adf2b 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -6,8 +6,11 @@
+
-
+
+
+
@@ -45,7 +48,7 @@
-
+
@@ -58,7 +61,7 @@
-
+
@@ -124,13 +127,42 @@
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -172,33 +204,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -221,19 +226,19 @@
-
-
+
+
-
+
-
-
+
+
-
+
@@ -293,10 +298,10 @@
-
+
-
+
@@ -332,11 +337,7 @@
@@ -989,7 +994,7 @@
-
+
@@ -1004,7 +1009,7 @@
-
+
@@ -1043,7 +1048,7 @@
-
+
@@ -1074,6 +1079,7 @@
+
@@ -1083,62 +1089,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1153,13 +1103,6 @@
-
-
-
-
-
-
-
@@ -1174,13 +1117,6 @@
-
-
-
-
-
-
-
@@ -1190,11 +1126,83 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java
index ea4da276545..bfe784e5906 100644
--- a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java
@@ -10,11 +10,9 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
-import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
/**
@@ -81,42 +79,9 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@NotNull
public JsNode visitBinaryExpression(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
- JsInvocation setterCall = translateAsSetterCall(expression, context);
- if (setterCall != null) {
- return setterCall;
- }
- return translateAsBinaryOperation(expression, context);
+ return Translation.operationTranslator(context).translate(expression);
}
- //TODO method too long
- @Nullable
- public JsInvocation translateAsSetterCall(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- JetToken jetOperationToken = (JetToken) expression.getOperationToken();
- if (!OperatorTable.isAssignment(jetOperationToken)) {
- return null;
- }
- JetExpression leftExpression = expression.getLeft();
- JsInvocation setterCall = Translation.propertyAccessTranslator(context).resolveAsPropertySet(leftExpression);
- if (setterCall == null) {
- return null;
- }
- JetExpression rightExpression = expression.getRight();
- assert rightExpression != null : "Selector should not be null";
- JsExpression right = AstUtil.convertToExpression(rightExpression.accept(this, context));
- setterCall.setArguments(Arrays.asList(right));
- return setterCall;
- }
-
- @NotNull
- private JsNode translateAsBinaryOperation(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) {
- JsExpression left = AstUtil.convertToExpression(expression.getLeft().accept(this, context));
- JetExpression rightExpression = expression.getRight();
- 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(OperatorTable.getBinaryOperator(jetOperationToken), left, right);
- }
//TODO support other cases
@Override
@@ -349,15 +314,12 @@ 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
-//
-// }
+ @NotNull
+ public JsNode visitPrefixExpression(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
+ return Translation.operationTranslator(context).translate(expression);
+
+ }
}
diff --git a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java
new file mode 100644
index 00000000000..784ec969fe3
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java
@@ -0,0 +1,79 @@
+package org.jetbrains.k2js.translate;
+
+import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
+import com.google.dart.compiler.backend.js.ast.JsExpression;
+import com.google.dart.compiler.backend.js.ast.JsInvocation;
+import com.google.dart.compiler.util.AstUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.psi.JetBinaryExpression;
+import org.jetbrains.jet.lang.psi.JetExpression;
+import org.jetbrains.jet.lang.psi.JetUnaryExpression;
+import org.jetbrains.jet.lexer.JetToken;
+
+import java.util.Arrays;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class OperationTranslator extends AbstractTranslator {
+
+ @NotNull
+ static public OperationTranslator newInstance(@NotNull TranslationContext context) {
+ return new OperationTranslator(context);
+ }
+
+ private OperationTranslator(TranslationContext context) {
+ super(context);
+ }
+
+ @NotNull
+ JsExpression translate(JetUnaryExpression expression) {
+ return translationContext().program().getBooleanLiteral(false);
+ }
+
+ @NotNull
+ JsExpression translate(@NotNull JetBinaryExpression expression) {
+ JsInvocation setterCall = translateAsSetterCall(expression);
+ if (setterCall != null) {
+ return setterCall;
+ }
+ return translateAsBinaryOperation(expression);
+ }
+
+
+ //TODO method too long
+ @Nullable
+ public JsInvocation translateAsSetterCall(@NotNull JetBinaryExpression expression) {
+ JetToken jetOperationToken = (JetToken) expression.getOperationToken();
+ if (!OperatorTable.isAssignment(jetOperationToken)) {
+ return null;
+ }
+ JetExpression leftExpression = expression.getLeft();
+ JsInvocation setterCall = Translation.propertyAccessTranslator(translationContext()).
+ resolveAsPropertySetterCall(leftExpression);
+ if (setterCall == null) {
+ return null;
+ }
+ JetExpression rightExpression = expression.getRight();
+ assert rightExpression != null : "Selector should not be null";
+ JsExpression right = AstUtil.convertToExpression
+ (Translation.translateExpression(rightExpression, translationContext()));
+ setterCall.setArguments(Arrays.asList(right));
+ return setterCall;
+ }
+
+ @NotNull
+ private JsExpression translateAsBinaryOperation(@NotNull JetBinaryExpression expression) {
+ JsExpression left = AstUtil.convertToExpression
+ (Translation.translateExpression(expression.getLeft(), translationContext()));
+ JetExpression rightExpression = expression.getRight();
+ assert rightExpression != null : "Binary expression should have a right expression";
+ JsExpression right = AstUtil.convertToExpression
+ (Translation.translateExpression(rightExpression, translationContext()));
+ JetToken jetOperationToken = (JetToken) expression.getOperationToken();
+ return new JsBinaryOperation(OperatorTable.getBinaryOperator(jetOperationToken), left, right);
+ }
+
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java
index f794596e4ee..f77e35fecb6 100644
--- a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java
@@ -63,7 +63,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
}
@Nullable
- public JsInvocation resolveAsPropertySet(@NotNull JetExpression expression) {
+ public JsInvocation resolveAsPropertySetterCall(@NotNull JetExpression expression) {
if (expression instanceof JetDotQualifiedExpression) {
return resolveAsPropertySet((JetDotQualifiedExpression) expression);
}
diff --git a/translator/src/org/jetbrains/k2js/translate/Translation.java b/translator/src/org/jetbrains/k2js/translate/Translation.java
index 8866493fd7d..5c9d7749b18 100644
--- a/translator/src/org/jetbrains/k2js/translate/Translation.java
+++ b/translator/src/org/jetbrains/k2js/translate/Translation.java
@@ -36,6 +36,11 @@ public final class Translation {
return ClassTranslator.newInstance(context);
}
+ @NotNull
+ static public OperationTranslator operationTranslator(@NotNull TranslationContext context) {
+ return OperationTranslator.newInstance(context);
+ }
+
@NotNull
static public DeclarationTranslator declarationTranslator(@NotNull TranslationContext context) {
return DeclarationTranslator.newInstance(context);