From 399c9c1175ba81160f9296060ecb5cf0605ed770 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 8 May 2014 18:10:54 +0400 Subject: [PATCH] JS backend: fixed compiler crash when use compareTo in infix call. #EA-54661 fixed --- .../semantics/OperatorOverloadingTest.java | 4 ++++ .../operation/CompareToTranslator.java | 19 ++++++++++++++----- .../cases/compareToByName.kt | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 js/js.translator/testData/operatorOverloading/cases/compareToByName.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java index f5b5cbeece7..baca9bb9718 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/OperatorOverloadingTest.java @@ -87,6 +87,10 @@ public final class OperatorOverloadingTest extends SingleFileTranslationTest { fooBoxTest(); } + public void testCompareToByName() throws Exception { + fooBoxTest(); + } + public void testPlusAndMinusAsAnExpression() throws Exception { fooBoxTest(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java index f870938e2b7..7f791ad0d58 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/CompareToTranslator.java @@ -27,13 +27,18 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; +import static org.jetbrains.k2js.translate.utils.ErrorReportingUtils.message; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.isCompareTo; import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken; public final class CompareToTranslator extends AbstractTranslator { - public static boolean isCompareToCall(@NotNull JetBinaryExpression expression, - @NotNull TranslationContext context) { + public static boolean isCompareToCall( + @NotNull JetBinaryExpression expression, + @NotNull TranslationContext context + ) { + if (!OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression))) return false; + CallableDescriptor operationDescriptor = getCallableDescriptorForOperationExpression(context.bindingContext(), expression); @@ -51,13 +56,17 @@ public final class CompareToTranslator extends AbstractTranslator { @NotNull private final JetBinaryExpression expression; - private CompareToTranslator(@NotNull JetBinaryExpression expression, - @NotNull TranslationContext context) { + private CompareToTranslator( + @NotNull JetBinaryExpression expression, + @NotNull TranslationContext context + ) { super(context); this.expression = expression; CallableDescriptor descriptor = getCallableDescriptorForOperationExpression(context.bindingContext(), expression); assert descriptor != null : "CompareTo should always have a descriptor"; - assert (OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression))); + assert (OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression))) : + message(expression, "CompareToTranslator supported only expressions with operation token from COMPARISON_OPERATIONS, " + + "expression: " + expression.getText()); } @NotNull diff --git a/js/js.translator/testData/operatorOverloading/cases/compareToByName.kt b/js/js.translator/testData/operatorOverloading/cases/compareToByName.kt new file mode 100644 index 00000000000..37263efa632 --- /dev/null +++ b/js/js.translator/testData/operatorOverloading/cases/compareToByName.kt @@ -0,0 +1,14 @@ +package foo + + +class A(t: Int) { + var i = t + fun compareTo(other: A) = (this.i - other.i) +} + +fun box(): Boolean = + (A(3) compareTo A(2) > 0) && + (A(2) compareTo A(2) == 0) && + (A(1) compareTo A(0) > 0) && + (A(3) compareTo A(4) < 0) && + (A(0) compareTo A(100) < 0)