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 12046aa6902..9e19d6a24c7 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 @@ -37,7 +37,7 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB /** * @author Pavel Talanov */ -public final class ArrayFIF { +public final class ArrayFIF extends CompositeFIF { @NotNull private static final NamePredicate ARRAYS; @@ -85,15 +85,14 @@ public final class ArrayFIF { public static final BuiltInPropertyIntrinsic ARRAY_LENGTH_INTRINSIC = new BuiltInPropertyIntrinsic("length"); @NotNull - public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start() - .add(pattern(ARRAYS, "get"), GET_INTRINSIC) - .add(pattern(ARRAYS, "set"), SET_INTRINSIC) - .add(pattern(ARRAYS, ""), ARRAY_LENGTH_INTRINSIC) - .add(pattern(ARRAYS, ""), new CallStandardMethodIntrinsic("Kotlin.arrayIndices", true, 0)) - .add(pattern(ARRAYS, "iterator"), new CallStandardMethodIntrinsic("Kotlin.arrayIterator", true, 0)) - .add(pattern(ARRAYS, ""), new CallStandardMethodIntrinsic("Kotlin.arrayFromFun", false, 2)) - .build(); + 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, ""), new CallStandardMethodIntrinsic("Kotlin.arrayIndices", true, 0)); + add(pattern(ARRAYS, "iterator"), new CallStandardMethodIntrinsic("Kotlin.arrayIterator", true, 0)); + add(pattern(ARRAYS, ""), new CallStandardMethodIntrinsic("Kotlin.arrayFromFun", false, 2)); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/FIFBuilder.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java similarity index 51% rename from js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/FIFBuilder.java rename to js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java index 17b97215845..3e7e851b481 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/FIFBuilder.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/CompositeFIF.java @@ -31,51 +31,38 @@ import java.util.Map; /** * @author Pavel Talanov */ -public final class FIFBuilder { +public abstract class CompositeFIF implements FunctionIntrinsicFactory { @NotNull final Map patternToIntrinsic = Maps.newHashMap(); - private FIFBuilder() { + protected CompositeFIF() { } @NotNull - public static FIFBuilder start() { - return new FIFBuilder(); - } - - @NotNull - public FIFBuilder add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) { - patternToIntrinsic.put(pattern, intrinsic); - return this; - } - - @NotNull - public FunctionIntrinsicFactory build() { - return new FunctionIntrinsicFactory() { - - @NotNull + @Override + public Predicate getPredicate() { + Collection patterns = patternToIntrinsic.keySet(); + final DescriptorPredicate[] patterns1 = patterns.toArray(new DescriptorPredicate[patterns.size()]); + return new DescriptorPredicate() { @Override - public Predicate getPredicate() { - Collection patterns = patternToIntrinsic.keySet(); - final DescriptorPredicate[] patterns1 = patterns.toArray(new DescriptorPredicate[patterns.size()]); - return new DescriptorPredicate() { - @Override - public boolean apply(@Nullable FunctionDescriptor descriptor) { - return Predicates.or(patterns1).apply(descriptor); - } - }; - } - - @NotNull - @Override - public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { - for (DescriptorPredicate pattern : patternToIntrinsic.keySet()) { - if (pattern.apply(descriptor)) { - return patternToIntrinsic.get(pattern); - } - } - throw new IllegalStateException("Must have intrinsic for pattern."); + public boolean apply(@Nullable FunctionDescriptor descriptor) { + return Predicates.or(patterns1).apply(descriptor); } }; } + + @NotNull + @Override + public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { + for (DescriptorPredicate pattern : patternToIntrinsic.keySet()) { + if (pattern.apply(descriptor)) { + return patternToIntrinsic.get(pattern); + } + } + throw new IllegalStateException("Must have intrinsic for pattern."); + } + + protected void add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) { + patternToIntrinsic.put(pattern, intrinsic); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java index 1aeaff36cdd..1d43dcd6406 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java @@ -36,7 +36,7 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB /** * @author Pavel Talanov */ -public final class NumberConversionFIF { +public final class NumberConversionFIF extends CompositeFIF { @NotNull private static final NamePredicate SUPPORTED_CONVERSIONS; @@ -74,12 +74,11 @@ public final class NumberConversionFIF { @NotNull public static final String FLOATING_POINT_NUMBER_TYPES = "Float|Double|Number"; @NotNull - public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start() - .add(pattern(INTEGER_NUMBER_TYPES, SUPPORTED_CONVERSIONS), RETURN_RECEIVER) - .add(pattern(FLOATING_POINT_NUMBER_TYPES, INTEGER_CONVERSIONS), new CallStandardMethodIntrinsic("Math.floor", true, 0)) - .add(pattern(FLOATING_POINT_NUMBER_TYPES, FLOATING_POINT_CONVERSIONS), RETURN_RECEIVER) - .build(); + public static final FunctionIntrinsicFactory INSTANCE = new NumberConversionFIF(); private NumberConversionFIF() { + add(pattern(INTEGER_NUMBER_TYPES, SUPPORTED_CONVERSIONS), RETURN_RECEIVER); + add(pattern(FLOATING_POINT_NUMBER_TYPES, INTEGER_CONVERSIONS), new CallStandardMethodIntrinsic("Math.floor", true, 0)); + add(pattern(FLOATING_POINT_NUMBER_TYPES, FLOATING_POINT_CONVERSIONS), RETURN_RECEIVER); } } 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 90317146196..f74b22060f7 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 @@ -35,7 +35,7 @@ import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; /** * @author Pavel Talanov */ -public final class StringOperationFIF { +public final class StringOperationFIF extends CompositeFIF { @NotNull private static final DescriptorPredicate GET_PATTERN = pattern("String.get"); @@ -57,12 +57,11 @@ public final class StringOperationFIF { }; @NotNull - public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start() - .add(GET_PATTERN, GET_INTRINSIC) - .add(pattern("String."), new BuiltInPropertyIntrinsic("length")) - .add(pattern("CharSequence."), new BuiltInPropertyIntrinsic("length")) - .build(); + public static final FunctionIntrinsicFactory INSTANCE = new StringOperationFIF(); private StringOperationFIF() { + add(GET_PATTERN, GET_INTRINSIC); + add(pattern("String."), new BuiltInPropertyIntrinsic("length")); + add(pattern("CharSequence."), new BuiltInPropertyIntrinsic("length")); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index 7e8663f40df..bb9f214fa22 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -26,18 +26,17 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB /** * @author Pavel Talanov */ -public final class TopLevelFIF { +public final class TopLevelFIF extends CompositeFIF { @NotNull private static final DescriptorPredicate EXT_TO_STRING = pattern("toString"); @NotNull - public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start() - .add(EXT_TO_STRING, new BuiltInFunctionIntrinsic("toString")) - //TODO: add intrinsic for calling equals explicitly - .add(pattern("arrayOfNulls"), new CallStandardMethodIntrinsic("Kotlin.nullArray", false, 1)) - .build(); + public static final FunctionIntrinsicFactory INSTANCE = new TopLevelFIF(); private TopLevelFIF() { + add(EXT_TO_STRING, new BuiltInFunctionIntrinsic("toString")); + //TODO: add intrinsic for calling equals explicitly + add(pattern("arrayOfNulls"), new CallStandardMethodIntrinsic("Kotlin.nullArray", false, 1)); } }