JS backend: move common code to CompositeFIF.

This commit is contained in:
develar
2013-08-08 19:51:49 +04:00
committed by Zalim Bashorov
parent 7ba0f0eb33
commit 50739b465e
4 changed files with 34 additions and 38 deletions
@@ -25,7 +25,7 @@ import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.intrinsic.functions.factories.ArrayFIF;
import org.jetbrains.k2js.translate.intrinsic.functions.factories.CompositeFIF;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import java.util.Collections;
@@ -67,7 +67,7 @@ public final class ArrayForTranslator extends ForTranslator {
super(forExpression, context);
loopRange = context.declareTemporary(Translation.translateAsExpression(getLoopRange(expression), context));
JsExpression length = ArrayFIF.ARRAY_LENGTH_INTRINSIC.apply(loopRange.reference(),
JsExpression length = CompositeFIF.LENGTH_PROPERTY_INTRINSIC.apply(loopRange.reference(),
Collections.<JsExpression>emptyList(),
context());
end = context().declareTemporary(length);
@@ -25,16 +25,15 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
import org.jetbrains.k2js.translate.context.Namer;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.List;
import static com.intellij.openapi.util.text.StringUtil.decapitalize;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment;
public final class ArrayFIF extends CompositeFIF {
@@ -122,20 +121,17 @@ public final class ArrayFIF extends CompositeFIF {
JsExpression indexExpression = arguments.get(0);
JsExpression value = arguments.get(1);
JsArrayAccess arrayAccess = new JsArrayAccess(receiver, indexExpression);
return JsAstUtils.assignment(arrayAccess, value);
return assignment(arrayAccess, value);
}
};
@NotNull
public static final BuiltInPropertyIntrinsic ARRAY_LENGTH_INTRINSIC = new BuiltInPropertyIntrinsic("length");
@NotNull
public static final FunctionIntrinsicFactory INSTANCE = new ArrayFIF();
private ArrayFIF() {
add(pattern(ARRAYS, "get"), GET_INTRINSIC);
add(pattern(ARRAYS, "set"), SET_INTRINSIC);
add(pattern(ARRAYS, "<get-size>"), ARRAY_LENGTH_INTRINSIC);
add(pattern(ARRAYS, "<get-size>"), LENGTH_PROPERTY_INTRINSIC);
add(pattern(ARRAYS, "<get-indices>"), new KotlinFunctionIntrinsic("arrayIndices"));
add(pattern(ARRAYS, "iterator"), new KotlinFunctionIntrinsic("arrayIterator"));
add(pattern(ARRAY, "<init>"), new KotlinFunctionIntrinsic("arrayFromFun"));
@@ -16,19 +16,38 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.ArrayList;
import java.util.List;
public abstract class CompositeFIF implements FunctionIntrinsicFactory {
@NotNull
private final List<Pair<DescriptorPredicate, FunctionIntrinsic>> patternsAndIntrinsics = new ArrayList<Pair<DescriptorPredicate, FunctionIntrinsic>>();
public static final FunctionIntrinsic LENGTH_PROPERTY_INTRINSIC = new BuiltInPropertyIntrinsic("length");
public static final FunctionIntrinsic IS_EMPTY_INTRINSIC = new FunctionIntrinsic() {
@NotNull
@Override
public JsExpression apply(
@Nullable JsExpression receiver, @NotNull List<JsExpression> arguments, @NotNull TranslationContext context
) {
assert receiver != null;
return JsAstUtils.equality(new JsNameRef("length", receiver), context.program().getNumberLiteral(0));
}
};
@NotNull
private final List<Pair<Predicate<FunctionDescriptor>, FunctionIntrinsic>> patternsAndIntrinsics = Lists.newArrayList();
protected CompositeFIF() {
}
@@ -46,7 +65,7 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory {
@Nullable
public FunctionIntrinsic findIntrinsic(@NotNull FunctionDescriptor descriptor) {
for (Pair<DescriptorPredicate, FunctionIntrinsic> entry : patternsAndIntrinsics) {
for (Pair<Predicate<FunctionDescriptor>, FunctionIntrinsic> entry : patternsAndIntrinsics) {
if (entry.first.apply(descriptor)) {
return entry.second;
}
@@ -62,7 +81,7 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory {
return intrinsic;
}
protected void add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) {
protected void add(@NotNull Predicate<FunctionDescriptor> pattern, @NotNull FunctionIntrinsic intrinsic) {
patternsAndIntrinsics.add(Pair.create(pattern, intrinsic));
}
}
}
@@ -16,17 +16,8 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInFunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.utils.JsAstUtils;
import java.util.List;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
@@ -37,20 +28,10 @@ public final class StringOperationFIF extends CompositeFIF {
private StringOperationFIF() {
add(pattern("jet", "String", "get"), new BuiltInFunctionIntrinsic("charAt"));
BuiltInPropertyIntrinsic lengthIntrinsic = new BuiltInPropertyIntrinsic("length");
add(pattern("jet", "String", "<get-length>"), lengthIntrinsic);
add(pattern("js", "<get-size>").receiverExists(true), lengthIntrinsic);
add(pattern("js", "length").receiverExists(true), lengthIntrinsic);
add(pattern("jet", "CharSequence", "<get-length>"), lengthIntrinsic);
add(pattern("js", "isEmpty").receiverExists(true), new FunctionIntrinsic() {
@NotNull
@Override
public JsExpression apply(
@Nullable JsExpression receiver, @NotNull List<JsExpression> arguments, @NotNull TranslationContext context
) {
assert receiver != null;
return JsAstUtils.equality(new JsNameRef("length", receiver), context.program().getNumberLiteral(0));
}
});
add(pattern("jet", "String", "<get-length>"), LENGTH_PROPERTY_INTRINSIC);
add(pattern("js", "<get-size>").receiverExists(true), LENGTH_PROPERTY_INTRINSIC);
add(pattern("js", "length").receiverExists(true), LENGTH_PROPERTY_INTRINSIC);
add(pattern("jet", "CharSequence", "<get-length>"), LENGTH_PROPERTY_INTRINSIC);
add(pattern("js", "isEmpty").receiverExists(true), IS_EMPTY_INTRINSIC);
}
}