diff --git a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java index 66892d72c01..77b613b3abe 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java +++ b/translator/src/org/jetbrains/k2js/translate/context/StandardClasses.java @@ -91,8 +91,6 @@ public final class StandardClasses { standardClasses.declare().forFQ("jet.Any.toString").kotlinFunction("toString"); standardClasses.declare().forFQ("java.util.Collections..max").kotlinFunction("collectionsMax"); - - standardClasses.declare().forFQ("jet.CharSequence.get").kotlinFunction("getChar"); } diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java index f15342ab98b..e5c7b3c347a 100644 --- a/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/Intrinsics.java @@ -12,6 +12,7 @@ import org.jetbrains.jet.lang.types.PrimitiveType; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.k2js.translate.intrinsic.array.*; import org.jetbrains.k2js.translate.intrinsic.primitive.*; +import org.jetbrains.k2js.translate.intrinsic.string.GetIntrinsic; import org.jetbrains.k2js.translate.intrinsic.string.LengthIntrinsic; import org.jetbrains.k2js.translate.intrinsic.tuple.TupleAccessIntrinsic; import org.jetbrains.k2js.translate.operation.OperatorTable; @@ -119,6 +120,9 @@ public final class Intrinsics { PropertyDescriptor lengthProperty = getPropertyByName(library.getString().getDefaultType().getMemberScope(), "length"); functionIntrinsics.put(lengthProperty.getGetter(), LengthIntrinsic.INSTANCE); + FunctionDescriptor getFunction = + getFunctionByName(library.getCharSequence().getDefaultType().getMemberScope(), "get"); + functionIntrinsics.put(getFunction, GetIntrinsic.INSTANCE); } private void declareTupleIntrinsicAccessors(@NotNull ClassifierDescriptor tupleDescriptor, diff --git a/translator/src/org/jetbrains/k2js/translate/intrinsic/string/GetIntrinsic.java b/translator/src/org/jetbrains/k2js/translate/intrinsic/string/GetIntrinsic.java new file mode 100644 index 00000000000..201cbce500d --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/intrinsic/string/GetIntrinsic.java @@ -0,0 +1,31 @@ +package org.jetbrains.k2js.translate.intrinsic.string; + +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.annotations.Nullable; +import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.intrinsic.FunctionIntrinsic; + +import java.util.List; + +/** + * @author Pavel Talanov + */ +public enum GetIntrinsic implements FunctionIntrinsic { + + INSTANCE; + + @NotNull + @Override + public JsExpression apply(@Nullable JsExpression receiver, @NotNull List arguments, + @NotNull TranslationContext context) { + assert receiver != null; + assert arguments.size() == 1 : "get Char expression must have 1 arguments."; + //TODO: provide better way + JsNameRef charAtReference = AstUtil.newQualifiedNameRef("charAt"); + AstUtil.setQualifier(charAtReference, receiver); + return AstUtil.newInvocation(charAtReference, arguments); + } +} diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java index 564de6942bb..7ebc4f880fd 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java @@ -7,8 +7,6 @@ import org.jetbrains.jet.lang.psi.JetArrayAccessExpression; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.Translation; -import org.jetbrains.k2js.translate.intrinsic.array.ArrayGetIntrinsic; -import org.jetbrains.k2js.translate.intrinsic.array.ArraySetIntrinsic; import org.jetbrains.k2js.translate.utils.BindingUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; @@ -43,51 +41,18 @@ public final class ArrayAccessTranslator extends AccessTranslator { @Override @NotNull public JsExpression translateAsGet() { - if (intrinsicCall()) { - return intrinsicGet(); - } - return translateAsAccessMethodCall(); - } - - private boolean intrinsicCall() { - return context().intrinsics().isIntrinsic(methodDescriptor); - } - - //TODO: hide direct access to intrinsics - @NotNull - private JsExpression intrinsicGet() { - return ArrayGetIntrinsic.INSTANCE.apply(translateArrayExpression(), translateIndexExpressions(), context()); + ResolvedCall resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), expression); + List arguments = translateIndexExpressions(); + return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall, + methodDescriptor, context()); } @Override @NotNull public JsExpression translateAsSet(@NotNull JsExpression expression) { - if (intrinsicCall()) { - return intrinsicSet(expression); - } - return overloadedSet(expression); - } - - @NotNull - private JsExpression intrinsicSet(@NotNull JsExpression expression) { + ResolvedCall resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), this.expression); List arguments = translateIndexExpressions(); arguments.add(expression); - return ArraySetIntrinsic.INSTANCE.apply(translateArrayExpression(), arguments, context()); - } - - @NotNull - private JsExpression overloadedSet(@NotNull JsExpression expressionToSetTo) { - ResolvedCall resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), expression); - List arguments = translateIndexExpressions(); - arguments.add(expressionToSetTo); - return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall, - methodDescriptor, context()); - } - - @NotNull - private JsExpression translateAsAccessMethodCall() { - ResolvedCall resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), expression); - List arguments = translateIndexExpressions(); return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall, methodDescriptor, context()); } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 5db6a7197e0..47cbabb461b 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -208,13 +208,13 @@ public final class CallTranslator extends AbstractTranslator { super(context); this.receiver = receiver; this.arguments = arguments; - this.callee = callee; this.resolvedCall = resolvedCall; if (descriptorToCall != null) { this.descriptor = descriptorToCall; } else { this.descriptor = resolvedCall.getCandidateDescriptor().getOriginal(); } + this.callee = callee; } @NotNull diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js index c99a4052134..0269082d5ac 100644 --- a/translator/testFiles/kotlin_lib.js +++ b/translator/testFiles/kotlin_lib.js @@ -477,10 +477,6 @@ }; }; - Kotlin.getChar = function(str, index) { - return str.charAt(index); - }; - Kotlin.collectionsMax = function (col, comp) { var it = col.iterator(); if (col.isEmpty()) {