diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java index 9d5c24db24e..d0c21a5072b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java @@ -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.emptyList(), context()); end = context().declareTemporary(length); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java index bcb55267b69..b7fd5c002f6 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/ArrayFIF.java @@ -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, ""), ARRAY_LENGTH_INTRINSIC); + add(pattern(ARRAYS, ""), LENGTH_PROPERTY_INTRINSIC); add(pattern(ARRAYS, ""), new KotlinFunctionIntrinsic("arrayIndices")); add(pattern(ARRAYS, "iterator"), new KotlinFunctionIntrinsic("arrayIterator")); add(pattern(ARRAY, ""), new KotlinFunctionIntrinsic("arrayFromFun")); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java index e9f5d5f36c9..82aa83f98d6 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java @@ -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> patternsAndIntrinsics = new ArrayList>(); + 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 arguments, @NotNull TranslationContext context + ) { + assert receiver != null; + return JsAstUtils.equality(new JsNameRef("length", receiver), context.program().getNumberLiteral(0)); + } + }; + + @NotNull + private final List, 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 entry : patternsAndIntrinsics) { + for (Pair, 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 pattern, @NotNull FunctionIntrinsic intrinsic) { patternsAndIntrinsics.add(Pair.create(pattern, intrinsic)); } -} + } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java index 6227de2558e..d887325b450 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/StringOperationFIF.java @@ -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", ""), lengthIntrinsic); - add(pattern("js", "").receiverExists(true), lengthIntrinsic); - add(pattern("js", "length").receiverExists(true), lengthIntrinsic); - add(pattern("jet", "CharSequence", ""), lengthIntrinsic); - add(pattern("js", "isEmpty").receiverExists(true), new FunctionIntrinsic() { - @NotNull - @Override - public JsExpression apply( - @Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context - ) { - assert receiver != null; - return JsAstUtils.equality(new JsNameRef("length", receiver), context.program().getNumberLiteral(0)); - } - }); + add(pattern("jet", "String", ""), LENGTH_PROPERTY_INTRINSIC); + add(pattern("js", "").receiverExists(true), LENGTH_PROPERTY_INTRINSIC); + add(pattern("js", "length").receiverExists(true), LENGTH_PROPERTY_INTRINSIC); + add(pattern("jet", "CharSequence", ""), LENGTH_PROPERTY_INTRINSIC); + add(pattern("js", "isEmpty").receiverExists(true), IS_EMPTY_INTRINSIC); } }