JS backend: move common code to CompositeFIF.
This commit is contained in:
+2
-2
@@ -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);
|
||||
|
||||
+3
-7
@@ -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"));
|
||||
|
||||
+24
-5
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+5
-24
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user