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("jet.Any.toString").kotlinFunction("toString");
|
||||||
|
|
||||||
standardClasses.declare().forFQ("java.util.Collections.<no name provided>.max").kotlinFunction("collectionsMax");
|
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.jet.lexer.JetToken;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.array.*;
|
import org.jetbrains.k2js.translate.intrinsic.array.*;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.primitive.*;
|
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.string.LengthIntrinsic;
|
||||||
import org.jetbrains.k2js.translate.intrinsic.tuple.TupleAccessIntrinsic;
|
import org.jetbrains.k2js.translate.intrinsic.tuple.TupleAccessIntrinsic;
|
||||||
import org.jetbrains.k2js.translate.operation.OperatorTable;
|
import org.jetbrains.k2js.translate.operation.OperatorTable;
|
||||||
@@ -119,6 +120,9 @@ public final class Intrinsics {
|
|||||||
PropertyDescriptor lengthProperty =
|
PropertyDescriptor lengthProperty =
|
||||||
getPropertyByName(library.getString().getDefaultType().getMemberScope(), "length");
|
getPropertyByName(library.getString().getDefaultType().getMemberScope(), "length");
|
||||||
functionIntrinsics.put(lengthProperty.getGetter(), LengthIntrinsic.INSTANCE);
|
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,
|
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.jet.lang.resolve.calls.ResolvedCall;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.general.Translation;
|
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.BindingUtils;
|
||||||
import org.jetbrains.k2js.translate.utils.TranslationUtils;
|
import org.jetbrains.k2js.translate.utils.TranslationUtils;
|
||||||
|
|
||||||
@@ -43,51 +41,18 @@ public final class ArrayAccessTranslator extends AccessTranslator {
|
|||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public JsExpression translateAsGet() {
|
public JsExpression translateAsGet() {
|
||||||
if (intrinsicCall()) {
|
ResolvedCall<?> resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), expression);
|
||||||
return intrinsicGet();
|
List<JsExpression> arguments = translateIndexExpressions();
|
||||||
}
|
return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall,
|
||||||
return translateAsAccessMethodCall();
|
methodDescriptor, context());
|
||||||
}
|
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public JsExpression translateAsSet(@NotNull JsExpression expression) {
|
public JsExpression translateAsSet(@NotNull JsExpression expression) {
|
||||||
if (intrinsicCall()) {
|
ResolvedCall<?> resolvedCall = BindingUtils.getResolvedCall(context().bindingContext(), this.expression);
|
||||||
return intrinsicSet(expression);
|
|
||||||
}
|
|
||||||
return overloadedSet(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private JsExpression intrinsicSet(@NotNull JsExpression expression) {
|
|
||||||
List<JsExpression> arguments = translateIndexExpressions();
|
List<JsExpression> arguments = translateIndexExpressions();
|
||||||
arguments.add(expression);
|
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,
|
return CallTranslator.translate(translateArrayExpression(), arguments, resolvedCall,
|
||||||
methodDescriptor, context());
|
methodDescriptor, context());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -208,13 +208,13 @@ public final class CallTranslator extends AbstractTranslator {
|
|||||||
super(context);
|
super(context);
|
||||||
this.receiver = receiver;
|
this.receiver = receiver;
|
||||||
this.arguments = arguments;
|
this.arguments = arguments;
|
||||||
this.callee = callee;
|
|
||||||
this.resolvedCall = resolvedCall;
|
this.resolvedCall = resolvedCall;
|
||||||
if (descriptorToCall != null) {
|
if (descriptorToCall != null) {
|
||||||
this.descriptor = descriptorToCall;
|
this.descriptor = descriptorToCall;
|
||||||
} else {
|
} else {
|
||||||
this.descriptor = resolvedCall.getCandidateDescriptor().getOriginal();
|
this.descriptor = resolvedCall.getCandidateDescriptor().getOriginal();
|
||||||
}
|
}
|
||||||
|
this.callee = callee;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -477,10 +477,6 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
Kotlin.getChar = function(str, index) {
|
|
||||||
return str.charAt(index);
|
|
||||||
};
|
|
||||||
|
|
||||||
Kotlin.collectionsMax = function (col, comp) {
|
Kotlin.collectionsMax = function (col, comp) {
|
||||||
var it = col.iterator();
|
var it = col.iterator();
|
||||||
if (col.isEmpty()) {
|
if (col.isEmpty()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user