Pattern -> DescriptorPredicate, NameChecker -> NamePredicate.

This commit is contained in:
Pavel V. Talanov
2012-07-18 15:37:50 +04:00
parent bd6f38021f
commit 71071595fa
13 changed files with 101 additions and 107 deletions
@@ -99,7 +99,7 @@ public final class FunctionIntrinsics {
@NotNull
private FunctionIntrinsic computeIntrinsic(@NotNull FunctionDescriptor descriptor) {
for (FunctionIntrinsicFactory factory : factories) {
if (factory.getPattern().apply(descriptor)) {
if (factory.getPredicate().apply(descriptor)) {
return factory.getIntrinsic(descriptor);
}
}
@@ -28,7 +28,7 @@ import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInPropertyIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.CallStandardMethodIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
import java.util.List;
@@ -40,7 +40,7 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB
public final class ArrayFIF {
@NotNull
private static final NameChecker ARRAYS;
private static final NamePredicate ARRAYS;
static {
List<Name> arrayTypeNames = Lists.newArrayList();
@@ -48,7 +48,7 @@ public final class ArrayFIF {
arrayTypeNames.add(type.getArrayTypeName());
}
arrayTypeNames.add(Name.identifier("Array"));
ARRAYS = new NameChecker(arrayTypeNames);
ARRAYS = new NamePredicate(arrayTypeNames);
}
@NotNull
@@ -16,12 +16,14 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Maps;
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;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import java.util.Collection;
import java.util.Map;
@@ -31,7 +33,7 @@ import java.util.Map;
*/
public final class FIFBuilder {
@NotNull final Map<Pattern, FunctionIntrinsic> patternToIntrinsic = Maps.newHashMap();
@NotNull final Map<DescriptorPredicate, FunctionIntrinsic> patternToIntrinsic = Maps.newHashMap();
private FIFBuilder() {
}
@@ -42,7 +44,7 @@ public final class FIFBuilder {
}
@NotNull
public FIFBuilder add(@NotNull Pattern pattern, @NotNull FunctionIntrinsic intrinsic) {
public FIFBuilder add(@NotNull DescriptorPredicate pattern, @NotNull FunctionIntrinsic intrinsic) {
patternToIntrinsic.put(pattern, intrinsic);
return this;
}
@@ -53,15 +55,21 @@ public final class FIFBuilder {
@NotNull
@Override
public Pattern getPattern() {
Collection<Pattern> patterns = patternToIntrinsic.keySet();
return PatternBuilder.any(patterns.toArray(new Pattern[patterns.size()]));
public Predicate<FunctionDescriptor> getPredicate() {
Collection<DescriptorPredicate> 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 (Pattern pattern : patternToIntrinsic.keySet()) {
for (DescriptorPredicate pattern : patternToIntrinsic.keySet()) {
if (pattern.apply(descriptor)) {
return patternToIntrinsic.get(pattern);
}
@@ -16,10 +16,10 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.common.base.Predicate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
/**
* @author Pavel Talanov
@@ -27,7 +27,7 @@ import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
public interface FunctionIntrinsicFactory {
@NotNull
Pattern getPattern();
Predicate<FunctionDescriptor> getPredicate();
@NotNull
FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor);
@@ -25,7 +25,7 @@ import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.CallStandardMethodIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
import java.util.List;
import java.util.Set;
@@ -38,21 +38,21 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB
*/
public final class NumberConversionFIF {
@NotNull
private static final NameChecker SUPPORTED_CONVERSIONS;
private static final NamePredicate SUPPORTED_CONVERSIONS;
static {
Set<Name> supportedConversions = Sets.newHashSet(NUMBER_CONVERSIONS);
//TODO: support longs and chars
supportedConversions.remove(CHAR);
supportedConversions.remove(LONG);
SUPPORTED_CONVERSIONS = new NameChecker(supportedConversions);
SUPPORTED_CONVERSIONS = new NamePredicate(supportedConversions);
}
@NotNull
private static final NameChecker FLOATING_POINT_CONVERSIONS = new NameChecker(OperatorConventions.FLOAT, OperatorConventions.DOUBLE);
private static final NamePredicate FLOATING_POINT_CONVERSIONS = new NamePredicate(OperatorConventions.FLOAT, OperatorConventions.DOUBLE);
@NotNull
private static final NameChecker INTEGER_CONVERSIONS = new NameChecker(OperatorConventions.INT, OperatorConventions.SHORT,
private static final NamePredicate INTEGER_CONVERSIONS = new NamePredicate(OperatorConventions.INT, OperatorConventions.SHORT,
OperatorConventions.BYTE);
@NotNull
@@ -16,6 +16,8 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
@@ -26,9 +28,7 @@ import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
import org.jetbrains.k2js.translate.operation.OperatorTable;
import java.util.List;
@@ -63,15 +63,15 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
}
};
@NotNull
private static final NameChecker BINARY_OPERATIONS = new NameChecker(OperatorConventions.BINARY_OPERATION_NAMES.values());
private static final NamePredicate BINARY_OPERATIONS = new NamePredicate(OperatorConventions.BINARY_OPERATION_NAMES.values());
@NotNull
@Override
public Pattern getPattern() {
public Predicate<FunctionDescriptor> getPredicate() {
//TODO: check that it is binary operation
return PatternBuilder.any(pattern(NameChecker.PRIMITIVE_NUMBERS, BINARY_OPERATIONS),
pattern("Boolean.or|and|xor"),
pattern("String.plus"));
return Predicates.or(pattern(NamePredicate.PRIMITIVE_NUMBERS, BINARY_OPERATIONS),
pattern("Boolean.or|and|xor"),
pattern("String.plus"));
}
@NotNull
@@ -16,6 +16,8 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsPrefixOperation;
import com.google.dart.compiler.backend.js.ast.JsUnaryOperator;
@@ -27,15 +29,15 @@ import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
import org.jetbrains.k2js.translate.operation.OperatorTable;
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
import java.util.List;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker.PRIMITIVE_NUMBERS;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.*;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate.PRIMITIVE_NUMBERS;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
/**
* @author Pavel Talanov
@@ -44,23 +46,28 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory {
INSTANCE;
private static final NameChecker UNARY_OPERATIONS = new NameChecker(OperatorConventions.UNARY_OPERATION_NAMES.values());
private static final NamePredicate UNARY_OPERATIONS = new NamePredicate(OperatorConventions.UNARY_OPERATION_NAMES.values());
@NotNull
private static final Pattern UNARY_OPERATION_FOR_PRIMITIVE_NUMBER =
private static final DescriptorPredicate UNARY_OPERATION_FOR_PRIMITIVE_NUMBER =
pattern(PRIMITIVE_NUMBERS, UNARY_OPERATIONS);
@NotNull
private static final Pattern NO_PARAMETERS = new Pattern() {
public static final Predicate<FunctionDescriptor> PRIMITIVE_UNARY_OPERATION_NAMES =
Predicates.or(UNARY_OPERATION_FOR_PRIMITIVE_NUMBER, pattern("Boolean.not"));
@NotNull
private static final DescriptorPredicate NO_PARAMETERS = new DescriptorPredicate() {
@Override
public boolean apply(@NotNull FunctionDescriptor descriptor) {
public boolean apply(@Nullable FunctionDescriptor descriptor) {
assert descriptor != null;
return !JsDescriptorUtils.hasParameters(descriptor);
}
};
@NotNull
public static final Predicate<FunctionDescriptor> PATTERN = Predicates.and(PRIMITIVE_UNARY_OPERATION_NAMES, NO_PARAMETERS);
@NotNull
@Override
public Pattern getPattern() {
Pattern primitiveUnaryOperationNames = any(UNARY_OPERATION_FOR_PRIMITIVE_NUMBER, pattern("Boolean.not"));
return all(primitiveUnaryOperationNames, NO_PARAMETERS);
public Predicate<FunctionDescriptor> getPredicate() {
return PATTERN;
}
@NotNull
@@ -24,7 +24,7 @@ import org.jetbrains.annotations.Nullable;
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.Pattern;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import java.util.List;
@@ -38,7 +38,7 @@ import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier;
public final class StringOperationFIF {
@NotNull
private static final Pattern GET_PATTERN = pattern("String.get");
private static final DescriptorPredicate GET_PATTERN = pattern("String.get");
@NotNull
private static final FunctionIntrinsic GET_INTRINSIC = new FunctionIntrinsic() {
@@ -19,7 +19,7 @@ package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.BuiltInFunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.CallStandardMethodIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.DescriptorPredicate;
import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder.pattern;
@@ -29,7 +29,7 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB
public final class TopLevelFIF {
@NotNull
private static final Pattern EXT_TO_STRING = pattern("toString");
private static final DescriptorPredicate EXT_TO_STRING = pattern("toString");
@NotNull
public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start()
@@ -17,6 +17,7 @@
package org.jetbrains.k2js.translate.intrinsic.functions.factories;
import closurecompiler.internal.com.google.common.collect.Lists;
import com.google.common.base.Predicate;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
@@ -25,8 +26,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.Pattern;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate;
import org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternBuilder;
import java.util.List;
@@ -38,30 +38,30 @@ public enum TupleGetterFIF implements FunctionIntrinsicFactory {
INSTANCE;
@NotNull
private static final NameChecker TUPLES;
private static final NamePredicate TUPLES;
static {
List<String> tupleNames = Lists.newArrayList();
for (int tupleSize = 0; tupleSize <= JetStandardClasses.MAX_TUPLE_ORDER; ++tupleSize) {
tupleNames.add("Tuple" + tupleSize);
}
TUPLES = new NameChecker(tupleNames);
TUPLES = new NamePredicate(tupleNames);
}
@NotNull
private static final NameChecker TUPLE_UNDERSCORE_ACCESSORS;
private static final NamePredicate TUPLE_UNDERSCORE_ACCESSORS;
static {
List<String> accessorNames = Lists.newArrayList();
for (int tupleSize = 0; tupleSize <= JetStandardClasses.MAX_TUPLE_ORDER; ++tupleSize) {
accessorNames.add("<get-_" + (tupleSize + 1) + ">");
}
TUPLE_UNDERSCORE_ACCESSORS = new NameChecker(accessorNames);
TUPLE_UNDERSCORE_ACCESSORS = new NamePredicate(accessorNames);
}
@NotNull
@Override
public Pattern getPattern() {
public Predicate<FunctionDescriptor> getPredicate() {
return PatternBuilder.pattern(TUPLES, TUPLE_UNDERSCORE_ACCESSORS);
}
@@ -16,13 +16,14 @@
package org.jetbrains.k2js.translate.intrinsic.functions.patterns;
import org.jetbrains.annotations.NotNull;
import com.google.common.base.Predicate;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
/**
* @author Pavel Talanov
*/
public interface Pattern {
boolean apply(@NotNull FunctionDescriptor descriptor);
public interface DescriptorPredicate extends Predicate<FunctionDescriptor> {
@Override
boolean apply(@Nullable FunctionDescriptor descriptor);
}
@@ -17,7 +17,9 @@
package org.jetbrains.k2js.translate.intrinsic.functions.patterns;
import closurecompiler.internal.com.google.common.collect.Lists;
import com.google.common.base.Predicate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Arrays;
@@ -27,33 +29,37 @@ import java.util.List;
/**
* @author Pavel Talanov
*/
public final class NameChecker {
public final class NamePredicate implements Predicate<Name> {
@NotNull
public static final NameChecker PRIMITIVE_NUMBERS = new NameChecker("Int", "Double", "Float", "Long", "Short");
public static final NamePredicate PRIMITIVE_NUMBERS = new NamePredicate("Int", "Double", "Float", "Long", "Short");
@NotNull
private final List<Name> validNames = Lists.newArrayList();
public NameChecker(@NotNull String... validNames) {
public NamePredicate(@NotNull String... validNames) {
this(Arrays.asList(validNames));
}
public NameChecker(@NotNull List<String> validNames) {
public NamePredicate(@NotNull List<String> validNames) {
for (String validName : validNames) {
this.validNames.add(Name.guess(validName));
}
}
public NameChecker(@NotNull Collection<Name> validNames) {
public NamePredicate(@NotNull Collection<Name> validNames) {
this.validNames.addAll(validNames);
}
public NameChecker(@NotNull Name... validNames) {
public NamePredicate(@NotNull Name... validNames) {
this.validNames.addAll(Lists.newArrayList(validNames));
}
public boolean isValid(@NotNull Name name) {
@Override
public boolean apply(@Nullable Name name) {
if (name == null) {
return false;
}
for (Name validName : validNames) {
if (name.equals(validName)) {
return true;
@@ -18,6 +18,7 @@ package org.jetbrains.k2js.translate.intrinsic.functions.patterns;
import closurecompiler.internal.com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -30,49 +31,50 @@ import java.util.List;
*/
public final class PatternBuilder {
public static final NameChecker JET = new NameChecker("jet");
public static final NamePredicate JET = new NamePredicate("jet");
private PatternBuilder() {
}
@NotNull
public static Pattern pattern(@NotNull NameChecker checker, @NotNull String stringWithPattern) {
List<NameChecker> checkers = Lists.newArrayList(checker);
public static DescriptorPredicate pattern(@NotNull NamePredicate checker, @NotNull String stringWithPattern) {
List<NamePredicate> checkers = Lists.newArrayList(checker);
checkers.addAll(parseStringAsCheckerList(stringWithPattern));
return pattern(checkers);
}
@NotNull
public static Pattern pattern(@NotNull String stringWithPattern, @NotNull NameChecker checker) {
List<NameChecker> checkers = Lists.newArrayList(parseStringAsCheckerList(stringWithPattern));
public static DescriptorPredicate pattern(@NotNull String stringWithPattern, @NotNull NamePredicate checker) {
List<NamePredicate> checkers = Lists.newArrayList(parseStringAsCheckerList(stringWithPattern));
checkers.add(checker);
return pattern(checkers);
}
@NotNull
public static Pattern pattern(@NotNull String string) {
List<NameChecker> checkers = parseStringAsCheckerList(string);
public static DescriptorPredicate pattern(@NotNull String string) {
List<NamePredicate> checkers = parseStringAsCheckerList(string);
return pattern(checkers);
}
@NotNull
private static List<NameChecker> parseStringAsCheckerList(@NotNull String stringWithPattern) {
private static List<NamePredicate> parseStringAsCheckerList(@NotNull String stringWithPattern) {
String[] subPatterns = stringWithPattern.split("\\.");
List<NameChecker> checkers = Lists.newArrayList();
List<NamePredicate> checkers = Lists.newArrayList();
for (String subPattern : subPatterns) {
String[] validNames = subPattern.split("\\|");
checkers.add(new NameChecker(validNames));
checkers.add(new NamePredicate(validNames));
}
return checkers;
}
@NotNull
private static Pattern pattern(@NotNull List<NameChecker> checkers) {
final List<NameChecker> checkersWithPrefixChecker = Lists.newArrayList(JET);
private static DescriptorPredicate pattern(@NotNull List<NamePredicate> checkers) {
final List<NamePredicate> checkersWithPrefixChecker = Lists.newArrayList(JET);
checkersWithPrefixChecker.addAll(checkers);
return new Pattern() {
return new DescriptorPredicate() {
@Override
public boolean apply(@NotNull FunctionDescriptor descriptor) {
public boolean apply(@Nullable FunctionDescriptor descriptor) {
assert descriptor != null;
//TODO: no need to wrap if we check beforehand
try {
return doApply(descriptor);
@@ -94,8 +96,8 @@ public final class PatternBuilder {
private boolean allNamePartsValid(@NotNull List<Name> nameParts) {
for (int i = 0; i < nameParts.size(); ++i) {
Name namePart = nameParts.get(i);
NameChecker correspondingPredicate = checkersWithPrefixChecker.get(i);
if (!correspondingPredicate.isValid(namePart)) {
NamePredicate correspondingPredicate = checkersWithPrefixChecker.get(i);
if (!correspondingPredicate.apply(namePart)) {
return false;
}
}
@@ -105,37 +107,7 @@ public final class PatternBuilder {
}
@NotNull
public static Pattern pattern(@NotNull final NameChecker... checkers) {
public static DescriptorPredicate pattern(@NotNull final NamePredicate... checkers) {
return pattern(Arrays.asList(checkers));
}
@NotNull
public static Pattern any(@NotNull final Pattern... patterns) {
return new Pattern() {
@Override
public boolean apply(@NotNull FunctionDescriptor descriptor) {
for (Pattern pattern : patterns) {
if (pattern.apply(descriptor)) {
return true;
}
}
return false;
}
};
}
@NotNull
public static Pattern all(@NotNull final Pattern... patterns) {
return new Pattern() {
@Override
public boolean apply(@NotNull FunctionDescriptor descriptor) {
for (Pattern pattern : patterns) {
if (!pattern.apply(descriptor)) {
return false;
}
}
return true;
}
};
}
}