forked from JavaTX/JavaCompilerCore
adaptExt + tests
This commit is contained in:
parent
e447e1cd46
commit
480c7dca61
@ -348,8 +348,46 @@ public class RuleSet implements IRuleSet{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<MPair> adaptExt(MPair pair) {
|
public Optional<MPair> adaptExt(MPair pair) {
|
||||||
// TODO Auto-generated method stub
|
if(pair.getPairOp() != PairOperator.SMALLERDOTWC)
|
||||||
return null;
|
return Optional.empty();
|
||||||
|
|
||||||
|
Type lhsType = pair.getLhsType();
|
||||||
|
if(!(lhsType instanceof SimpleType) && !(lhsType instanceof ExtendsType))
|
||||||
|
return Optional.empty();
|
||||||
|
|
||||||
|
Type rhsType = pair.getRhsType();
|
||||||
|
if(!(rhsType instanceof ExtendsType))
|
||||||
|
return Optional.empty();
|
||||||
|
|
||||||
|
if(lhsType.getTypeParams().size() == 0 || rhsType.getTypeParams().size() == 0)
|
||||||
|
return Optional.empty();
|
||||||
|
|
||||||
|
Type lhsFromFc;
|
||||||
|
if(lhsType instanceof SimpleType)
|
||||||
|
lhsFromFc = finiteClosure.getType(lhsType.getName());
|
||||||
|
else
|
||||||
|
lhsFromFc = new ExtendsType(finiteClosure.getType(((ExtendsType) lhsType).getExtendedType().getName()));
|
||||||
|
|
||||||
|
if(lhsFromFc == null)
|
||||||
|
return Optional.empty();
|
||||||
|
|
||||||
|
Set<Type> grArg = finiteClosure.grArg(lhsFromFc);
|
||||||
|
|
||||||
|
Optional<Type> opt = grArg.stream().filter(x -> x.getName().equals(rhsType.getName())).findAny();
|
||||||
|
|
||||||
|
if(!opt.isPresent())
|
||||||
|
return Optional.empty();
|
||||||
|
|
||||||
|
Type newLhs = ((ExtendsType) opt.get()).getExtendedType();
|
||||||
|
|
||||||
|
TypeParams lhsTypeParams = lhsType.getTypeParams();
|
||||||
|
TypeParams lhsFromFcTypeParams = lhsFromFc.getTypeParams();
|
||||||
|
|
||||||
|
Unifier unif = new Unifier(lhsFromFcTypeParams.get(0), lhsTypeParams.get(0));
|
||||||
|
for(int i = 1; i < lhsTypeParams.size(); i++)
|
||||||
|
unif.andThen(new Unifier(lhsFromFcTypeParams.get(i), lhsTypeParams.get(i)));
|
||||||
|
|
||||||
|
return Optional.of(new MPair(newLhs.apply(unif), rhsType, PairOperator.SMALLERDOTWC));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -530,15 +530,26 @@ public class RuleSetTest {
|
|||||||
|
|
||||||
IRuleSet rules = new RuleSet(fcb.getFiniteClosure());
|
IRuleSet rules = new RuleSet(fcb.getFiniteClosure());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Positive Tests
|
||||||
|
*/
|
||||||
|
|
||||||
SimpleType c1 = tf.getSimpleType("Type1", "String", "Double");
|
SimpleType c1 = tf.getSimpleType("Type1", "String", "Double");
|
||||||
SimpleType c2 = tf.getSimpleType("Type2", "Object");
|
SimpleType c2 = tf.getSimpleType("Type2", "Object");
|
||||||
SimpleType c3 = tf.getSimpleType("Type3", "Object", "Number");
|
SimpleType c3 = tf.getSimpleType("Type3", "Object", "Number");
|
||||||
|
|
||||||
MPair pair1 = new MPair(c1, c2, PairOperator.SMALLERDOT);
|
MPair pair1 = new MPair(c1, c2, PairOperator.SMALLERDOT);
|
||||||
MPair pair2 = new MPair(c1, c3, PairOperator.SMALLERDOT);
|
MPair pair2 = new MPair(c2, c3, PairOperator.SMALLERDOT);
|
||||||
|
MPair pair3 = new MPair(c1, c3, PairOperator.SMALLERDOT);
|
||||||
|
|
||||||
System.out.println("------ Adapt ------");
|
System.out.println("------ Adapt ------");
|
||||||
System.out.println(rules.adapt(pair1));
|
System.out.println(rules.adapt(pair1));
|
||||||
System.out.println(rules.adapt(pair2));
|
System.out.println(rules.adapt(pair2));
|
||||||
|
System.out.println(rules.adapt(pair3));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Negative Tests
|
||||||
|
*/
|
||||||
|
|
||||||
MPair noAdapt1 = new MPair(c2, c1, PairOperator.SMALLERDOT);
|
MPair noAdapt1 = new MPair(c2, c1, PairOperator.SMALLERDOT);
|
||||||
MPair noAdapt2 = new MPair(c1, c1, PairOperator.SMALLERDOT);
|
MPair noAdapt2 = new MPair(c1, c1, PairOperator.SMALLERDOT);
|
||||||
@ -551,7 +562,61 @@ public class RuleSetTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAdaptExt() {
|
public void testAdaptExt() {
|
||||||
|
TypeFactory tf = new TypeFactory();
|
||||||
|
FiniteClosureBuilder fcb = new FiniteClosureBuilder();
|
||||||
|
|
||||||
|
SimpleType t1 = tf.getSimpleType("Type1", "T", "U");
|
||||||
|
SimpleType t2 = tf.getSimpleType("Type2", "T");
|
||||||
|
SimpleType t3 = tf.getSimpleType("Type3", tf.getPlaceholderType("T"), tf.getSimpleType("Integer"));
|
||||||
|
|
||||||
|
fcb.add(t1, t2);
|
||||||
|
fcb.add(t2, t3);
|
||||||
|
|
||||||
|
IRuleSet rules = new RuleSet(fcb.getFiniteClosure());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Positive Tests
|
||||||
|
*/
|
||||||
|
|
||||||
|
SimpleType c1 = tf.getSimpleType("Type1", "String", "Double");
|
||||||
|
SimpleType c2 = tf.getSimpleType("Type2", "Object");
|
||||||
|
SimpleType c3 = tf.getSimpleType("Type3", "Object", "Number");
|
||||||
|
ExtendsType extc1 = new ExtendsType(c1);
|
||||||
|
ExtendsType extc2 = new ExtendsType(c2);
|
||||||
|
ExtendsType extc3 = new ExtendsType(c3);
|
||||||
|
|
||||||
|
MPair pair1 = new MPair(c1, extc2, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair pair2 = new MPair(c2, extc3, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair pair3 = new MPair(c1, extc3, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair pair4 = new MPair(extc1, extc2, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair pair5 = new MPair(extc2, extc3, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair pair6 = new MPair(extc1, extc3, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair pair7 = new MPair(extc1, extc1, PairOperator.SMALLERDOTWC);
|
||||||
|
|
||||||
|
System.out.println("------ AdaptExt ------");
|
||||||
|
System.out.println(rules.adaptExt(pair1));
|
||||||
|
System.out.println(rules.adaptExt(pair2));
|
||||||
|
System.out.println(rules.adaptExt(pair3));
|
||||||
|
System.out.println(rules.adaptExt(pair4));
|
||||||
|
System.out.println(rules.adaptExt(pair5));
|
||||||
|
System.out.println(rules.adaptExt(pair6));
|
||||||
|
System.out.println(rules.adaptExt(pair7));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Negative Tests
|
||||||
|
*/
|
||||||
|
|
||||||
|
MPair noAdapt1 = new MPair(extc2, extc1, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair noAdapt2 = new MPair(extc1, c2, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair noAdapt3 = new MPair(tf.getSuperType(c1), extc2, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair noAdapt4 = new MPair(extc3, extc1, PairOperator.SMALLERDOTWC);
|
||||||
|
MPair noAdapt5 = new MPair(c1, extc2, PairOperator.SMALLERDOT);
|
||||||
|
|
||||||
|
Assert.assertFalse(rules.adaptExt(noAdapt1).isPresent());
|
||||||
|
Assert.assertFalse(rules.adaptExt(noAdapt2).isPresent());
|
||||||
|
Assert.assertFalse(rules.adaptExt(noAdapt3).isPresent());
|
||||||
|
Assert.assertFalse(rules.adaptExt(noAdapt4).isPresent());
|
||||||
|
Assert.assertFalse(rules.adaptExt(noAdapt5).isPresent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
Reference in New Issue
Block a user