implemented charAt intrinsics for CharSequence#get
removed redundant logic from arrayAccessTranslator
This commit is contained in:
@@ -91,8 +91,6 @@ public final class StandardClasses {
|
||||
standardClasses.declare().forFQ("jet.Any.toString").kotlinFunction("toString");
|
||||
|
||||
standardClasses.declare().forFQ("java.util.Collections.<no name provided>.max").kotlinFunction("collectionsMax");
|
||||
|
||||
standardClasses.declare().forFQ("jet.CharSequence.get").kotlinFunction("getChar");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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<JsExpression> 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);
|
||||
}
|
||||
}
|
||||
@@ -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<JsExpression> 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<JsExpression> 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<JsExpression> 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<JsExpression> arguments = translateIndexExpressions();
|
||||
return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall,
|
||||
methodDescriptor, context());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user