JS backend: fixed infix calls.
#KT-3998 fixed #EA-56241 fixed
This commit is contained in:
+6
-5
@@ -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
|
||||
|
||||
+6
-4
@@ -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
|
||||
|
||||
+4
-4
@@ -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
|
||||
|
||||
+7
-8
@@ -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)));
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user