diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index c292e4af82d..85246e6097c 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -8,24 +8,59 @@
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
@@ -67,8 +102,8 @@
-
-
+
+
@@ -96,7 +131,7 @@
-
+
@@ -109,20 +144,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -149,8 +171,8 @@
-
-
+
+
@@ -164,8 +186,8 @@
-
-
+
+
@@ -183,8 +205,8 @@
-
+
@@ -192,72 +214,22 @@
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -265,10 +237,19 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
@@ -276,8 +257,44 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -285,10 +302,10 @@
-
-
+
+
-
+
@@ -298,10 +315,19 @@
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
@@ -310,54 +336,25 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -372,26 +369,47 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -413,22 +431,22 @@
@@ -532,7 +550,6 @@
-
@@ -579,11 +596,87 @@
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -605,11 +698,7 @@
-
-
-
-
-
+
@@ -627,7 +716,7 @@
-
+
@@ -649,6 +738,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -689,7 +804,11 @@
-
+
+
+
+
+
@@ -715,28 +834,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -791,6 +888,7 @@
+
@@ -809,9 +907,9 @@
-
-
+
+
@@ -829,8 +927,8 @@
-
-
+
+
@@ -841,129 +939,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -974,6 +1082,7 @@
+
@@ -1043,7 +1152,7 @@
-
+
@@ -1103,12 +1212,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
localhost
@@ -1163,7 +1272,7 @@
-
+
@@ -1171,18 +1280,18 @@
-
+
-
+
-
+
-
+
-
-
+
+
@@ -1226,7 +1335,7 @@
-
+
@@ -1239,12 +1348,6 @@
-
-
-
-
-
-
@@ -1264,6 +1367,12 @@
+
+
+
+
+
+
@@ -1273,134 +1382,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java b/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java
index 140defe6d3b..852097285cc 100644
--- a/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java
+++ b/translator/src/org/jetbrains/k2js/declarations/DeclarationVisitor.java
@@ -5,7 +5,7 @@ import com.google.dart.compiler.backend.js.ast.JsScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
-import org.jetbrains.k2js.translate.utils.Namer;
+import org.jetbrains.k2js.translate.context.Namer;
/**
* @author Talanov Pavel
diff --git a/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
similarity index 96%
rename from translator/src/org/jetbrains/k2js/translate/general/Aliaser.java
rename to translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
index 7843afc6c15..11c90d80d10 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java
@@ -1,4 +1,4 @@
-package org.jetbrains.k2js.translate.general;
+package org.jetbrains.k2js.translate.context;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
@@ -6,7 +6,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
-import org.jetbrains.k2js.translate.utils.Namer;
import java.util.HashMap;
import java.util.Map;
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/Namer.java b/translator/src/org/jetbrains/k2js/translate/context/Namer.java
similarity index 98%
rename from translator/src/org/jetbrains/k2js/translate/utils/Namer.java
rename to translator/src/org/jetbrains/k2js/translate/context/Namer.java
index c542172c4fc..ba56538db1e 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/Namer.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/Namer.java
@@ -1,4 +1,4 @@
-package org.jetbrains.k2js.translate.utils;
+package org.jetbrains.k2js.translate.context;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
diff --git a/translator/src/org/jetbrains/k2js/translate/general/StaticContext.java b/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java
similarity index 97%
rename from translator/src/org/jetbrains/k2js/translate/general/StaticContext.java
rename to translator/src/org/jetbrains/k2js/translate/context/StaticContext.java
index e4e972501ea..edb2bc082ff 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/StaticContext.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/StaticContext.java
@@ -1,4 +1,4 @@
-package org.jetbrains.k2js.translate.general;
+package org.jetbrains.k2js.translate.context;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsProgram;
@@ -11,7 +11,6 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.k2js.declarations.Declarations;
import org.jetbrains.k2js.translate.intrinsic.Intrinsics;
-import org.jetbrains.k2js.translate.utils.Namer;
public class StaticContext {
diff --git a/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
similarity index 98%
rename from translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java
rename to translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
index 2b0e3a70abb..decd176d820 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java
+++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java
@@ -1,4 +1,4 @@
-package org.jetbrains.k2js.translate.general;
+package org.jetbrains.k2js.translate.context;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsProgram;
@@ -10,7 +10,6 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.k2js.declarations.Declarations;
import org.jetbrains.k2js.translate.intrinsic.Intrinsics;
import org.jetbrains.k2js.translate.utils.BindingUtils;
-import org.jetbrains.k2js.translate.utils.Namer;
/**
* @author Talanov Pavel
diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java
index 12b4bafeb89..de3f1243dee 100644
--- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java
@@ -8,11 +8,11 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetNamespace;
+import org.jetbrains.k2js.translate.context.Namer;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
-import org.jetbrains.k2js.translate.utils.Namer;
import org.jetbrains.k2js.utils.ClassSorter;
import java.util.ArrayList;
diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java
index f6e9ae273fd..ed417846713 100644
--- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java
@@ -12,9 +12,9 @@ import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetParameter;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import java.util.ArrayList;
diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java b/translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java
index 2659d820196..0ece6d5b853 100644
--- a/translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/declaration/DeclarationBodyVisitor.java
@@ -4,8 +4,8 @@ import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.general.TranslatorVisitor;
import org.jetbrains.k2js.translate.utils.BindingUtils;
diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java
index 3739e32e73b..b1857e9e5b6 100644
--- a/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java
@@ -4,10 +4,10 @@ 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.psi.JetNamespace;
+import org.jetbrains.k2js.translate.context.Namer;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-import org.jetbrains.k2js.translate.utils.Namer;
import java.util.ArrayList;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java
index 8abe4a6126d..4a586c9f647 100644
--- a/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java
@@ -9,9 +9,9 @@ import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.psi.JetPropertyAccessor;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import java.util.ArrayList;
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
index a7d5523dda4..ce0e1e58870 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java
@@ -8,12 +8,13 @@ import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.NullValue;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.general.TranslatorVisitor;
-import org.jetbrains.k2js.translate.operation.OperationTranslator;
+import org.jetbrains.k2js.translate.operation.BinaryOperationTranslator;
+import org.jetbrains.k2js.translate.operation.IncrementTranslator;
import org.jetbrains.k2js.translate.operation.UnaryOperationTranslator;
-import org.jetbrains.k2js.translate.reference.ArrayAccessTranslator;
+import org.jetbrains.k2js.translate.reference.AccessTranslator;
import org.jetbrains.k2js.translate.reference.CallTranslator;
import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
import org.jetbrains.k2js.translate.reference.ReferenceTranslator;
@@ -95,7 +96,7 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@NotNull
public JsNode visitBinaryExpression(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
- return OperationTranslator.translate(expression, context);
+ return BinaryOperationTranslator.translate(expression, context);
}
@Override
@@ -302,7 +303,7 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@NotNull
public JsNode visitPostfixExpression(@NotNull JetPostfixExpression expression,
@NotNull TranslationContext context) {
- return UnaryOperationTranslator.translate(expression, context);
+ return IncrementTranslator.translate(expression, context);
}
@Override
@@ -372,9 +373,9 @@ public final class ExpressionVisitor extends TranslatorVisitor {
@Override
@NotNull
- public JsInvocation visitArrayAccessExpression(@NotNull JetArrayAccessExpression expression,
- @NotNull TranslationContext context) {
- return ArrayAccessTranslator.translateAsArrayGetterCall(expression, context);
+ public JsNode visitArrayAccessExpression(@NotNull JetArrayAccessExpression expression,
+ @NotNull TranslationContext context) {
+ return AccessTranslator.translateAsGet(expression, context);
}
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java
index 258aec028aa..dae708e48c1 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java
@@ -4,9 +4,9 @@ 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.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import java.util.ArrayList;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java
index c3e87c624d7..8c2d8dc7fef 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java
@@ -7,9 +7,9 @@ import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
diff --git a/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java
index 4c797019d6f..e96f807491f 100644
--- a/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java
@@ -5,9 +5,9 @@ import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import java.util.ArrayList;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java b/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java
index e8e7cd87b0d..1713b14bacb 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java
@@ -2,6 +2,7 @@ package org.jetbrains.k2js.translate.general;
import com.google.dart.compiler.backend.js.ast.JsProgram;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.k2js.translate.context.TranslationContext;
/**
* @author Talanov Pavel
diff --git a/translator/src/org/jetbrains/k2js/translate/general/Translation.java b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
index 87845208460..ce2a390b98d 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/Translation.java
+++ b/translator/src/org/jetbrains/k2js/translate/general/Translation.java
@@ -8,6 +8,8 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
+import org.jetbrains.k2js.translate.context.StaticContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.declaration.ClassTranslator;
import org.jetbrains.k2js.translate.declaration.NamespaceTranslator;
import org.jetbrains.k2js.translate.expression.ExpressionVisitor;
diff --git a/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java b/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java
index 88af4c2edc1..22fb2517f4f 100644
--- a/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java
@@ -3,6 +3,7 @@ package org.jetbrains.k2js.translate.general;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetVisitor;
+import org.jetbrains.k2js.translate.context.TranslationContext;
/**
* @author Talanov Pavel
diff --git a/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java b/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java
index 30797b50a08..d3d04f34b75 100644
--- a/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java
@@ -6,9 +6,9 @@ import com.google.dart.compiler.backend.js.ast.JsScope;
import com.google.dart.compiler.backend.js.ast.JsStatement;
import org.jetbrains.annotations.NotNull;
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;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-import org.jetbrains.k2js.translate.utils.Namer;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java
index 2f563829d3c..eed06e3d8ba 100644
--- a/translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java
@@ -9,9 +9,9 @@ import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetDelegationSpecifier;
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall;
import org.jetbrains.jet.lang.psi.JetParameter;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.Namer;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
-import org.jetbrains.k2js.translate.utils.Namer;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
import java.util.ArrayList;
diff --git a/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java
index 4acf0aa2667..651aa6d5720 100644
--- a/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java
+++ b/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java
@@ -5,8 +5,8 @@ import com.google.dart.compiler.backend.js.ast.JsStatement;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.general.TranslatorVisitor;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
diff --git a/translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java b/translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java
index ddaaa807df4..5e3c8c443b6 100644
--- a/translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java
@@ -5,7 +5,7 @@ import com.google.dart.compiler.backend.js.ast.JsScope;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetNamespace;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
/**
* @author Talanov Pavel
diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/BinaryOperationIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/BinaryOperationIntrinsic.java
index 6baab3bcd1e..a552032247e 100644
--- a/translator/src/org/jetbrains/k2js/translate/intrinsic/BinaryOperationIntrinsic.java
+++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/BinaryOperationIntrinsic.java
@@ -5,7 +5,7 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.operation.OperatorTable;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java
index 954cb55da84..7dbe85cb0c9 100644
--- a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java
+++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsic.java
@@ -2,7 +2,7 @@ package org.jetbrains.k2js.translate.intrinsic;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java
index 3b91bacfbff..88b4c5850c1 100644
--- a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java
+++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java
@@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.k2js.translate.operation.OperatorTable;
+import org.jetbrains.k2js.translate.utils.DescriptorUtils;
import java.util.HashMap;
import java.util.Map;
@@ -57,15 +58,17 @@ public final class Intrinsics {
private void addUnaryIntrinsics(@NotNull FunctionDescriptor descriptor) {
String functionName = descriptor.getName();
JetToken token = OperatorConventions.UNARY_OPERATION_NAMES.inverse().get(functionName);
- if (token != null) {
+ boolean isUnary = !DescriptorUtils.hasParameters(descriptor);
+ if (isUnary && (token != null)) {
descriptorToIntrinsicMap.put(descriptor, UnaryOperationIntrinsic.newInstance(token));
}
}
private void addBinaryIntrinsics(@NotNull FunctionDescriptor descriptor) {
String functionName = descriptor.getName();
+ boolean isUnary = !DescriptorUtils.hasParameters(descriptor);
JetToken token = OperatorConventions.BINARY_OPERATION_NAMES.inverse().get(functionName);
- if (token != null && OperatorTable.hasCorrespondingBinaryOperator(token)) {
+ if (token != null && OperatorTable.hasCorrespondingBinaryOperator(token) && (!isUnary)) {
descriptorToIntrinsicMap.put(descriptor, BinaryOperationIntrinsic.newInstance(token));
}
}
diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveCompareToIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveCompareToIntrinsic.java
index a8abea879a4..d4590486e56 100644
--- a/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveCompareToIntrinsic.java
+++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveCompareToIntrinsic.java
@@ -4,7 +4,7 @@ import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.operation.OperatorTable;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveEqualsIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveEqualsIntrinsic.java
index fc504b8aeef..36cc7eb69d1 100644
--- a/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveEqualsIntrinsic.java
+++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/PrimitiveEqualsIntrinsic.java
@@ -3,7 +3,7 @@ package org.jetbrains.k2js.translate.intrinsic;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/UnaryOperationIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/UnaryOperationIntrinsic.java
index 63991827f77..03bf3360070 100644
--- a/translator/src/org/jetbrains/k2js/translate/intrinsic/UnaryOperationIntrinsic.java
+++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/UnaryOperationIntrinsic.java
@@ -5,7 +5,7 @@ import com.google.dart.compiler.backend.js.ast.JsPrefixOperation;
import com.google.dart.compiler.backend.js.ast.JsUnaryOperator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.operation.OperatorTable;
import java.util.List;
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java
new file mode 100644
index 00000000000..646e0a82396
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/operation/AssignmentTranslator.java
@@ -0,0 +1,56 @@
+package org.jetbrains.k2js.translate.operation;
+
+import com.google.dart.compiler.backend.js.ast.JsExpression;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.JetBinaryExpression;
+import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
+import org.jetbrains.jet.lexer.JetToken;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.general.AbstractTranslator;
+import org.jetbrains.k2js.translate.reference.AccessTranslator;
+
+import static org.jetbrains.k2js.translate.utils.BindingUtils.isVariableReassignment;
+import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
+import static org.jetbrains.k2js.translate.utils.TranslationUtils.isIntrinsicOperation;
+import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression;
+
+/**
+ * @author Talanov Pavel
+ */
+public abstract class AssignmentTranslator extends AbstractTranslator {
+
+ public static boolean isAssignmentOperator(JetBinaryExpression expression) {
+ JetToken operationToken = getOperationToken(expression);
+ return (OperatorConventions.ASSIGNMENT_OPERATIONS.keySet().contains(operationToken)
+ || OperatorTable.isAssignment(operationToken));
+ }
+
+ @NotNull
+ public static JsExpression translate(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ if (isIntrinsicOperation(context, expression)) {
+ return IntrinsicAssignmentTranslator.translate(expression, context);
+ }
+ return OverloadedAssignmentTranslator.translate(expression, context);
+ }
+
+ @NotNull
+ protected final JetBinaryExpression expression;
+ protected final AccessTranslator accessTranslator;
+ protected final boolean isVariableReassignment;
+ @NotNull
+ protected final JsExpression right;
+
+ protected AssignmentTranslator(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = expression;
+ this.isVariableReassignment = isVariableReassignment(context.bindingContext(), expression);
+ this.accessTranslator = AccessTranslator.getAccessTranslator(expression.getLeft(), context());
+ this.right = translateRightExpression(context(), expression);
+ }
+
+ @NotNull
+ abstract protected JsExpression translate();
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
index 073d96a0329..bf0aff3144e 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
@@ -1,14 +1,29 @@
package org.jetbrains.k2js.translate.operation;
+import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
+import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
import com.google.dart.compiler.backend.js.ast.JsExpression;
-import com.google.dart.compiler.backend.js.ast.JsInvocation;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
+import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetBinaryExpression;
+import org.jetbrains.jet.lang.psi.JetOperationExpression;
+import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
+import org.jetbrains.jet.lexer.JetTokens;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.general.AbstractTranslator;
+import org.jetbrains.k2js.translate.intrinsic.CompareToIntrinsic;
+import org.jetbrains.k2js.translate.intrinsic.EqualsIntrinsic;
+import org.jetbrains.k2js.translate.intrinsic.Intrinsic;
+import org.jetbrains.k2js.translate.reference.CallTranslator;
-import static org.jetbrains.k2js.translate.utils.BindingUtils.isVariableReassignment;
+import java.util.Arrays;
+
+import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression;
+import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression;
+import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateLeftExpression;
import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression;
@@ -16,44 +31,98 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRight
/**
* @author Talanov Pavel
*/
-public abstract class BinaryOperationTranslator extends OperationTranslator {
+public final class BinaryOperationTranslator extends AbstractTranslator {
+
+
+ //TODO: move to utils
+ @NotNull
+ private static DeclarationDescriptor getOperationDescriptor(@NotNull JetOperationExpression expression,
+ @NotNull TranslationContext context) {
+ DeclarationDescriptor descriptorForReferenceExpression = getDescriptorForReferenceExpression
+ (context.bindingContext(), expression.getOperation());
+ assert descriptorForReferenceExpression != null;
+ return descriptorForReferenceExpression;
+ }
+
+ @NotNull
+ public static JsExpression translate(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ return (new BinaryOperationTranslator(expression, context).translate());
+ }
+
+ private BinaryOperationTranslator(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = expression;
+ this.operationDescriptor =
+ getFunctionDescriptorForOperationExpression(context().bindingContext(), expression);
+ }
@NotNull
private final JetBinaryExpression expression;
- protected final boolean isPropertyOnTheLeft;
- protected final boolean isVariableReassignment;
- @NotNull
- protected final JsExpression left;
- @NotNull
- protected final JsExpression right;
- protected BinaryOperationTranslator(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- super(context);
- this.expression = expression;
- this.isPropertyOnTheLeft = isPropertyAccess(expression.getLeft());
- this.isVariableReassignment = isVariableReassignment(context.bindingContext(), expression);
+ @Nullable
+ private final FunctionDescriptor operationDescriptor;
- this.right = translateRightExpression(context(), expression);
- //TODO: decide whether it is harmful to possibly translateNamespace left expression more than once
- this.left = translateLeftExpression(context(), expression);
+ @NotNull
+ private JsExpression translate() {
+ if (AssignmentTranslator.isAssignmentOperator(expression)) {
+ return AssignmentTranslator.translate(expression, context());
+ }
+ if (operationDescriptor == null) {
+ return translateAsUnOverloadableBinaryOperation();
+ }
+ if (isEqualsCall()) {
+ return translateAsEqualsCall();
+ }
+ if (isCompareToCall()) {
+ return translateAsCompareToCall();
+ }
+ return CallTranslator.translate(expression, context());
+ }
+
+ private boolean isEqualsCall() {
+ //TODO: add descriptor is equals utils
+ assert operationDescriptor != null;
+ boolean isEquals = operationDescriptor.getName().equals("equals");
+ boolean isIntrinsic = context().intrinsics().hasDescriptor(operationDescriptor);
+ return isEquals && isIntrinsic;
}
@NotNull
- abstract protected JsExpression translate();
+ private JsExpression translateAsEqualsCall() {
+ Intrinsic intrinsic = context().intrinsics().
+ getIntrinsic(getOperationDescriptor(expression, context()));
+ //TODO
+ ((EqualsIntrinsic) intrinsic).setNegated(expression.getOperationToken().equals(JetTokens.EXCLEQ));
+ JsExpression left = translateLeftExpression(context(), expression);
+ JsExpression right = translateRightExpression(context(), expression);
+ return intrinsic.apply(left, Arrays.asList(right), context());
+ }
-
- @NotNull
- protected JetToken getOperationToken() {
- return (JetToken) expression.getOperationToken();
+ private boolean isCompareToCall() {
+ DeclarationDescriptor operationDescriptor = getOperationDescriptor(expression, context());
+ return (operationDescriptor.getName().equals("compareTo")
+ && (context().intrinsics().hasDescriptor(operationDescriptor)));
}
@NotNull
- protected JsInvocation setterCall(@NotNull JsExpression assignTo) {
- JsInvocation setterCall =
- PropertyAccessTranslator.translateAsPropertySetterCall(expression.getLeft(), context());
- setterCall.setArguments(assignTo);
- return setterCall;
+ private JsExpression translateAsCompareToCall() {
+ Intrinsic intrinsic = context().intrinsics().
+ getIntrinsic(getOperationDescriptor(expression, context()));
+ ((CompareToIntrinsic) intrinsic).setComparisonToken((JetToken) expression.getOperationToken());
+ return intrinsic.apply(translateLeftExpression(context(), expression),
+ Arrays.asList(translateRightExpression(context(), expression)), context());
+ }
+
+ @NotNull
+ private JsExpression translateAsUnOverloadableBinaryOperation() {
+ JetToken token = getOperationToken(expression);
+ JsBinaryOperator operator = OperatorTable.getBinaryOperator(token);
+ assert OperatorConventions.NOT_OVERLOADABLE.contains(token);
+ JsExpression left = translateLeftExpression(context(), expression);
+ JsExpression right = translateRightExpression(context(), expression);
+ return new JsBinaryOperation(operator, left, right);
}
}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/EqualsTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/EqualsTranslator.java
deleted file mode 100644
index 11ba6e06915..00000000000
--- a/translator/src/org/jetbrains/k2js/translate/operation/EqualsTranslator.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.jetbrains.k2js.translate.operation;
-
-/**
- * @author Talanov Pavel
- */
-public final class EqualsTranslator {
-
-
-}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/IncrementTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/IncrementTranslator.java
new file mode 100644
index 00000000000..737bd95f1d0
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/operation/IncrementTranslator.java
@@ -0,0 +1,152 @@
+package org.jetbrains.k2js.translate.operation;
+
+import com.google.dart.compiler.backend.js.ast.JsExpression;
+import com.google.dart.compiler.backend.js.ast.JsName;
+import com.google.dart.compiler.backend.js.ast.JsNameRef;
+import com.google.dart.compiler.util.AstUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.JetExpression;
+import org.jetbrains.jet.lang.psi.JetPrefixExpression;
+import org.jetbrains.jet.lang.psi.JetUnaryExpression;
+import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.general.AbstractTranslator;
+import org.jetbrains.k2js.translate.reference.AccessTranslator;
+
+import static org.jetbrains.k2js.translate.utils.BindingUtils.isStatement;
+import static org.jetbrains.k2js.translate.utils.BindingUtils.isVariableReassignment;
+import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
+import static org.jetbrains.k2js.translate.utils.TranslationUtils.isIntrinsicOperation;
+
+/**
+ * @author Talanov Pavel
+ */
+//TODO: reexamine class, see if can be clearer
+public abstract class IncrementTranslator extends AbstractTranslator {
+
+ public static boolean isIncrement(@NotNull JetUnaryExpression expression) {
+ return OperatorConventions.INCREMENT_OPERATIONS.contains(getOperationToken(expression));
+ }
+
+ @NotNull
+ public static JsExpression translate(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
+ if (isIntrinsicOperation(context, expression)) {
+ return IntrinsicIncrementTranslator.translate(expression, context);
+ }
+ return OverloadedIncrementTranslator.translate(expression, context);
+ }
+
+ @NotNull
+ protected final JetUnaryExpression expression;
+ @NotNull
+ protected final AccessTranslator accessTranslator;
+ protected final boolean isPrefix;
+ private final boolean isVariableReassignment;
+ private final boolean isStatement;
+
+ protected IncrementTranslator(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = expression;
+ this.isPrefix = isPrefix(expression);
+ this.isVariableReassignment = isVariableReassignment(context.bindingContext(), expression);
+ this.isStatement = isStatement(context().bindingContext(), expression);
+ //TODO: use util method
+ JetExpression baseExpression = expression.getBaseExpression();
+ assert baseExpression != null;
+ this.accessTranslator = AccessTranslator.getAccessTranslator(baseExpression, context());
+ }
+
+ @NotNull
+ protected abstract JsExpression translate();
+
+ @NotNull
+ protected JsExpression translateAsMethodCall() {
+ if (isStatement || isPrefix) {
+ return asPrefix();
+ }
+ if (isVariableReassignment) {
+ return asPostfixWithReassignment();
+ } else {
+ return asPostfixWithNoReassignment();
+ }
+ }
+
+ @NotNull
+ private JsExpression asPrefix() {
+ JsExpression getExpression = accessTranslator.translateAsGet();
+ if (isVariableReassignment) {
+ return variableReassignment(getExpression);
+ }
+ return operationExpression(getExpression);
+ }
+
+ //TODO: decide if this expression can be optimised in case of direct access (not property)
+ @NotNull
+ private JsExpression asPostfixWithReassignment() {
+ // code fragment: expr(a++)
+ // generate: expr( (t1 = a, t2 = t1, a = t1.inc(), t2) )
+ TemporaryVariable t1 = declareTemporary(accessTranslator.translateAsGet());
+ TemporaryVariable t2 = declareTemporary(t1.nameReference());
+ JsExpression variableReassignment = variableReassignment(t1.nameReference());
+ return AstUtil.newSequence(t1.assignmentExpression(), t2.assignmentExpression(),
+ variableReassignment, t2.nameReference());
+ }
+
+ @NotNull
+ private JsExpression asPostfixWithNoReassignment() {
+ // code fragment: expr(a++)
+ // generate: expr( (t1 = a, t2 = t1, t2.inc(), t1) )
+ TemporaryVariable t1 = declareTemporary(accessTranslator.translateAsGet());
+ TemporaryVariable t2 = declareTemporary(t1.nameReference());
+ JsExpression methodCall = operationExpression(t2.nameReference());
+ JsExpression returnedValue = t1.nameReference();
+ return AstUtil.newSequence(t1.assignmentExpression(), t2.assignmentExpression(), methodCall, returnedValue);
+ }
+
+ @NotNull
+ private JsExpression variableReassignment(@NotNull JsExpression toCallMethodUpon) {
+ JsExpression overloadedMethodCallOnPropertyGetter = operationExpression(toCallMethodUpon);
+ return accessTranslator.translateAsSet(overloadedMethodCallOnPropertyGetter);
+ }
+
+ @NotNull
+ abstract JsExpression operationExpression(@NotNull JsExpression receiver);
+
+
+ private boolean isPrefix(@NotNull JetUnaryExpression expression) {
+ return (expression instanceof JetPrefixExpression);
+ }
+
+ //TODO: consider moving into context
+ protected final class TemporaryVariable {
+
+ @NotNull
+ private final JsExpression assignmentExpression;
+ @NotNull
+ private final JsName variableName;
+
+ private TemporaryVariable(@NotNull JsExpression initExpression) {
+ this.variableName = context().enclosingScope().declareTemporary();
+ this.assignmentExpression = AstUtil.newAssignment(variableName.makeRef(), initExpression);
+ }
+
+ @NotNull
+ public JsNameRef nameReference() {
+ return variableName.makeRef();
+ }
+
+ @NotNull
+ public JsExpression assignmentExpression() {
+ return assignmentExpression;
+ }
+ }
+
+ @NotNull
+ public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) {
+ return new TemporaryVariable(initExpression);
+ }
+
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicBinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicAssignmentTranslator.java
similarity index 51%
rename from translator/src/org/jetbrains/k2js/translate/operation/IntrinsicBinaryOperationTranslator.java
rename to translator/src/org/jetbrains/k2js/translate/operation/IntrinsicAssignmentTranslator.java
index a759347cd7a..c02b2b3b81a 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicBinaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicAssignmentTranslator.java
@@ -5,22 +5,24 @@ import com.google.dart.compiler.backend.js.ast.JsExpression;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetBinaryExpression;
import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+
+import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
/**
* @author Talanov Pavel
*/
-public final class IntrinsicBinaryOperationTranslator extends BinaryOperationTranslator {
+public final class IntrinsicAssignmentTranslator extends AssignmentTranslator {
@NotNull
public static JsExpression translate(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
- return (new IntrinsicBinaryOperationTranslator(expression, context)).translate();
+ return (new IntrinsicAssignmentTranslator(expression, context)).translate();
}
- private IntrinsicBinaryOperationTranslator(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
+ private IntrinsicAssignmentTranslator(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
super(expression, context);
}
@@ -33,19 +35,15 @@ public final class IntrinsicBinaryOperationTranslator extends BinaryOperationTra
//TODO: refactor
@NotNull
private JsExpression asBinaryOperation() {
- if (isPropertyOnTheLeft && OperatorTable.isAssignment(getOperationToken())) {
- return setterCall(right);
+ if (OperatorTable.isAssignment(getOperationToken(expression))) {
+ return accessTranslator.translateAsSet(right);
}
- JetToken token = getOperationToken();
+ //TODO: logic broken
+ JetToken token = getOperationToken(expression);
if (OperatorTable.hasCorrespondingBinaryOperator(token)) {
- return new JsBinaryOperation(OperatorTable.getBinaryOperator(token), left, right);
+ return new JsBinaryOperation(OperatorTable.getBinaryOperator(token),
+ accessTranslator.translateAsGet(), right);
}
- //TODO: implement using intrinsic mechanism
-// if (OperatorTable.hasCorrespondingFunctionInvocation(token)) {
-// JsInvocation functionInvocation = OperatorTable.getCorrespondingFunctionInvocation(token);
-// functionInvocation.setArguments(left, right);
-// return functionInvocation;
-// }
throw new AssertionError("Unsupported token encountered: " + token.toString());
}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicUnaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicIncrementTranslator.java
similarity index 58%
rename from translator/src/org/jetbrains/k2js/translate/operation/IntrinsicUnaryOperationTranslator.java
rename to translator/src/org/jetbrains/k2js/translate/operation/IntrinsicIncrementTranslator.java
index 164800d9a93..c5a6abfe34b 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicUnaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicIncrementTranslator.java
@@ -5,49 +5,58 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetUnaryExpression;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.reference.ReferenceAccessTranslator;
+
+import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
+
/**
* @author Talanov Pavel
*/
-public final class IntrinsicUnaryOperationTranslator extends UnaryOperationTranslator {
+public final class IntrinsicIncrementTranslator extends IncrementTranslator {
@NotNull
public static JsExpression translate(@NotNull JetUnaryExpression expression,
@NotNull TranslationContext context) {
- return (new IntrinsicUnaryOperationTranslator(expression, context))
+ return (new IntrinsicIncrementTranslator(expression, context))
.translate();
}
- protected IntrinsicUnaryOperationTranslator(@NotNull JetUnaryExpression expression,
- @NotNull TranslationContext context) {
+ protected IntrinsicIncrementTranslator(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
super(expression, context);
}
@Override
@NotNull
protected JsExpression translate() {
- if (isPropertyAccess) {
- return translateAsMethodCall();
+ if (isPrimitiveExpressionIncrement()) {
+ return jsUnaryExpression();
}
- return jsUnaryExpression();
+ return translateAsMethodCall();
+ }
+
+ private boolean isPrimitiveExpressionIncrement() {
+ return accessTranslator instanceof ReferenceAccessTranslator;
}
@NotNull
private JsExpression jsUnaryExpression() {
- JsUnaryOperator operator = OperatorTable.getUnaryOperator(getOperationToken());
+ JsUnaryOperator operator = OperatorTable.getUnaryOperator(getOperationToken(expression));
+ JsExpression getExpression = accessTranslator.translateAsGet();
if (isPrefix) {
- return new JsPrefixOperation(operator, baseExpression);
+ return new JsPrefixOperation(operator, getExpression);
} else {
- return new JsPostfixOperation(operator, baseExpression);
+ return new JsPostfixOperation(operator, getExpression);
}
}
@Override
@NotNull
protected JsExpression operationExpression(@NotNull JsExpression receiver) {
- return unaryAsBinary(getOperationToken(), receiver);
+ return unaryAsBinary(getOperationToken(expression), receiver);
}
public JsBinaryOperation unaryAsBinary(@NotNull JetToken token, @NotNull JsExpression expression) {
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java
deleted file mode 100644
index 3ee4bb61fe8..00000000000
--- a/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package org.jetbrains.k2js.translate.operation;
-
-import com.google.dart.compiler.backend.js.ast.JsExpression;
-import com.google.dart.compiler.backend.js.ast.JsName;
-import com.google.dart.compiler.backend.js.ast.JsNameRef;
-import com.google.dart.compiler.util.AstUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
-import org.jetbrains.jet.lang.psi.JetBinaryExpression;
-import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.jet.lang.psi.JetOperationExpression;
-import org.jetbrains.jet.lang.psi.JetUnaryExpression;
-import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.jet.lexer.JetTokens;
-import org.jetbrains.k2js.translate.general.AbstractTranslator;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-import org.jetbrains.k2js.translate.intrinsic.CompareToIntrinsic;
-import org.jetbrains.k2js.translate.intrinsic.EqualsIntrinsic;
-import org.jetbrains.k2js.translate.intrinsic.Intrinsic;
-import org.jetbrains.k2js.translate.reference.ArrayAccessTranslator;
-import org.jetbrains.k2js.translate.reference.CallTranslator;
-import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
-
-import java.util.Arrays;
-
-import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression;
-import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateLeftExpression;
-import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRightExpression;
-
-/**
- * @author Talanov Pavel
- */
-public class OperationTranslator extends AbstractTranslator {
-
- @NotNull
- public static JsExpression translate(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- //TODO: move to assignment translator
- if (ArrayAccessTranslator.canBeArraySetterCall(expression)) {
- return ArrayAccessTranslator.translateAsArraySetterCall(expression, context);
- }
- DeclarationDescriptor descriptorForReferenceExpression = getDescriptorForReferenceExpression
- (context.bindingContext(), expression.getOperation());
- if (descriptorForReferenceExpression == null) {
- return IntrinsicBinaryOperationTranslator.translate(expression, context);
- }
- if (isEqualsCall(expression, context)) {
- return translateAsEqualsCall(expression, context);
- }
- if (isCompareToCall(expression, context)) {
- return translateAsCompareToCall(expression, context);
- }
- return CallTranslator.translate(expression, context);
- }
-
- @NotNull
- public static JsExpression translate(@NotNull JetUnaryExpression expression,
- @NotNull TranslationContext context) {
- return CallTranslator.translate(expression, context);
- }
-
-
- public static boolean isEqualsCall(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- DeclarationDescriptor operationDescriptor = getOperationDescriptor(expression, context);
- //TODO: add descriptor is equals utils
- boolean isEquals = operationDescriptor.getName().equals("equals");
- boolean isIntrinsic = context.intrinsics().hasDescriptor(operationDescriptor);
- return isEquals && isIntrinsic;
- }
-
- @NotNull
- public static JsExpression translateAsEqualsCall(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- Intrinsic intrinsic = context.intrinsics().
- getIntrinsic(getOperationDescriptor(expression, context));
- //TODO
- ((EqualsIntrinsic) intrinsic).setNegated(expression.getOperationToken().equals(JetTokens.EXCLEQ));
- return intrinsic.apply(translateLeftExpression(context, expression),
- Arrays.asList(translateRightExpression(context, expression)), context);
- }
-
- public static boolean isCompareToCall(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- DeclarationDescriptor operationDescriptor = getOperationDescriptor(expression, context);
- return (operationDescriptor.getName().equals("compareTo")
- && (context.intrinsics().hasDescriptor(operationDescriptor)));
- }
-
- @NotNull
- public static JsExpression translateAsCompareToCall(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- Intrinsic intrinsic = context.intrinsics().
- getIntrinsic(getOperationDescriptor(expression, context));
- ((CompareToIntrinsic) intrinsic).setComparisonToken((JetToken) expression.getOperationToken());
- return intrinsic.apply(translateLeftExpression(context, expression),
- Arrays.asList(translateRightExpression(context, expression)), context);
- }
-
- protected OperationTranslator(@NotNull TranslationContext context) {
- super(context);
- }
-
- //TODO: refactor
- @Nullable
- protected static JsNameRef getOverloadedOperationReference(@NotNull JetOperationExpression operationExpression,
- @NotNull TranslationContext context) {
- DeclarationDescriptor operationDescriptor = getOperationDescriptor(operationExpression, context);
- if (!context.isDeclared(operationDescriptor)) {
- return null;
- }
- return context.getNameForDescriptor(operationDescriptor).makeRef();
- }
-
- @NotNull
- private static DeclarationDescriptor getOperationDescriptor(@NotNull JetOperationExpression expression,
- @NotNull TranslationContext context) {
- DeclarationDescriptor descriptorForReferenceExpression = getDescriptorForReferenceExpression
- (context.bindingContext(), expression.getOperation());
- assert descriptorForReferenceExpression != null;
- return descriptorForReferenceExpression;
- }
-
- protected boolean isPropertyAccess(@NotNull JetExpression expression) {
- return PropertyAccessTranslator.canBePropertyAccess(expression, context());
-
- }
-
- protected final class TemporaryVariable {
-
- @NotNull
- private final JsExpression assignmentExpression;
- @NotNull
- private final JsName variableName;
-
- private TemporaryVariable(@NotNull JsExpression initExpression) {
- this.variableName = context().enclosingScope().declareTemporary();
- this.assignmentExpression = AstUtil.newAssignment(variableName.makeRef(), initExpression);
- }
-
- @NotNull
- public JsNameRef nameReference() {
- return variableName.makeRef();
- }
-
- @NotNull
- public JsExpression assignmentExpression() {
- return assignmentExpression;
- }
- }
-
- @NotNull
- public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) {
- return new TemporaryVariable(initExpression);
- }
-}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OperatorTable.java b/translator/src/org/jetbrains/k2js/translate/operation/OperatorTable.java
index cb3af9534fb..ca13967267b 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/OperatorTable.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/OperatorTable.java
@@ -1,10 +1,7 @@
package org.jetbrains.k2js.translate.operation;
import com.google.dart.compiler.backend.js.ast.JsBinaryOperator;
-import com.google.dart.compiler.backend.js.ast.JsInvocation;
-import com.google.dart.compiler.backend.js.ast.JsNameRef;
import com.google.dart.compiler.backend.js.ast.JsUnaryOperator;
-import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
@@ -19,7 +16,6 @@ public final class OperatorTable {
private static Map binaryOperatorsMap = new HashMap();
private static Map unaryOperatorsMap = new HashMap();
- private static Map operatorToFunctionNameReference = new HashMap();
static {
unaryOperatorsMap.put(JetTokens.PLUSPLUS, JsUnaryOperator.INC); //++
@@ -51,26 +47,11 @@ public final class OperatorTable {
binaryOperatorsMap.put(JetTokens.PERCEQ, JsBinaryOperator.ASG_MOD);
}
- //TODO: resolve
- static {
- //operatorToFunctionNameReference.put(JetTokens.IS_KEYWORD, Namer.isOperationReference());
- }
public static boolean hasCorrespondingBinaryOperator(@NotNull JetToken token) {
return binaryOperatorsMap.containsKey(token);
}
- public static boolean hasCorrespondingFunctionInvocation(@NotNull JetToken token) {
- return operatorToFunctionNameReference.containsKey(token);
- }
-
- @NotNull
- static public JsInvocation getCorrespondingFunctionInvocation(@NotNull JetToken token) {
- JsNameRef functionReference = operatorToFunctionNameReference.get(token);
- assert functionReference != null : "Token should represent a function call!";
- return AstUtil.newInvocation(functionReference);
- }
-
@NotNull
static public JsBinaryOperator getBinaryOperator(@NotNull JetToken token) {
assert JetTokens.OPERATIONS.contains(token) : "Token should represent an operation!";
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedBinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java
similarity index 58%
rename from translator/src/org/jetbrains/k2js/translate/operation/OverloadedBinaryOperationTranslator.java
rename to translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java
index 5ad71e2d15b..f356bae5856 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedBinaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java
@@ -3,29 +3,37 @@ package org.jetbrains.k2js.translate.operation;
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.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetBinaryExpression;
import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.TranslationContext;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+
+import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression;
+import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken;
/**
* @author Talanov Pavel
*/
-public final class OverloadedBinaryOperationTranslator extends BinaryOperationTranslator {
+public final class OverloadedAssignmentTranslator extends AssignmentTranslator {
@NotNull
public static JsExpression translate(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
- return (new OverloadedBinaryOperationTranslator(expression, context)).translate();
+ return (new OverloadedAssignmentTranslator(expression, context)).translate();
}
@NotNull
private final JsNameRef operationReference;
- private OverloadedBinaryOperationTranslator(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
+ private OverloadedAssignmentTranslator(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
super(expression, context);
- JsNameRef overloadedOperationReference = getOverloadedOperationReference(expression, context);
+ //TODO: util
+ DeclarationDescriptor overloadedOperationDescriptor = getDescriptorForReferenceExpression
+ (context.bindingContext(), expression.getOperation());
+ assert overloadedOperationDescriptor != null;
+ JsNameRef overloadedOperationReference = context().getNameForDescriptor(overloadedOperationDescriptor).makeRef();
assert overloadedOperationReference != null;
this.operationReference = overloadedOperationReference;
}
@@ -41,7 +49,7 @@ public final class OverloadedBinaryOperationTranslator extends BinaryOperationTr
@NotNull
private JsExpression asCompareToOverload() {
- JetToken operationToken = getOperationToken();
+ JetToken operationToken = getOperationToken(expression);
assert (OperatorConventions.COMPARISON_OPERATIONS.contains(operationToken));
JsNumberLiteral zeroLiteral = program().getNumberLiteral(0);
JsBinaryOperator correspondingOperator = OperatorTable.getBinaryOperator(operationToken);
@@ -49,36 +57,29 @@ public final class OverloadedBinaryOperationTranslator extends BinaryOperationTr
}
private boolean isCompareTo() {
- String nameForOperationSymbol = OperatorConventions.getNameForOperationSymbol(getOperationToken());
+ //util
+ JetToken operationToken = getOperationToken(expression);
+ String nameForOperationSymbol = OperatorConventions.getNameForOperationSymbol(operationToken);
assert nameForOperationSymbol != null : "Must have a name for overloaded operator";
return (nameForOperationSymbol.equals("compareTo"));
}
@NotNull
private JsExpression asOverloadedMethodCall() {
- if (isPropertyOnTheLeft && isVariableReassignment) {
- return propertyReassignment();
- }
if (isVariableReassignment) {
- return nonPropertyReassignment();
+ return reassignment();
}
return overloadedMethodInvocation();
}
@NotNull
- private JsInvocation propertyReassignment() {
- return setterCall(overloadedMethodInvocation());
- }
-
- @NotNull
- private JsExpression nonPropertyReassignment() {
- assert left instanceof JsNameRef : "Reassignment should be called on l-value.";
- return AstUtil.newAssignment((JsNameRef) left, overloadedMethodInvocation());
+ private JsExpression reassignment() {
+ return accessTranslator.translateAsSet(overloadedMethodInvocation());
}
@NotNull
private JsExpression overloadedMethodInvocation() {
- AstUtil.setQualifier(operationReference, left);
+ AstUtil.setQualifier(operationReference, accessTranslator.translateAsGet());
return AstUtil.newInvocation(operationReference, right);
}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java
new file mode 100644
index 00000000000..9cbd5893327
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedIncrementTranslator.java
@@ -0,0 +1,53 @@
+package org.jetbrains.k2js.translate.operation;
+
+import com.google.dart.compiler.backend.js.ast.JsExpression;
+import com.google.dart.compiler.backend.js.ast.JsNameRef;
+import com.google.dart.compiler.util.AstUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
+import org.jetbrains.jet.lang.psi.JetUnaryExpression;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.utils.BindingUtils;
+
+/**
+ * @author Talanov Pavel
+ */
+// TODO: provide better increment translator logic
+public final class OverloadedIncrementTranslator extends IncrementTranslator {
+
+ @NotNull
+ public static JsExpression translate(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
+ return (new OverloadedIncrementTranslator(expression, context))
+ .translate();
+ }
+
+ @NotNull
+ private final JsNameRef operationReference;
+
+ private OverloadedIncrementTranslator(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
+ super(expression, context);
+ //TODO: DUBLICATE CODE
+ DeclarationDescriptor overloadedOperationDescriptor = BindingUtils.getDescriptorForReferenceExpression
+ (context.bindingContext(), expression.getOperation());
+ assert overloadedOperationDescriptor != null;
+ JsNameRef overloadedOperationReference = context().getNameForDescriptor(overloadedOperationDescriptor).makeRef();
+ assert overloadedOperationReference != null;
+ this.operationReference = overloadedOperationReference;
+ }
+
+ @Override
+ @NotNull
+ protected JsExpression translate() {
+ return translateAsMethodCall();
+ }
+
+ @Override
+ @NotNull
+ protected JsExpression operationExpression(@NotNull JsExpression receiver) {
+ AstUtil.setQualifier(operationReference, receiver);
+ return AstUtil.newInvocation(operationReference);
+ }
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedUnaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedUnaryOperationTranslator.java
deleted file mode 100644
index 3220899701e..00000000000
--- a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedUnaryOperationTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.jetbrains.k2js.translate.operation;
-
-import com.google.dart.compiler.backend.js.ast.JsExpression;
-import com.google.dart.compiler.backend.js.ast.JsNameRef;
-import com.google.dart.compiler.util.AstUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.psi.JetUnaryExpression;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-
-/**
- * @author Talanov Pavel
- */
-public final class OverloadedUnaryOperationTranslator extends UnaryOperationTranslator {
-
- @NotNull
- public static JsExpression translate(@NotNull JetUnaryExpression expression,
- @NotNull TranslationContext context) {
- return (new OverloadedUnaryOperationTranslator(expression, context))
- .translate();
- }
-
- @NotNull
- private final JsNameRef operationReference;
-
- private OverloadedUnaryOperationTranslator(@NotNull JetUnaryExpression expression,
- @NotNull TranslationContext context) {
- super(expression, context);
- this.operationReference = getOverloadedOperationReference(expression, context);
- }
-
- @Override
- @NotNull
- protected JsExpression translate() {
- return translateAsMethodCall();
- }
-
- @Override
- @NotNull
- protected JsExpression operationExpression(@NotNull JsExpression receiver) {
- AstUtil.setQualifier(operationReference, receiver);
- return AstUtil.newInvocation(operationReference);
- }
-
-}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
index 77266850435..2165d90b173 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
@@ -1,134 +1,26 @@
package org.jetbrains.k2js.translate.operation;
import com.google.dart.compiler.backend.js.ast.JsExpression;
-import com.google.dart.compiler.backend.js.ast.JsInvocation;
-import com.google.dart.compiler.backend.js.ast.JsNameRef;
-import com.google.dart.compiler.util.AstUtil;
-import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.jet.lang.psi.JetPrefixExpression;
-import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.psi.JetUnaryExpression;
-import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator;
-import org.jetbrains.k2js.translate.utils.BindingUtils;
-
-import static org.jetbrains.k2js.translate.utils.BindingUtils.isVariableReassignment;
-import static org.jetbrains.k2js.translate.utils.TranslationUtils.getBaseExpression;
-import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateBaseExpression;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.reference.CallTranslator;
+import org.jetbrains.k2js.translate.utils.TranslationUtils;
/**
* @author Talanov Pavel
*/
-//TODO: reexamine class, see if can be clearer
-public abstract class UnaryOperationTranslator extends OperationTranslator {
+
+//TODO: merge with binary operation
+public final class UnaryOperationTranslator {
@NotNull
- private final JetUnaryExpression expression;
- @NotNull
- protected final JsExpression baseExpression;
- protected final boolean isPrefix;
- private final boolean isVariableReassignment;
- private final boolean isStatement;
- protected final boolean isPropertyAccess;
-
- protected UnaryOperationTranslator(@NotNull JetUnaryExpression expression,
- @NotNull TranslationContext context) {
- super(context);
- this.expression = expression;
- this.isPrefix = isPrefix(expression);
- this.isVariableReassignment = isVariableReassignment(context.bindingContext(), expression);
- this.isStatement = BindingUtils.isStatement(context().bindingContext(), expression);
- this.baseExpression = translateBaseExpression(context, expression);
- this.isPropertyAccess = isPropertyAccess(getBaseExpression(expression));
- }
-
- @NotNull
- protected abstract JsExpression translate();
-
- @NotNull
- protected JsExpression translateAsMethodCall() {
- if (isStatement || isPrefix) {
- return asPrefix();
- }
- if (isVariableReassignment) {
- return asPostfixWithReassignment();
- } else {
- return asPostfixWithNoReassignment();
+ public static JsExpression translate(@NotNull JetUnaryExpression expression,
+ @NotNull TranslationContext context) {
+ if (IncrementTranslator.isIncrement(expression)) {
+ return IncrementTranslator.translate(expression, context);
}
+ assert TranslationUtils.isIntrinsicOperation(context, expression);
+ return CallTranslator.translate(expression, context);
}
-
- @NotNull
- private JsExpression asPrefix() {
- if (isVariableReassignment) {
- return variableReassignment(baseExpression);
- }
- return operationExpression(baseExpression);
- }
-
- //TODO: decide if this expression can be optimised in case of direct access (not property)
- @NotNull
- private JsExpression asPostfixWithReassignment() {
- // code fragment: expr(a++)
- // generate: expr( (t1 = a, t2 = t1, a = t1.inc(), t2) )
- TemporaryVariable t1 = declareTemporary(baseExpression);
- TemporaryVariable t2 = declareTemporary(t1.nameReference());
- JsExpression variableReassignment = variableReassignment(t1.nameReference());
- return AstUtil.newSequence(t1.assignmentExpression(), t2.assignmentExpression(),
- variableReassignment, t2.nameReference());
- }
-
- @NotNull
- private JsExpression asPostfixWithNoReassignment() {
- // code fragment: expr(a++)
- // generate: expr( (t1 = a, t2 = t1, t2.inc(), t1) )
- TemporaryVariable t1 = declareTemporary(baseExpression);
- TemporaryVariable t2 = declareTemporary(t1.nameReference());
- JsExpression methodCall = operationExpression(t2.nameReference());
- JsExpression returnedValue = t1.nameReference();
- return AstUtil.newSequence(t1.assignmentExpression(), t2.assignmentExpression(), methodCall, returnedValue);
- }
-
- @NotNull
- private JsExpression variableReassignment(@NotNull JsExpression toCallMethodUpon) {
- if (isPropertyAccess) {
- return propertyReassignment(toCallMethodUpon);
- }
- return localVariableReassignment(toCallMethodUpon);
- }
-
- private JsExpression localVariableReassignment(@NotNull JsExpression toCallMethodUpon) {
- assert baseExpression instanceof JsNameRef : "Base expression should be an l-value";
- return AstUtil.newAssignment((JsNameRef) baseExpression, operationExpression(toCallMethodUpon));
- }
-
- @NotNull
- private JsExpression propertyReassignment(@NotNull JsExpression toCallMethodUpon) {
- JetExpression jetBaseExpression = getBaseExpression(expression);
- JsInvocation setterCall =
- PropertyAccessTranslator.translateAsPropertySetterCall(jetBaseExpression, context());
- assert PropertyAccessTranslator.canBePropertyGetterCall(jetBaseExpression, context()) : "Should be a getter call";
- JsExpression overloadedMethodCallOnPropertyGetter = operationExpression(toCallMethodUpon);
- setterCall.setArguments(overloadedMethodCallOnPropertyGetter);
- return setterCall;
- }
-
- @NotNull
- abstract JsExpression operationExpression(@NotNull JsExpression receiver);
-
- @NotNull
- protected JetToken getOperationToken() {
- JetSimpleNameExpression operationExpression = expression.getOperation();
- IElementType elementType = operationExpression.getReferencedNameElementType();
- assert elementType instanceof JetToken : "Unary expression should have IElementType of type JetToken";
- return (JetToken) elementType;
- }
-
- private boolean isPrefix(JetUnaryExpression expression) {
- return (expression instanceof JetPrefixExpression);
- }
-
-
}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java
new file mode 100644
index 00000000000..385f9e161a6
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java
@@ -0,0 +1,44 @@
+package org.jetbrains.k2js.translate.reference;
+
+import com.google.dart.compiler.backend.js.ast.JsExpression;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+import org.jetbrains.k2js.translate.general.AbstractTranslator;
+
+/**
+ * @author Talanov Pavel
+ */
+public abstract class AccessTranslator extends AbstractTranslator {
+
+ @NotNull
+ public static AccessTranslator getAccessTranslator(@NotNull JetExpression referenceExpression,
+ @NotNull TranslationContext context) {
+ assert ((referenceExpression instanceof JetReferenceExpression) ||
+ (referenceExpression instanceof JetDotQualifiedExpression));
+ if (PropertyAccessTranslator.canBePropertyAccess(referenceExpression, context)) {
+ return PropertyAccessTranslator.newInstance(referenceExpression, context);
+ }
+ if (referenceExpression instanceof JetArrayAccessExpression) {
+ return ArrayAccessTranslator.newInstance((JetArrayAccessExpression) referenceExpression, context);
+ }
+ return ReferenceAccessTranslator.newInstance((JetSimpleNameExpression) referenceExpression, context);
+ }
+
+
+ @NotNull
+ public static JsExpression translateAsGet(@NotNull JetReferenceExpression expression,
+ @NotNull TranslationContext context) {
+ return (getAccessTranslator(expression, context)).translateAsGet();
+ }
+
+
+ protected AccessTranslator(@Deprecated TranslationContext context) {
+ super(context);
+ }
+
+ public abstract JsExpression translateAsGet();
+
+ public abstract JsExpression translateAsSet(@NotNull JsExpression setTo);
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java
index 0d519f79c22..8a92d6c1cd8 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java
@@ -5,16 +5,10 @@ import com.google.dart.compiler.backend.js.ast.JsInvocation;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetArrayAccessExpression;
-import org.jetbrains.jet.lang.psi.JetBinaryExpression;
-import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.jet.lexer.JetToken;
-import org.jetbrains.k2js.translate.general.AbstractTranslator;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
-import org.jetbrains.k2js.translate.operation.OperatorTable;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
@@ -23,41 +17,25 @@ import java.util.List;
/**
* @author Talanov Pavel
*/
-public final class ArrayAccessTranslator extends AbstractTranslator {
+public final class ArrayAccessTranslator extends AccessTranslator {
- public static boolean canBeArraySetterCall(@NotNull JetBinaryExpression expression) {
- //TODO: move unsafe call to util
- return (OperatorTable.isAssignment((JetToken) expression.getOperationToken())
- && (expression.getLeft() instanceof JetArrayAccessExpression));
+ public static ArrayAccessTranslator newInstance(@NotNull JetArrayAccessExpression expression,
+ @NotNull TranslationContext context) {
+ return new ArrayAccessTranslator(expression, context);
}
- public static JsInvocation translateAsArrayGetterCall(@NotNull JetArrayAccessExpression expression,
- @NotNull TranslationContext context) {
- return (new ArrayAccessTranslator(expression, null, context)).translateAsArrayGet();
- }
-
- public static JsInvocation translateAsArraySetterCall(@NotNull JetBinaryExpression expression,
- @NotNull TranslationContext context) {
- JetExpression arrayAccess = expression.getLeft();
- assert (arrayAccess instanceof JetArrayAccessExpression) : "Check with canBeArraySetterCall";
- JetExpression right = expression.getRight();
- assert right != null : "Binary expression should have a right expression";
- JsExpression expressionToSetTo = Translation.translateAsExpression(right, context);
- return (new ArrayAccessTranslator((JetArrayAccessExpression) arrayAccess, expressionToSetTo, context))
- .translateAsArraySet();
- }
+// public static JsExpression translateAsArrayGet(@NotNull JetArrayAccessExpression expression,
+// @NotNull TranslationContext context) {
+// return (new ArrayAccessTranslator(expression, context)).translateAsGet();
+// }
@NotNull
private final JetArrayAccessExpression expression;
@NotNull
private final DeclarationDescriptor methodDescriptor;
- @Nullable
- private final JsExpression expressionToSetTo;
-
private ArrayAccessTranslator(@NotNull JetArrayAccessExpression expression,
- @Nullable JsExpression expressionToSetTo,
@NotNull TranslationContext context) {
super(context);
this.expression = expression;
@@ -65,28 +43,28 @@ public final class ArrayAccessTranslator extends AbstractTranslator {
BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression);
assert descriptorForReferenceExpression != null : "Array access expression must reference a descriptor";
this.methodDescriptor = descriptorForReferenceExpression;
- this.expressionToSetTo = expressionToSetTo;
}
+ @Override
@NotNull
- private JsInvocation translateAsArrayGet() {
+ public JsInvocation translateAsGet() {
return translateAsArrayAccessWithIndices();
}
+ @Override
+ @NotNull
+ public JsExpression translateAsSet(@NotNull JsExpression expression) {
+ JsInvocation setCall = translateAsArrayAccessWithIndices();
+ setCall.getArguments().add(expression);
+ return setCall;
+ }
+
private JsInvocation translateAsArrayAccessWithIndices() {
JsNameRef accessMethodReference = getAccessMethodReference();
AstUtil.setQualifier(accessMethodReference, translateArrayExpression());
return AstUtil.newInvocation(accessMethodReference, translateIndexExpressions());
}
- @NotNull
- private JsInvocation translateAsArraySet() {
- assert expressionToSetTo != null;
- JsInvocation setCall = translateAsArrayAccessWithIndices();
- setCall.getArguments().add(expressionToSetTo);
- return setCall;
- }
-
@NotNull
private List translateIndexExpressions() {
return TranslationUtils.translateExpressionList(context(), expression.getIndexExpressions());
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java
index 373a4fa2e4c..b7ebd35d06a 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java
@@ -10,8 +10,8 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.Intrinsic;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
index 57a2e5e4da1..cdf398f12ae 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java
@@ -13,68 +13,54 @@ import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetQualifiedExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
-import org.jetbrains.k2js.translate.general.AbstractTranslator;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.PsiUtils;
/**
* @author Talanov Pavel
*/
-public final class PropertyAccessTranslator extends AbstractTranslator {
+public final class PropertyAccessTranslator extends AccessTranslator {
private static String MESSAGE = "Cannot be accessor call. Use canBeProperty*Call to ensure this method " +
"can be called safely.";
+
@NotNull
- public static JsInvocation translateAsPropertySetterCall(@NotNull JetQualifiedExpression expression,
+ public static JsExpression translateAsPropertyGetterCall(@NotNull JetQualifiedExpression expression,
@NotNull TranslationContext context) {
return (new PropertyAccessTranslator(expression, context))
- .translateAsPropertySetterCall();
+ .translateAsGet();
}
@NotNull
- public static JsInvocation translateAsPropertySetterCall(@NotNull JetSimpleNameExpression expression,
- @NotNull TranslationContext context) {
- return (new PropertyAccessTranslator(expression, context))
- .translateAsPropertySetterCall();
+ public static PropertyAccessTranslator newInstance(@NotNull JetQualifiedExpression expression,
+ @NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context));
}
@NotNull
- public static JsInvocation translateAsPropertySetterCall(@NotNull JetExpression expression,
+ public static PropertyAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression,
+ @NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context));
+ }
+
+ @NotNull
+ public static JsExpression translateAsPropertyGetterCall(@NotNull JetSimpleNameExpression expression,
@NotNull TranslationContext context) {
+ return (new PropertyAccessTranslator(expression, context))
+ .translateAsGet();
+ }
+
+ @NotNull
+ public static PropertyAccessTranslator newInstance(@NotNull JetExpression expression,
+ @NotNull TranslationContext context) {
if (expression instanceof JetQualifiedExpression) {
- return translateAsPropertySetterCall((JetQualifiedExpression) expression, context);
+ return newInstance((JetQualifiedExpression) expression, context);
}
if (expression instanceof JetSimpleNameExpression) {
- return translateAsPropertySetterCall((JetSimpleNameExpression) expression, context);
- }
- throw new AssertionError(MESSAGE);
- }
-
- @NotNull
- public static JsInvocation translateAsPropertyGetterCall(@NotNull JetQualifiedExpression expression,
- @NotNull TranslationContext context) {
- return (new PropertyAccessTranslator(expression, context))
- .translateAsPropertyGetterCall();
- }
-
- @NotNull
- public static JsInvocation translateAsPropertyGetterCall(@NotNull JetSimpleNameExpression expression,
- @NotNull TranslationContext context) {
- return (new PropertyAccessTranslator(expression, context))
- .translateAsPropertyGetterCall();
- }
-
- @NotNull
- public static JsInvocation translateAsPropertyGetterCall(@NotNull JetExpression expression,
- @NotNull TranslationContext context) {
- if (expression instanceof JetQualifiedExpression) {
- return translateAsPropertyGetterCall((JetQualifiedExpression) expression, context);
- }
- if (expression instanceof JetSimpleNameExpression) {
- return translateAsPropertyGetterCall((JetSimpleNameExpression) expression, context);
+ return newInstance((JetSimpleNameExpression) expression, context);
}
throw new AssertionError(MESSAGE);
}
@@ -133,12 +119,22 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
this.propertyDescriptor = getNotNullPropertyDescriptor();
}
+ @Override
@NotNull
- public JsInvocation translateAsPropertyGetterCall() {
+ public JsExpression translateAsGet() {
JsName getterName = getNotNullGetterName();
return qualifiedAccessorInvocation(getterName);
}
+ @Override
+ @NotNull
+ public JsExpression translateAsSet(@NotNull JsExpression toSetTo) {
+ JsName setterName = getNotNullSetterName();
+ JsInvocation setterCall = qualifiedAccessorInvocation(setterName);
+ setterCall.getArguments().add(toSetTo);
+ return setterCall;
+ }
+
@NotNull
private JsInvocation qualifiedAccessorInvocation(@NotNull JsName accessorName) {
JsNameRef accessorReference = accessorName.makeRef();
@@ -146,12 +142,6 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
return AstUtil.newInvocation(accessorReference);
}
- @NotNull
- public JsInvocation translateAsPropertySetterCall() {
- JsName setterName = getNotNullSetterName();
- return qualifiedAccessorInvocation(setterName);
- }
-
@NotNull
private JsExpression translateQualifier() {
if (qualifier != null) {
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceAccessTranslator.java
new file mode 100644
index 00000000000..15262d97e48
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceAccessTranslator.java
@@ -0,0 +1,45 @@
+package org.jetbrains.k2js.translate.reference;
+
+import com.google.dart.compiler.backend.js.ast.JsExpression;
+import com.google.dart.compiler.backend.js.ast.JsNameRef;
+import com.google.dart.compiler.util.AstUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
+import org.jetbrains.k2js.translate.context.TranslationContext;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class ReferenceAccessTranslator extends AccessTranslator {
+
+ @NotNull
+ public static ReferenceAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression,
+ @NotNull TranslationContext context) {
+ return new ReferenceAccessTranslator(expression, context);
+ }
+
+
+ @NotNull
+ private final JetSimpleNameExpression expression;
+
+ private ReferenceAccessTranslator(@NotNull JetSimpleNameExpression expression,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = expression;
+ }
+
+ @Override
+ @NotNull
+ public JsExpression translateAsGet() {
+ return ReferenceTranslator.translateSimpleName(expression, context());
+ }
+
+ @Override
+ @NotNull
+ public JsExpression translateAsSet(@NotNull JsExpression toSetTo) {
+ JsExpression reference = ReferenceTranslator.translateSimpleName(expression, context());
+ assert reference instanceof JsNameRef;
+ return AstUtil.newAssignment((JsNameRef) reference, toSetTo);
+ }
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
index ecab77fc081..b421e1ab62c 100644
--- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java
@@ -7,8 +7,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.translate.utils.TranslationUtils;
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
index 6081712fe6f..d2c2f40fae9 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java
@@ -247,4 +247,18 @@ public final class BindingUtils {
return result;
}
+
+ @Nullable
+ public static FunctionDescriptor getFunctionDescriptorForOperationExpression(@NotNull BindingContext context,
+ @NotNull JetOperationExpression expression) {
+ DeclarationDescriptor descriptorForReferenceExpression = getDescriptorForReferenceExpression
+ (context, expression.getOperation());
+
+ if (descriptorForReferenceExpression == null) return null;
+
+ assert descriptorForReferenceExpression instanceof FunctionDescriptor
+ : "Operation should resolve to function descriptor.";
+ return (FunctionDescriptor) descriptorForReferenceExpression;
+ }
+
}
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java
new file mode 100644
index 00000000000..0263bda190f
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java
@@ -0,0 +1,23 @@
+package org.jetbrains.k2js.translate.utils;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class DescriptorUtils {
+
+ private DescriptorUtils() {
+ }
+
+
+ private static int valueParametersCount(@NotNull FunctionDescriptor functionDescriptor) {
+ return functionDescriptor.getValueParameters().size();
+ }
+
+ public static boolean hasParameters(@NotNull FunctionDescriptor functionDescriptor) {
+ return (valueParametersCount(functionDescriptor) > 0);
+ }
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java
index 9ad024de66f..9ad05c2f6aa 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/PsiUtils.java
@@ -1,10 +1,13 @@
package org.jetbrains.k2js.translate.utils;
+import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetExpression;
+import org.jetbrains.jet.lang.psi.JetOperationExpression;
import org.jetbrains.jet.lang.psi.JetQualifiedExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
+import org.jetbrains.jet.lexer.JetToken;
/**
* @author Talanov Pavel
@@ -23,4 +26,12 @@ public final class PsiUtils {
}
return (JetSimpleNameExpression) selectorExpression;
}
+
+ @NotNull
+ public static JetToken getOperationToken(@NotNull JetOperationExpression expression) {
+ JetSimpleNameExpression operationExpression = expression.getOperation();
+ IElementType elementType = operationExpression.getReferencedNameElementType();
+ assert elementType instanceof JetToken : "Unary expression should have operation token of type JetToken";
+ return (JetToken) elementType;
+ }
}
diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java
index b051510d185..6efe58e0f0c 100644
--- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java
+++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java
@@ -9,8 +9,9 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.*;
+import org.jetbrains.k2js.translate.context.Namer;
+import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
-import org.jetbrains.k2js.translate.general.TranslationContext;
import java.util.ArrayList;
import java.util.List;
@@ -214,4 +215,15 @@ public final class TranslationUtils {
return Translation.translateAsExpression(rightExpression, context);
}
+ //TODO: check function with same name
+ public static boolean isIntrinsicOperation(@NotNull TranslationContext context,
+ @NotNull JetOperationExpression expression) {
+ FunctionDescriptor operationDescriptor =
+ BindingUtils.getFunctionDescriptorForOperationExpression(context.bindingContext(), expression);
+
+ if (operationDescriptor == null) return true;
+ if (context.intrinsics().hasDescriptor(operationDescriptor)) return true;
+
+ return false;
+ }
}
diff --git a/translator/testFiles/patternMatching/cases/multipleCases.kt b/translator/testFiles/patternMatching/cases/multipleCases.kt
index b75ebe8d8d3..69fdd01bc0b 100644
--- a/translator/testFiles/patternMatching/cases/multipleCases.kt
+++ b/translator/testFiles/patternMatching/cases/multipleCases.kt
@@ -6,12 +6,12 @@ fun box() : Int {
var z = 0
when(c) {
is 5, is 3 => z++;
- else => z = -1000;
+ else => {z = -1000;}
}
when(d) {
is 5, is 3 => z++;
- else => z = -1000;
+ else => {z = -1000;}
}
return z
}
\ No newline at end of file
diff --git a/translator/testFiles/patternMatching/cases/whenNotValue.kt b/translator/testFiles/patternMatching/cases/whenNotValue.kt
index 949ef0b068d..e50902d4d87 100644
--- a/translator/testFiles/patternMatching/cases/whenNotValue.kt
+++ b/translator/testFiles/patternMatching/cases/whenNotValue.kt
@@ -3,8 +3,8 @@ namespace foo
fun box() : Boolean {
var a = 4
when(a) {
- !is 3 => a = 10;
- !is 4 => a = 20;
+ !is 3 => {a = 10;}
+ !is 4 => {a = 20;}
}
return (a == 10)
}
\ No newline at end of file
diff --git a/translator/testFiles/patternMatching/cases/whenValue.kt b/translator/testFiles/patternMatching/cases/whenValue.kt
index 52093a79b4c..ed392ef3040 100644
--- a/translator/testFiles/patternMatching/cases/whenValue.kt
+++ b/translator/testFiles/patternMatching/cases/whenValue.kt
@@ -3,8 +3,8 @@ namespace foo
fun box() : Boolean {
var a = 4
when(a) {
- is 3 => a = 10;
- is 4 => a = 20;
+ is 3 => {a = 10;}
+ is 4 => {a = 20;}
}
return (a == 20)
}
\ No newline at end of file