diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 85246e6097c..68537dcbc62 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -8,59 +8,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
@@ -157,6 +109,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -214,42 +231,13 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -257,44 +245,66 @@
-
-
+
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -302,6 +312,15 @@
+
+
+
+
+
+
+
+
+
@@ -315,19 +334,10 @@
-
-
-
-
-
-
-
-
-
-
+
-
+
@@ -342,15 +352,6 @@
-
-
-
-
-
-
-
-
-
@@ -363,7 +364,16 @@
-
+
+
+
+
+
+
+
+
+
+
@@ -392,10 +402,19 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
@@ -431,13 +450,7 @@
@@ -701,6 +720,10 @@
+
+
+
+
@@ -786,6 +809,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -928,71 +977,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1092,6 +1076,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1212,12 +1238,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
localhost
@@ -1280,25 +1306,25 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
@@ -1382,93 +1408,60 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
+
@@ -1480,22 +1473,59 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
index bf0aff3144e..52b7f43fb06 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java
@@ -14,7 +14,6 @@ import org.jetbrains.jet.lexer.JetToken;
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;
@@ -69,21 +68,23 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
if (AssignmentTranslator.isAssignmentOperator(expression)) {
return AssignmentTranslator.translate(expression, context());
}
- if (operationDescriptor == null) {
- return translateAsUnOverloadableBinaryOperation();
+ if (CompareToTranslator.isCompareToCall(expression, context())) {
+ return CompareToTranslator.translate(expression, context());
}
if (isEqualsCall()) {
return translateAsEqualsCall();
}
- if (isCompareToCall()) {
- return translateAsCompareToCall();
+ if (operationDescriptor == null) {
+ return translateAsUnOverloadableBinaryOperation();
}
return CallTranslator.translate(expression, context());
}
private boolean isEqualsCall() {
//TODO: add descriptor is equals utils
- assert operationDescriptor != null;
+ if (operationDescriptor == null) {
+ return false;
+ }
boolean isEquals = operationDescriptor.getName().equals("equals");
boolean isIntrinsic = context().intrinsics().hasDescriptor(operationDescriptor);
return isEquals && isIntrinsic;
@@ -100,21 +101,6 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
return intrinsic.apply(left, Arrays.asList(right), context());
}
- private boolean isCompareToCall() {
- DeclarationDescriptor operationDescriptor = getOperationDescriptor(expression, context());
- return (operationDescriptor.getName().equals("compareTo")
- && (context().intrinsics().hasDescriptor(operationDescriptor)));
- }
-
- @NotNull
- 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);
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java
new file mode 100644
index 00000000000..e2ab4a80542
--- /dev/null
+++ b/translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java
@@ -0,0 +1,93 @@
+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.JsNumberLiteral;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
+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.intrinsic.CompareToIntrinsic;
+import org.jetbrains.k2js.translate.intrinsic.Intrinsic;
+import org.jetbrains.k2js.translate.reference.CallTranslator;
+
+import java.util.Arrays;
+
+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.*;
+
+/**
+ * @author Talanov Pavel
+ */
+public final class CompareToTranslator extends AbstractTranslator {
+
+ public static boolean isCompareToCall(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ //move to util
+ FunctionDescriptor operationDescriptor =
+ getFunctionDescriptorForOperationExpression(context.bindingContext(), expression);
+
+ if (operationDescriptor == null) return false;
+
+ return (operationDescriptor.getName().equals("compareTo"));
+ }
+
+ @NotNull
+ public static JsExpression translate(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ return (new CompareToTranslator(expression, context)).translate();
+ }
+
+ @NotNull
+ private final JetBinaryExpression expression;
+
+ @NotNull
+ private final JetToken operationToken;
+
+ @NotNull
+ private final FunctionDescriptor descriptor;
+
+ private CompareToTranslator(@NotNull JetBinaryExpression expression,
+ @NotNull TranslationContext context) {
+ super(context);
+ this.expression = expression;
+ FunctionDescriptor functionDescriptor =
+ getFunctionDescriptorForOperationExpression(context.bindingContext(), expression);
+ assert functionDescriptor != null : "CompareTo should always have a descriptor";
+ this.descriptor = functionDescriptor;
+ this.operationToken = getOperationToken(expression);
+ assert (OperatorConventions.COMPARISON_OPERATIONS.contains(operationToken));
+ }
+
+ @NotNull
+ private JsExpression translate() {
+ if (isIntrinsicOperation(context(), expression)) {
+ return intrinsicCompareTo();
+ }
+ return overloadedCompareTo();
+ }
+
+ @NotNull
+ private JsExpression overloadedCompareTo() {
+ JsNumberLiteral zeroLiteral = program().getNumberLiteral(0);
+ JsBinaryOperator correspondingOperator = OperatorTable.getBinaryOperator(operationToken);
+ JsExpression methodCall = CallTranslator.translate(expression, context());
+ return new JsBinaryOperation(correspondingOperator, methodCall, zeroLiteral);
+ }
+
+ @NotNull
+ private JsExpression intrinsicCompareTo() {
+ Intrinsic intrinsic = context().intrinsics().getIntrinsic(descriptor);
+ ((CompareToIntrinsic) intrinsic).setComparisonToken((JetToken) expression.getOperationToken());
+ JsExpression left = translateLeftExpression(context(), expression);
+ JsExpression right = translateRightExpression(context(), expression);
+ return intrinsic.apply(left, Arrays.asList(right), context());
+ }
+
+
+}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java
index f356bae5856..b170c657056 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedAssignmentTranslator.java
@@ -1,16 +1,14 @@
package org.jetbrains.k2js.translate.operation;
-import com.google.dart.compiler.backend.js.ast.*;
+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.JetBinaryExpression;
-import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
-import org.jetbrains.jet.lexer.JetToken;
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
@@ -41,31 +39,6 @@ public final class OverloadedAssignmentTranslator extends AssignmentTranslator {
@Override
@NotNull
protected JsExpression translate() {
- if (isCompareTo()) {
- return asCompareToOverload();
- }
- return asOverloadedMethodCall();
- }
-
- @NotNull
- private JsExpression asCompareToOverload() {
- JetToken operationToken = getOperationToken(expression);
- assert (OperatorConventions.COMPARISON_OPERATIONS.contains(operationToken));
- JsNumberLiteral zeroLiteral = program().getNumberLiteral(0);
- JsBinaryOperator correspondingOperator = OperatorTable.getBinaryOperator(operationToken);
- return new JsBinaryOperation(correspondingOperator, overloadedMethodInvocation(), zeroLiteral);
- }
-
- private boolean isCompareTo() {
- //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 (isVariableReassignment) {
return reassignment();
}
diff --git a/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
index 2165d90b173..f95bc8a4470 100644
--- a/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
+++ b/translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java
@@ -5,7 +5,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetUnaryExpression;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.reference.CallTranslator;
-import org.jetbrains.k2js.translate.utils.TranslationUtils;
/**
* @author Talanov Pavel
@@ -20,7 +19,6 @@ public final class UnaryOperationTranslator {
if (IncrementTranslator.isIncrement(expression)) {
return IncrementTranslator.translate(expression, context);
}
- assert TranslationUtils.isIntrinsicOperation(context, expression);
return CallTranslator.translate(expression, context);
}
}