Merge pull request #42 from DanilaFe/java8-subset

Restrict Abacus core to a Java8 subset
This commit is contained in:
Danila Fedorin 2017-09-24 00:38:54 -07:00 committed by GitHub
commit 5a1fdfe4bc
9 changed files with 52 additions and 18 deletions

View File

@ -6,7 +6,6 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.function.Function;
/**
* A pattern that can be compiled from a string and used in lexing.
@ -36,8 +35,8 @@ public class Pattern<T> {
* A map of regex operator to functions that modify a PatternChain
* with the appropriate operation.
*/
private Map<Character, Function<PatternChain<T>, PatternChain<T>>> operations =
new HashMap<Character, Function<PatternChain<T>, PatternChain<T>>>() {{
private Map<Character, Transformation<T>> operations =
new HashMap<Character, Transformation<T>>() {{
put('+', Pattern.this::transformPlus);
put('*', Pattern.this::transformStar);
put('?', Pattern.this::transformQuestion);
@ -207,7 +206,7 @@ public class Pattern<T> {
if (operations.containsKey(currentChar)) {
if (currentChain == null) return null;
currentChain = operations.get(currentChar).apply(currentChain);
currentChain = operations.get(currentChar).transform(currentChain);
fullChain.append(currentChain);
currentChain = null;
index++;

View File

@ -0,0 +1,16 @@
package org.nwapw.abacus.lexing.pattern;
/**
* An interface that transforms a pattern chain into a different pattern chain.
* @param <T> the type used to identify the nodes in the pattern chain.
*/
public interface Transformation<T> {
/**
* Performs the actual transformation.
* @param from the original chain.
* @return the resulting chain.
*/
PatternChain<T> transform(PatternChain<T> from);
}

View File

@ -1,10 +1,10 @@
package org.nwapw.abacus.plugin;
import org.nwapw.abacus.number.NumberInterface;
import org.nwapw.abacus.number.promotion.PromotionFunction;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* A class that holds data about a number implementation.
@ -14,7 +14,7 @@ public abstract class NumberImplementation {
/**
* The list of paths through which this implementation can be promoted.
*/
private Map<String, Function<NumberInterface, NumberInterface>> promotionPaths;
private Map<String, PromotionFunction> promotionPaths;
/**
* The implementation class for this implementation.
*/
@ -41,7 +41,7 @@ public abstract class NumberImplementation {
*
* @return the map of documentation paths.
*/
public final Map<String, Function<NumberInterface, NumberInterface>> getPromotionPaths() {
public final Map<String, PromotionFunction> getPromotionPaths() {
return promotionPaths;
}

View File

@ -3,7 +3,6 @@ package org.nwapw.abacus.number.promotion
import org.nwapw.abacus.number.NumberInterface
typealias PromotionFunction = java.util.function.Function<NumberInterface, NumberInterface>
typealias PromotionPath = List<PromotionFunction>
typealias NumberClass = Class<NumberInterface>
@ -14,5 +13,5 @@ typealias NumberClass = Class<NumberInterface>
* @param from the number to start from.
*/
fun PromotionPath.promote(from: NumberInterface): NumberInterface {
return fold(from, { current, function -> function.apply(current) })
return fold(from, { current, function -> function.promote(current) })
}

View File

@ -0,0 +1,20 @@
package org.nwapw.abacus.number.promotion
import org.nwapw.abacus.number.NumberInterface
/**
* Function that is used to promote a number from one type to another.
*
* A promotion function is used in the promotion system as a mean to
* actually "travel" down the promotion path.
*/
interface PromotionFunction {
/**
* Promotes the given [number] into another type.
* @param number the number to promote from.
* @return the new number with the same value.
*/
fun promote(number: NumberInterface): NumberInterface
}

View File

@ -6,7 +6,6 @@ import org.nwapw.abacus.number.NumberInterface
import org.nwapw.abacus.plugin.NumberImplementation
import org.nwapw.abacus.plugin.PluginListener
import org.nwapw.abacus.plugin.PluginManager
import java.util.function.Function
/**
* A class that handles promotions based on priority and the
@ -32,7 +31,11 @@ class PromotionManager(val abacus: Abacus) : PluginListener {
val fromName = abacus.pluginManager.interfaceImplementationNameFor(from.implementation)
val toName = abacus.pluginManager.interfaceImplementationNameFor(to.implementation)
if(fromName == toName) return listOf(Function { it })
if(fromName == toName) return listOf(object : PromotionFunction {
override fun promote(number: NumberInterface): NumberInterface {
return number
}
})
if(from.promotionPaths.containsKey(toName))
return listOf(from.promotionPaths[toName] ?: return null)

View File

@ -5,19 +5,17 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.nwapw.abacus.Abacus;
import org.nwapw.abacus.config.Configuration;
import org.nwapw.abacus.number.promotion.PromotionFunction;
import org.nwapw.abacus.number.standard.NaiveNumber;
import org.nwapw.abacus.number.NumberInterface;
import org.nwapw.abacus.number.range.NumberRange;
import org.nwapw.abacus.number.standard.PreciseNumber;
import org.nwapw.abacus.plugin.standard.StandardPlugin;
import java.util.function.Function;
public class RangeTests {
private static Abacus abacus = new Abacus(new Configuration( "precise", new String[]{}));
private static Function<NumberInterface, NumberInterface> naivePromotion = i -> new NaiveNumber((i.toString()));
private static Function<NumberInterface, NumberInterface> precisePromotion = i -> new PreciseNumber((i.toString()));
private static PromotionFunction naivePromotion = i -> new NaiveNumber((i.toString()));
private static PromotionFunction precisePromotion = i -> new PreciseNumber((i.toString()));
@BeforeClass
public static void prepareTests() {

View File

@ -16,7 +16,6 @@ import org.nwapw.abacus.exception.AbacusException;
import org.nwapw.abacus.function.Documentation;
import org.nwapw.abacus.function.DocumentationType;
import org.nwapw.abacus.number.*;
import org.nwapw.abacus.plugin.ClassFinder;
import org.nwapw.abacus.plugin.PluginListener;
import org.nwapw.abacus.plugin.PluginManager;
import org.nwapw.abacus.plugin.standard.StandardPlugin;

View File

@ -1,4 +1,4 @@
package org.nwapw.abacus.plugin;
package org.nwapw.abacus.fx;
import java.io.File;
import java.io.IOException;