diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/CompareToInstrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/CompareToInstrinsic.java index 565b53feba1..ac1c6776829 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/CompareToInstrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/CompareToInstrinsic.java @@ -20,14 +20,14 @@ 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.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.operation.OperatorTable; import org.jetbrains.k2js.translate.utils.JsDescriptorUtils; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken; public final class CompareToInstrinsic implements BinaryOperationIntrinsic { @@ -36,9 +36,10 @@ public final class CompareToInstrinsic implements BinaryOperationIntrinsic { if (!OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression))) { return false; } - FunctionDescriptor functionDescriptor = getFunctionDescriptorForOperationExpression(context.bindingContext(), expression); - assert functionDescriptor != null; - return JsDescriptorUtils.isBuiltin(functionDescriptor); + + CallableDescriptor descriptor = getCallableDescriptorForOperationExpression(context.bindingContext(), expression); + assert descriptor != null; + return JsDescriptorUtils.isBuiltin(descriptor); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java index 6860181155f..3f101631701 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/operation/EqualsIntrinsic.java @@ -21,6 +21,7 @@ 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.JsLiteral; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetExpression; @@ -36,7 +37,7 @@ import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.Arrays; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken; public final class EqualsIntrinsic implements BinaryOperationIntrinsic { @@ -46,9 +47,10 @@ public final class EqualsIntrinsic implements BinaryOperationIntrinsic { if (!OperatorConventions.EQUALS_OPERATIONS.contains(getOperationToken(expression))) { return false; } - FunctionDescriptor functionDescriptor = getFunctionDescriptorForOperationExpression(context.bindingContext(), expression); - assert functionDescriptor != null; - return JsDescriptorUtils.isBuiltin(functionDescriptor) || TopLevelFIF.EQUALS_IN_ANY.apply(functionDescriptor); + CallableDescriptor functionDescriptor = getCallableDescriptorForOperationExpression(context.bindingContext(), expression); + if (!(functionDescriptor instanceof FunctionDescriptor)) return false; + + return JsDescriptorUtils.isBuiltin(functionDescriptor) || TopLevelFIF.EQUALS_IN_ANY.apply((FunctionDescriptor) functionDescriptor); } @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java index 72cc024c42d..8f449d77c6c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java @@ -19,6 +19,7 @@ package org.jetbrains.k2js.translate.operation; import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetExpression; @@ -38,7 +39,7 @@ import org.jetbrains.k2js.translate.utils.mutator.LastExpressionMutator; import static org.jetbrains.k2js.translate.operation.AssignmentTranslator.isAssignmentOperator; import static org.jetbrains.k2js.translate.operation.CompareToTranslator.isCompareToCall; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionResolvedCall; import static org.jetbrains.k2js.translate.utils.JsAstUtils.convertToStatement; import static org.jetbrains.k2js.translate.utils.JsAstUtils.not; @@ -67,14 +68,13 @@ public final class BinaryOperationTranslator extends AbstractTranslator { private final JetBinaryExpression expression; @Nullable - private final FunctionDescriptor operationDescriptor; + private final CallableDescriptor operationDescriptor; private BinaryOperationTranslator(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { super(context); this.expression = expression; - this.operationDescriptor = - getFunctionDescriptorForOperationExpression(bindingContext(), expression); + this.operationDescriptor = getCallableDescriptorForOperationExpression(bindingContext(), expression); } @NotNull 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 2bdcf590536..f870938e2b7 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 @@ -20,13 +20,13 @@ 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.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.JsDescriptorUtils.isCompareTo; import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken; @@ -34,12 +34,12 @@ public final class CompareToTranslator extends AbstractTranslator { public static boolean isCompareToCall(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { - FunctionDescriptor operationDescriptor = - getFunctionDescriptorForOperationExpression(context.bindingContext(), expression); + CallableDescriptor operationDescriptor = + getCallableDescriptorForOperationExpression(context.bindingContext(), expression); if (operationDescriptor == null) return false; - return (isCompareTo(operationDescriptor)); + return isCompareTo(operationDescriptor); } @NotNull @@ -55,9 +55,8 @@ public final class CompareToTranslator extends AbstractTranslator { @NotNull TranslationContext context) { super(context); this.expression = expression; - FunctionDescriptor functionDescriptor = - getFunctionDescriptorForOperationExpression(context.bindingContext(), expression); - assert functionDescriptor != null : "CompareTo should always have a descriptor"; + CallableDescriptor descriptor = getCallableDescriptorForOperationExpression(context.bindingContext(), expression); + assert descriptor != null : "CompareTo should always have a descriptor"; assert (OperatorConventions.COMPARISON_OPERATIONS.contains(getOperationToken(expression))); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java index 5f28104ce36..e0c10357bde 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java @@ -174,16 +174,19 @@ public final class BindingUtils { } @Nullable - public static FunctionDescriptor getFunctionDescriptorForOperationExpression(@NotNull BindingContext context, - @NotNull JetOperationExpression expression) { - DeclarationDescriptor descriptorForReferenceExpression = getNullableDescriptorForReferenceExpression - (context, expression.getOperationReference()); + public static CallableDescriptor getCallableDescriptorForOperationExpression( + @NotNull BindingContext context, + @NotNull JetOperationExpression expression + ) { + JetSimpleNameExpression operationReference = expression.getOperationReference(); + DeclarationDescriptor descriptorForReferenceExpression = + getNullableDescriptorForReferenceExpression(context, operationReference); if (descriptorForReferenceExpression == null) return null; - assert descriptorForReferenceExpression instanceof FunctionDescriptor - : message(expression.getOperationReference(), "Operation should resolve to function descriptor"); - return (FunctionDescriptor) descriptorForReferenceExpression; + assert descriptorForReferenceExpression instanceof CallableDescriptor : + message(operationReference, "Operation should resolve to callable descriptor"); + return (CallableDescriptor) descriptorForReferenceExpression; } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java index 37d172abaf5..8d953205f2b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsDescriptorUtils.java @@ -56,8 +56,8 @@ public final class JsDescriptorUtils { return (valueParametersCount(functionDescriptor) > 0); } - public static boolean isCompareTo(@NotNull FunctionDescriptor functionDescriptor) { - return (functionDescriptor.getName().equals(OperatorConventions.COMPARE_TO)); + public static boolean isCompareTo(@NotNull CallableDescriptor descriptor) { + return descriptor.getName().equals(OperatorConventions.COMPARE_TO); } @Nullable diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 52dc57c13de..7d1c70de583 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -38,7 +38,7 @@ import java.util.*; import static com.google.dart.compiler.backend.js.ast.JsBinaryOperator.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName; import static org.jetbrains.k2js.translate.context.Namer.getKotlinBackingFieldName; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptorForOperationExpression; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression; import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment; import static org.jetbrains.k2js.translate.utils.JsAstUtils.createDataDescriptor; @@ -352,10 +352,10 @@ public final class TranslationUtils { public static boolean hasCorrespondingFunctionIntrinsic(@NotNull TranslationContext context, @NotNull JetOperationExpression expression) { - FunctionDescriptor operationDescriptor = getFunctionDescriptorForOperationExpression(context.bindingContext(), expression); + CallableDescriptor operationDescriptor = getCallableDescriptorForOperationExpression(context.bindingContext(), expression); - if (operationDescriptor == null) return true; - if (context.intrinsics().getFunctionIntrinsics().getIntrinsic(operationDescriptor).exists()) return true; + if (operationDescriptor == null || !(operationDescriptor instanceof FunctionDescriptor)) return true; + if (context.intrinsics().getFunctionIntrinsics().getIntrinsic((FunctionDescriptor) operationDescriptor).exists()) return true; return false; }