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 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -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 @@ @@ -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);