diff --git a/translator/src/org/jetbrains/k2js/intrinsic/BinaryOperationIntrinsic.java b/translator/src/org/jetbrains/k2js/intrinsic/BinaryOperationIntrinsic.java index 175db4de3d9..86e9a915319 100644 --- a/translator/src/org/jetbrains/k2js/intrinsic/BinaryOperationIntrinsic.java +++ b/translator/src/org/jetbrains/k2js/intrinsic/BinaryOperationIntrinsic.java @@ -1,31 +1,19 @@ package org.jetbrains.k2js.intrinsic; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsThisRef; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; -import org.jetbrains.jet.lang.psi.JetExpression; - -import java.util.List; - /** * @author Talanov Pavel */ -public final class BinaryOperationIntrinsic implements Intrinsic { - @NotNull - @Override - public JsExpression apply(@NotNull FunctionDescriptor descriptor, @NotNull JetExpression receiver, - @NotNull List arguments) { - //TODO: implement +//public final class BinaryOperationIntrinsic implements Intrinsic { // -// JetToken correspondingToken = OperatorConventions.getTokenForMethodName(descriptor.getName()); -// JsBinaryOperator operator = OperatorTable.getBinaryOperator(correspondingToken); +// @NotNull +// private final JsBinaryOperator operator; // -// assert arguments.size() == 1 : "Binary operations expects 2 arguments."; -// JsExpression argument = arguments.get(0); -// assert argument != null; +// /*package*/ BinaryOperationIntrinsic() {} // -// return new JsBinaryOperation(operator, receiver, argument); - return new JsThisRef(); - } -} +// @NotNull +// @Override +// public JsExpression apply(@NotNull JetExpression receiver, @NotNull List arguments, +// @NotNull TranslationContext context) { +// //return BinaryOperationTranslator.translate() +// } +//} diff --git a/translator/src/org/jetbrains/k2js/intrinsic/Intrinsic.java b/translator/src/org/jetbrains/k2js/intrinsic/Intrinsic.java index a35a033bb77..f76f5023253 100644 --- a/translator/src/org/jetbrains/k2js/intrinsic/Intrinsic.java +++ b/translator/src/org/jetbrains/k2js/intrinsic/Intrinsic.java @@ -2,8 +2,8 @@ package org.jetbrains.k2js.intrinsic; 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.psi.JetExpression; +import org.jetbrains.k2js.translate.general.TranslationContext; import java.util.List; @@ -13,7 +13,7 @@ import java.util.List; public interface Intrinsic { @NotNull - JsExpression apply(@NotNull FunctionDescriptor descriptor, @NotNull JetExpression receiver, - @NotNull List arguments); + public JsExpression apply(@NotNull JetExpression receiver, @NotNull List arguments, + @NotNull TranslationContext context); } diff --git a/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicDeclarationVisitor.java b/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicDeclarationVisitor.java index a28d7df2148..8ae8fb54f22 100644 --- a/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicDeclarationVisitor.java +++ b/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicDeclarationVisitor.java @@ -30,7 +30,7 @@ public final class IntrinsicDeclarationVisitor extends DeclarationDescriptorVisi @Override public Void visitFunctionDescriptor(@NotNull FunctionDescriptor descriptor, @Nullable Void nothing) { - if (!intrinsics.isIntrinsic(descriptor)) { + if (!intrinsics.hasDescriptor(descriptor)) { intrinsics.declareIntrinsic(descriptor); } return null; diff --git a/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicFactory.java b/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicFactory.java new file mode 100644 index 00000000000..087ea2f9fd3 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/intrinsic/IntrinsicFactory.java @@ -0,0 +1,27 @@ +package org.jetbrains.k2js.intrinsic; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Talanov Pavel + */ +public final class IntrinsicFactory { + + @NotNull + private final Intrinsics intrinsics; + + private IntrinsicFactory(@NotNull Intrinsics intrinsics) { + this.intrinsics = intrinsics; + } + +// public Intrinsic getIntrinsicForExpression(@NotNull FunctionDescriptor descriptor, +// @NotNull JetExpression expression, +// @NotNull TranslationContext context) { +// assert intrinsics.hasDescriptor(descriptor); +// if (JetExpression instanceof JetBinaryExpression) { +// return new BinaryOperationIntrinsic() +// } +// } + + +} diff --git a/translator/src/org/jetbrains/k2js/intrinsic/Intrinsics.java b/translator/src/org/jetbrains/k2js/intrinsic/Intrinsics.java index 5a33ac776a6..984537904d9 100644 --- a/translator/src/org/jetbrains/k2js/intrinsic/Intrinsics.java +++ b/translator/src/org/jetbrains/k2js/intrinsic/Intrinsics.java @@ -4,7 +4,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.types.JetStandardLibrary; -import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import java.util.HashMap; import java.util.Map; @@ -35,43 +34,44 @@ public final class Intrinsics { // addUnaryIntrinsics(descriptor); // addAssignmentIntrinsics(descriptor); // addEqualsIntrinsics(descriptor); - BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); - descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); + descriptorToIntrinsicMap.put(descriptor, null); } - private void addEqualsIntrinsics(FunctionDescriptor descriptor) { - BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); - String functionName = descriptor.getName(); - if (OperatorConventions.ASSIGNMENT_OPERATIONS.containsValue(functionName)) { - descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); - } - } - - private void addUnaryIntrinsics(@NotNull FunctionDescriptor descriptor) { - BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); - String functionName = descriptor.getName(); - if (OperatorConventions.UNARY_OPERATION_NAMES.containsValue(functionName)) { - descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); - } - } - - private void addBinaryIntrinsics(@NotNull FunctionDescriptor descriptor) { - String functionName = descriptor.getName(); - if (OperatorConventions.BINARY_OPERATION_NAMES.containsValue(functionName)) { - BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); - descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); - } - } - - private void addAssignmentIntrinsics(@NotNull FunctionDescriptor descriptor) { - String functionName = descriptor.getName(); - if (OperatorConventions.ASSIGNMENT_OPERATIONS.containsValue(functionName)) { - BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); - descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); - } - } - - public boolean isIntrinsic(@NotNull DeclarationDescriptor descriptor) { + // private void addEqualsIntrinsics(FunctionDescriptor descriptor) { +// //BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); +// String functionName = descriptor.getName(); +// if (OperatorConventions.ASSIGNMENT_OPERATIONS.containsValue(functionName)) { +// descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); +// } +// } +// +// private void addUnaryIntrinsics(@NotNull FunctionDescriptor descriptor) { +// BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); +// String functionName = descriptor.getName(); +// if (OperatorConventions.UNARY_OPERATION_NAMES.containsValue(functionName)) { +// descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); +// } +// } +// +// private void addBinaryIntrinsics(@NotNull FunctionDescriptor descriptor) { +// String functionName = descriptor.getName(); +// if (OperatorConventions.BINARY_OPERATION_NAMES.containsValue(functionName)) { +// JetToken token = OperatorConventions.getTokenForMethodName(functionName); +//// BinaryOperationIntrinsic binaryOperationIntrinsic = +//// new BinaryOperationIntrinsic(OperatorTable.getBinaryOperator(token)); +//// descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); +// } +// } +// +// private void addAssignmentIntrinsics(@NotNull FunctionDescriptor descriptor) { +// String functionName = descriptor.getName(); +// if (OperatorConventions.ASSIGNMENT_OPERATIONS.containsValue(functionName)) { +// BinaryOperationIntrinsic binaryOperationIntrinsic = new BinaryOperationIntrinsic(); +// descriptorToIntrinsicMap.put(descriptor, binaryOperationIntrinsic); +// } +// } +// + public boolean hasDescriptor(@NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof FunctionDescriptor) { FunctionDescriptor functionDescriptor = (FunctionDescriptor) descriptor.getOriginal(); return descriptorToIntrinsicMap.containsKey(functionDescriptor); diff --git a/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java index f7f847c140b..7843afc6c15 100644 --- a/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java +++ b/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java @@ -16,7 +16,7 @@ public class Aliaser { static public Aliaser aliasesForStandardClasses(@NotNull JetStandardLibrary standardLibrary, @NotNull Namer namer) { Aliaser result = new Aliaser(); - result.setAliasForDescriptor(standardLibrary.getArray(), namer.declareStandardClass("Array")); + // result.setAliasForDescriptor(standardLibrary.getArray(), namer.declareStandardClass("Array")); return result; } diff --git a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java index b5b7995ca98..4760c9fce78 100644 --- a/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/operation/BinaryOperationTranslator.java @@ -1,141 +1,48 @@ package org.jetbrains.k2js.translate.operation; -import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.util.AstUtil; +import com.google.dart.compiler.backend.js.ast.JsExpression; +import com.google.dart.compiler.backend.js.ast.JsInvocation; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslationContext; -import org.jetbrains.k2js.translate.reference.ArrayAccessTranslator; import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator; /** * @author Talanov Pavel */ -public final class BinaryOperationTranslator extends OperationTranslator { - - @NotNull - static public JsExpression translate(@NotNull JetBinaryExpression expression, - @NotNull TranslationContext context) { - return (new BinaryOperationTranslator(expression, context)).translate(); - } +public abstract class BinaryOperationTranslator extends OperationTranslator { @NotNull private final JetBinaryExpression expression; - private final boolean isPropertyOnTheLeft; - private final boolean isVariableReassignment; + protected final boolean isPropertyOnTheLeft; + protected final boolean isVariableReassignment; @NotNull - private final JsExpression left; + protected final JsExpression left; @NotNull - private final JsExpression right; - @Nullable - private final JsNameRef operationReference; + protected final JsExpression right; - private BinaryOperationTranslator(@NotNull JetBinaryExpression expression, - @NotNull TranslationContext context) { + protected BinaryOperationTranslator(@NotNull JetBinaryExpression expression, + @NotNull TranslationContext context) { super(context); this.expression = expression; this.isPropertyOnTheLeft = isPropertyAccess(expression.getLeft()); this.isVariableReassignment = isVariableReassignment(expression); - this.operationReference = getOverloadedOperationReference(expression.getOperationReference()); + this.right = translateRightExpression(); //TODO: decide whether it is harmful to possibly translateNamespace left expression more than once this.left = translateLeftExpression(); } @NotNull - JsExpression translate() { - if (ArrayAccessTranslator.canBeArraySetterCall(expression)) { - return ArrayAccessTranslator.translateAsArraySetterCall(expression, context()); - } - if (isCompareTo()) { - return asCompareToOverload(); - } - if (isOverloadedCall()) { - return asOverloadedMethodCall(); - } - return asBinaryOperation(); - } - - @NotNull - private JsExpression asCompareToOverload() { - JetToken operationToken = getOperationToken(); - assert (OperatorConventions.COMPARISON_OPERATIONS.contains(operationToken)); - JsNumberLiteral zeroLiteral = program().getNumberLiteral(0); - JsBinaryOperator correspondingOperator = OperatorTable.getBinaryOperator(operationToken); - return new JsBinaryOperation(correspondingOperator, overloadedMethodInvocation(), zeroLiteral); - } - - private boolean isOverloadedCall() { - return operationReference != null; - } - - private boolean isCompareTo() { - if (operationReference == null) { - return false; - } - String nameForOperationSymbol = OperatorConventions.getNameForOperationSymbol(getOperationToken()); - assert nameForOperationSymbol != null : "Must have a name for overloaded operator"; - return (nameForOperationSymbol.equals("compareTo")); - } - - @NotNull - private JsExpression asOverloadedMethodCall() { - if (isPropertyOnTheLeft) { - return overloadOnProperty(); - } - if (isVariableReassignment) { - return nonPropertyReassignment(); - } - return overloadedMethodInvocation(); - } - - private JsExpression nonPropertyReassignment() { - assert left instanceof JsNameRef : "Reassignment should be called on l-value."; - return AstUtil.newAssignment((JsNameRef) left, overloadedMethodInvocation()); - } - - @NotNull - private JsExpression overloadOnProperty() { - if (isVariableReassignment) { - return setterCall(overloadedMethodInvocation()); - } else { - return overloadedMethodInvocation(); - } - } - - //TODO: refactor - @NotNull - private JsExpression asBinaryOperation() { - if (isPropertyOnTheLeft && OperatorTable.isAssignment(getOperationToken())) { - return setterCall(right); - } - JetToken token = getOperationToken(); - if (OperatorTable.hasCorrespondingBinaryOperator(token)) { - return new JsBinaryOperation(OperatorTable.getBinaryOperator(token), left, right); - } - if (OperatorTable.hasCorrespondingFunctionInvocation(token)) { - JsInvocation functionInvocation = OperatorTable.getCorrespondingFunctionInvocation(token); - functionInvocation.setArguments(left, right); - return functionInvocation; - } - throw new AssertionError("Unsupported token encountered: " + token.toString()); - } + abstract protected JsExpression translate(); private JsExpression translateLeftExpression() { return Translation.translateAsExpression(expression.getLeft(), context()); } - @NotNull - private JsExpression overloadedMethodInvocation() { - AstUtil.setQualifier(operationReference, left); - return AstUtil.newInvocation(operationReference, right); - } - @NotNull private JsExpression translateRightExpression() { JetExpression rightExpression = expression.getRight(); @@ -144,12 +51,12 @@ public final class BinaryOperationTranslator extends OperationTranslator { } @NotNull - private JetToken getOperationToken() { + protected JetToken getOperationToken() { return (JetToken) expression.getOperationToken(); } @NotNull - public JsInvocation setterCall(@NotNull JsExpression assignTo) { + protected JsInvocation setterCall(@NotNull JsExpression assignTo) { JsInvocation setterCall = PropertyAccessTranslator.translateAsPropertySetterCall(expression.getLeft(), context()); setterCall.setArguments(assignTo); diff --git a/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicBinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicBinaryOperationTranslator.java new file mode 100644 index 00000000000..dcd6b1caab9 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/operation/IntrinsicBinaryOperationTranslator.java @@ -0,0 +1,45 @@ +package org.jetbrains.k2js.translate.operation; + +import com.google.dart.compiler.backend.js.ast.JsBinaryOperation; +import com.google.dart.compiler.backend.js.ast.JsExpression; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetBinaryExpression; +import org.jetbrains.jet.lexer.JetToken; +import org.jetbrains.k2js.translate.general.TranslationContext; + +/** + * @author Talanov Pavel + */ +public final class IntrinsicBinaryOperationTranslator extends BinaryOperationTranslator { + + protected IntrinsicBinaryOperationTranslator(@NotNull JetBinaryExpression expression, + @NotNull TranslationContext context) { + super(expression, context); + } + + @NotNull + @Override + protected JsExpression translate() { + return asBinaryOperation(); + } + + //TODO: refactor + @NotNull + private JsExpression asBinaryOperation() { + if (isPropertyOnTheLeft && OperatorTable.isAssignment(getOperationToken())) { + return setterCall(right); + } + JetToken token = getOperationToken(); + if (OperatorTable.hasCorrespondingBinaryOperator(token)) { + return new JsBinaryOperation(OperatorTable.getBinaryOperator(token), left, right); + } + //TODO: implement using intrinsic mechanism +// if (OperatorTable.hasCorrespondingFunctionInvocation(token)) { +// JsInvocation functionInvocation = OperatorTable.getCorrespondingFunctionInvocation(token); +// functionInvocation.setArguments(left, right); +// return functionInvocation; +// } + throw new AssertionError("Unsupported token encountered: " + token.toString()); + } + +} diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java index f4f2a507b8d..f8c477f81f5 100644 --- a/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/operation/OperationTranslator.java @@ -7,18 +7,38 @@ import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.psi.JetBinaryExpression; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.TranslationContext; +import org.jetbrains.k2js.translate.reference.ArrayAccessTranslator; import org.jetbrains.k2js.translate.reference.PropertyAccessTranslator; import org.jetbrains.k2js.translate.utils.BindingUtils; +import org.jetbrains.k2js.translate.utils.TranslationUtils; /** * @author Talanov Pavel */ public class OperationTranslator extends AbstractTranslator { + @NotNull + static public JsExpression translate(@NotNull JetBinaryExpression expression, + @NotNull TranslationContext context) { + //TODO: move to translation + if (ArrayAccessTranslator.canBeArraySetterCall(expression)) { + return ArrayAccessTranslator.translateAsArraySetterCall(expression, context); + } + + BinaryOperationTranslator translator; + if (TranslationUtils.isIntrinsicOperation(context, expression.getOperationReference())) { + translator = new IntrinsicBinaryOperationTranslator(expression, context); + } else { + translator = new OverloadedBinaryOperationTranslator(expression, context); + } + return translator.translate(); + } + protected OperationTranslator(@NotNull TranslationContext context) { super(context); } @@ -29,7 +49,7 @@ public class OperationTranslator extends AbstractTranslator { if (operationDescriptor == null) { return null; } - if (context().intrinsics().isIntrinsic(operationDescriptor)) { + if (context().intrinsics().hasDescriptor(operationDescriptor)) { return null; } if (!context().isDeclared(operationDescriptor)) { diff --git a/translator/src/org/jetbrains/k2js/translate/operation/OverloadedBinaryOperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedBinaryOperationTranslator.java new file mode 100644 index 00000000000..862c71fa944 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/operation/OverloadedBinaryOperationTranslator.java @@ -0,0 +1,80 @@ +package org.jetbrains.k2js.translate.operation; + +import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.util.AstUtil; +import org.jetbrains.annotations.NotNull; +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.general.TranslationContext; + +/** + * @author Talanov Pavel + */ +public final class OverloadedBinaryOperationTranslator extends BinaryOperationTranslator { + + @NotNull + private final JsNameRef operationReference; + + + protected OverloadedBinaryOperationTranslator(@NotNull JetBinaryExpression expression, + @NotNull TranslationContext context) { + super(expression, context); + JsNameRef overloadedOperationReference = getOverloadedOperationReference(expression.getOperationReference()); + assert overloadedOperationReference != null; + this.operationReference = overloadedOperationReference; + } + + @Override + @NotNull + protected JsExpression translate() { + if (isCompareTo()) { + return asCompareToOverload(); + } + return asOverloadedMethodCall(); + } + + @NotNull + private JsExpression asCompareToOverload() { + JetToken operationToken = getOperationToken(); + 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() { + String nameForOperationSymbol = OperatorConventions.getNameForOperationSymbol(getOperationToken()); + assert nameForOperationSymbol != null : "Must have a name for overloaded operator"; + return (nameForOperationSymbol.equals("compareTo")); + } + + @NotNull + private JsExpression asOverloadedMethodCall() { + if (isPropertyOnTheLeft && isVariableReassignment) { + return propertyReassignment(); + } + if (isVariableReassignment) { + return nonPropertyReassignment(); + } + return overloadedMethodInvocation(); + } + + @NotNull + private JsInvocation propertyReassignment() { + return setterCall(overloadedMethodInvocation()); + } + + @NotNull + private JsExpression nonPropertyReassignment() { + assert left instanceof JsNameRef : "Reassignment should be called on l-value."; + return AstUtil.newAssignment((JsNameRef) left, overloadedMethodInvocation()); + } + + @NotNull + private JsExpression overloadedMethodInvocation() { + AstUtil.setQualifier(operationReference, left); + return AstUtil.newInvocation(operationReference, right); + } + +} diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java index f25909a4b08..0d519f79c22 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java @@ -27,7 +27,7 @@ public final class ArrayAccessTranslator extends AbstractTranslator { public static boolean canBeArraySetterCall(@NotNull JetBinaryExpression expression) { - //TODO: move unsafe cat to util + //TODO: move unsafe call to util return (OperatorTable.isAssignment((JetToken) expression.getOperationToken()) && (expression.getLeft() instanceof JetArrayAccessExpression)); } diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 82400108828..ea0f02ec191 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -8,10 +8,7 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; -import org.jetbrains.jet.lang.psi.JetCallExpression; -import org.jetbrains.jet.lang.psi.JetExpression; -import org.jetbrains.jet.lang.psi.JetProperty; -import org.jetbrains.jet.lang.psi.ValueArgument; +import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslationContext; @@ -25,28 +22,28 @@ import java.util.List; public final class TranslationUtils { @NotNull - static public JsBinaryOperation notNullCheck(@NotNull TranslationContext context, + public static JsBinaryOperation notNullCheck(@NotNull TranslationContext context, @NotNull JsExpression expressionToCheck) { JsNullLiteral nullLiteral = context.program().getNullLiteral(); return AstUtil.notEqual(expressionToCheck, nullLiteral); } @NotNull - static public JsBinaryOperation isNullCheck(@NotNull TranslationContext context, + public static JsBinaryOperation isNullCheck(@NotNull TranslationContext context, @NotNull JsExpression expressionToCheck) { JsNullLiteral nullLiteral = context.program().getNullLiteral(); return AstUtil.equals(expressionToCheck, nullLiteral); } @Nullable - static public JsName getLocalReferencedName(@NotNull TranslationContext context, + public static JsName getLocalReferencedName(@NotNull TranslationContext context, @NotNull String name) { return context.enclosingScope().findExistingName(name); } @NotNull - static public List translateArgumentList(@NotNull List jetArguments, + public static List translateArgumentList(@NotNull List jetArguments, @NotNull TranslationContext context) { List jsArguments = new ArrayList(); for (ValueArgument argument : jetArguments) { @@ -56,7 +53,7 @@ public final class TranslationUtils { } @NotNull - static public JsExpression translateArgument(@NotNull TranslationContext context, @NotNull ValueArgument argument) { + public static JsExpression translateArgument(@NotNull TranslationContext context, @NotNull ValueArgument argument) { JetExpression jetExpression = argument.getArgumentExpression(); if (jetExpression == null) { throw new AssertionError("Argument with no expression encountered!"); @@ -65,21 +62,21 @@ public final class TranslationUtils { } @NotNull - static public JsNameRef backingFieldReference(@NotNull TranslationContext context, + public static JsNameRef backingFieldReference(@NotNull TranslationContext context, @NotNull JetProperty expression) { JsName backingFieldName = getBackingFieldName(getPropertyName(expression), context); return getThisQualifiedNameReference(context, backingFieldName); } @NotNull - static public JsNameRef backingFieldReference(@NotNull TranslationContext context, + public static JsNameRef backingFieldReference(@NotNull TranslationContext context, @NotNull PropertyDescriptor descriptor) { JsName backingFieldName = getBackingFieldName(descriptor.getName(), context); return getThisQualifiedNameReference(context, backingFieldName); } @NotNull - static public String getPropertyName(@NotNull JetProperty expression) { + public static String getPropertyName(@NotNull JetProperty expression) { String propertyName = expression.getName(); if (propertyName == null) { throw new AssertionError("Property with no name encountered!"); @@ -177,4 +174,14 @@ public final class TranslationUtils { } return result; } + + public static boolean isIntrinsicOperation(@NotNull TranslationContext context, + @NotNull JetReferenceExpression expression) { + DeclarationDescriptor descriptor = + BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression); + + if (descriptor == null) return true; + + return (context.intrinsics().hasDescriptor(descriptor)); + } } diff --git a/translator/testFiles/standardClasses/cases/arrayAccess.kt b/translator/testFiles/standardClasses/cases/arrayAccess.kt index cfa5fe20750..aaf3e433629 100644 --- a/translator/testFiles/standardClasses/cases/arrayAccess.kt +++ b/translator/testFiles/standardClasses/cases/arrayAccess.kt @@ -4,5 +4,5 @@ fun box() : Boolean { val a = Array(4) a[1] = 2 a[2] = 3 - return a.get(1) == 2 + return (a[1] == 2) && (a[2] == 3) } \ No newline at end of file