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 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + @@ -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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1092,6 +1076,48 @@ + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + 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); } }