implemented charAt intrinsics for CharSequence#get

removed redundant logic from arrayAccessTranslator
This commit is contained in:
Pavel Talanov
2012-02-05 15:33:48 +04:00
parent 1859ddf941
commit 1b594d8181
6 changed files with 41 additions and 47 deletions
@@ -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
-4
View File
@@ -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()) {