diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/FunctionIntrinsics.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/FunctionIntrinsics.java index 2f99a2afc60..bdb990103c9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/FunctionIntrinsics.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/FunctionIntrinsics.java @@ -17,7 +17,7 @@ package org.jetbrains.k2js.translate.intrinsic.functions; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; @@ -30,7 +30,7 @@ import java.util.Map; public final class FunctionIntrinsics { @NotNull - private final Map intrinsicCache = Maps.newHashMap(); + private final Map intrinsicCache = new THashMap(); @NotNull private final List factories = Lists.newArrayList(); @@ -77,8 +77,9 @@ public final class FunctionIntrinsics { @NotNull private FunctionIntrinsic computeIntrinsic(@NotNull FunctionDescriptor descriptor) { for (FunctionIntrinsicFactory factory : factories) { - if (factory.getPredicate().apply(descriptor)) { - return factory.getIntrinsic(descriptor); + FunctionIntrinsic intrinsic = factory.getIntrinsic(descriptor); + if (intrinsic != null) { + return intrinsic; } } return FunctionIntrinsic.NO_INTRINSIC; 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 82aa83f98d6..c42569e29af 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 @@ -27,7 +27,6 @@ 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.List; @@ -52,19 +51,9 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory { protected CompositeFIF() { } - @NotNull - @Override - public DescriptorPredicate getPredicate() { - return new DescriptorPredicate() { - @Override - public boolean apply(@NotNull FunctionDescriptor descriptor) { - return findIntrinsic(descriptor) != null; - } - }; - } - @Nullable - public FunctionIntrinsic findIntrinsic(@NotNull FunctionDescriptor descriptor) { + @Override + public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { for (Pair, FunctionIntrinsic> entry : patternsAndIntrinsics) { if (entry.first.apply(descriptor)) { return entry.second; @@ -73,14 +62,6 @@ public abstract class CompositeFIF implements FunctionIntrinsicFactory { return null; } - @NotNull - @Override - public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { - FunctionIntrinsic intrinsic = findIntrinsic(descriptor); - assert intrinsic != null; - return 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/FunctionIntrinsicFactory.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/FunctionIntrinsicFactory.java index b2423dc98da..21e96fffa83 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/FunctionIntrinsicFactory.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/FunctionIntrinsicFactory.java @@ -16,16 +16,12 @@ package org.jetbrains.k2js.translate.intrinsic.functions.factories; -import com.google.common.base.Predicate; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; public interface FunctionIntrinsicFactory { - - @NotNull - Predicate getPredicate(); - - @NotNull + @Nullable FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor); } 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 f61c63b8736..a4a6d7e6306 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 @@ -24,7 +24,6 @@ import com.google.dart.compiler.backend.js.ast.JsNameRef; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate; @@ -50,11 +49,10 @@ public final class NumberConversionFIF extends CompositeFIF { } @NotNull - private static final NamePredicate FLOATING_POINT_CONVERSIONS = new NamePredicate(OperatorConventions.FLOAT, OperatorConventions.DOUBLE); + private static final NamePredicate FLOATING_POINT_CONVERSIONS = new NamePredicate(FLOAT, DOUBLE); @NotNull - private static final NamePredicate INTEGER_CONVERSIONS = new NamePredicate(OperatorConventions.INT, OperatorConventions.SHORT, - OperatorConventions.BYTE); + private static final NamePredicate INTEGER_CONVERSIONS = new NamePredicate(INT, SHORT, BYTE); @NotNull private static final FunctionIntrinsic RETURN_RECEIVER = new FunctionIntrinsic() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java index 1021a4d3955..f614a2d4870 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java @@ -56,7 +56,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { HasArguments numberRangeConstructorInvocation = context.isEcma5() ? new JsInvocation(expr) : new JsNew(expr); //TODO: add tests and correct expression for reversed ranges. setArguments(numberRangeConstructorInvocation, rangeStart, rangeEnd); - return (JsExpression) numberRangeConstructorInvocation; + return numberRangeConstructorInvocation; } }; @@ -77,7 +77,10 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { @NotNull private static final NamePredicate BINARY_OPERATIONS = new NamePredicate(OperatorConventions.BINARY_OPERATION_NAMES.values()); + private static final DescriptorPredicate PRIMITIVE_NUMBERS_BINARY_OPERATIONS = pattern(NamePredicate.PRIMITIVE_NUMBERS, BINARY_OPERATIONS); private static final DescriptorPredicate INT_WITH_BIT_OPERATIONS = pattern("Int.or|and|xor|shl|shr|ushr"); + private static final DescriptorPredicate BOOLEAN_OPERATIONS = pattern("Boolean.or|and|xor"); + private static final DescriptorPredicate STRING_PLUS = pattern("String.plus"); private static final ImmutableMap BINARY_BITWISE_OPERATIONS = ImmutableMap.builder() .put("or", JsBinaryOperator.BIT_OR) @@ -88,19 +91,16 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory { .put("ushr", JsBinaryOperator.SHRU) .build(); - @NotNull - @Override - public Predicate getPredicate() { - //TODO: check that it is binary operation - return Predicates.or(INT_WITH_BIT_OPERATIONS, - pattern(NamePredicate.PRIMITIVE_NUMBERS, BINARY_OPERATIONS), - pattern("Boolean.or|and|xor"), - pattern("String.plus")); - } + private static final Predicate PREDICATE = Predicates.or(PRIMITIVE_NUMBERS_BINARY_OPERATIONS, BOOLEAN_OPERATIONS, + STRING_PLUS, INT_WITH_BIT_OPERATIONS); - @NotNull + @Nullable @Override public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { + if (!PREDICATE.apply(descriptor)) { + return null; + } + if (pattern(INTEGER_NUMBER_TYPES + ".div").apply(descriptor)) { return INTEGER_DIVISION_INTRINSIC; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java index c910097ebcb..2341a129540 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java @@ -60,15 +60,13 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { @NotNull private static final Predicate PATTERN = Predicates.and(PRIMITIVE_UNARY_OPERATION_NAMES, NO_PARAMETERS); - @NotNull - @Override - public Predicate getPredicate() { - return PATTERN; - } - - @NotNull + @Nullable @Override public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { + if (!PATTERN.apply(descriptor)) { + return null; + } + Name name = descriptor.getName(); JsUnaryOperator jsOperator;