modified: src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java

weitere Fälle in die Ordnung eingebaut
This commit is contained in:
Martin Plümicke 2018-03-04 22:58:31 +01:00
parent cba489f279
commit 831bf1fe17

View File

@ -29,8 +29,13 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
public int compare (UnifyPair left, UnifyPair right) { public int compare (UnifyPair left, UnifyPair right) {
if (left == null || right == null) if (left == null || right == null)
System.out.println("Fehler"); System.out.println("Fehler");
return fc.compare(left.getRhsType(), right.getRhsType()); if (left.getLhsType() instanceof PlaceholderType) {
return fc.compare(left.getRhsType(), right.getRhsType());
}
else {
return fc.compare(left.getLhsType(), right.getLhsType());
}
} }
public Pair<Integer,Set<UnifyPair>> compare (UnifyType left, UnifyType right) { public Pair<Integer,Set<UnifyPair>> compare (UnifyType left, UnifyType right) {
@ -54,9 +59,21 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
} }
public int compare (Set<UnifyPair> left, Set<UnifyPair> right) { public int compare (Set<UnifyPair> left, Set<UnifyPair> right) {
if (!true) { Set<UnifyPair> lefteq = left.stream()
Stream<UnifyPair> lseq = left.stream().filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT)); .filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
Stream<UnifyPair> rseq = right.stream().filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT)); .collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> righteq = right.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> leftle = left.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.SMALLERDOTWC))
.collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> rightle = right.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.SMALLERDOTWC))
.collect(Collectors.toCollection(HashSet::new));
if (lefteq.size() > 1) {
Stream<UnifyPair> lseq = lefteq.stream(); //left.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT));
Stream<UnifyPair> rseq = righteq.stream(); //right.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT));
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;}; BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
HashMap<UnifyType,UnifyPair> hm = rseq.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner); HashMap<UnifyType,UnifyPair> hm = rseq.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
lseq = lseq.filter(x -> !(hm.get(x.getLhsType()) == null)); lseq = lseq.filter(x -> !(hm.get(x.getLhsType()) == null));
@ -64,34 +81,44 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
if (!si.isPresent()) return 0; if (!si.isPresent()) return 0;
else return si.get(); else return si.get();
} }
else { if (lefteq.size() == 1 && righteq.size() == 1) {
//TODO 2018-03-02: hier muessen mehree =. eingefuegt werden und alle weiteren Faelle pruefen //TODO 2018-03-02: hier muessen mehree =. eingefuegt werden und alle weiteren Faelle pruefen
Optional<UnifyPair> lseq = left.stream() UnifyPair lseq = lefteq.iterator().next();
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT)).findFirst(); UnifyPair rseq = righteq.iterator().next();
Optional<UnifyPair> rseq = right.stream() /*Set<UnifyPair> lsle = left.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.EQUALSDOT)).findFirst();
Set<UnifyPair> lsle = left.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.SMALLERDOTWC)) .filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.SMALLERDOTWC))
.collect(Collectors.toCollection(HashSet::new)); .collect(Collectors.toCollection(HashSet::new));
Set<UnifyPair> rsle = right.stream() Set<UnifyPair> rsle = right.stream()
.filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.SMALLERDOTWC)) .filter(x -> (x.getLhsType() instanceof PlaceholderType && x.getPairOp() == PairOperator.SMALLERDOTWC))
.collect(Collectors.toCollection(HashSet::new)); .collect(Collectors.toCollection(HashSet::new));
Pair<Integer, Set<UnifyPair>> int_Unifier = compare(lseq.get().getRhsType(), rseq.get().getRhsType()); */
Pair<Integer, Set<UnifyPair>> int_Unifier = compare(lseq.getRhsType(), rseq.getRhsType());
Unifier uni = new Unifier(); Unifier uni = new Unifier();
int_Unifier.getValue().stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType())); int_Unifier.getValue().stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
if (lsle.size() == 0) return int_Unifier.getKey(); if (leftle.size() == 0) return int_Unifier.getKey();
else { else {
Stream <UnifyPair> lslestr = lsle.stream().map(uni::apply); Stream <UnifyPair> lslestr = leftle.stream().map(uni::apply);
Stream <UnifyPair> rslestr = rsle.stream().map(uni::apply); Stream <UnifyPair> rslestr = rightle.stream().map(uni::apply);
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;}; BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
HashMap<UnifyType,UnifyPair> hm = rslestr.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
lseq = lseq.filter(x -> !(hm.get(x.getLhsType()) == null)); HashMap<UnifyType,UnifyPair> hm;
Optional<Integer> si = lslestr.map(x -> compare(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } ); Optional<Integer> si;
if (leftle.iterator().next().getLhsType() instanceof PlaceholderType) {
hm = rslestr.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
lslestr = lslestr.filter(x -> !(hm.get(x.getLhsType()) == null));
si = lslestr.map(x -> compare(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } );
}
else {
hm = rslestr.reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getRhsType(),y); return x; }, combiner);
rslestr = rslestr.filter(x -> !(hm.get(x.getRhsType()) == null));
si = rslestr.map(x -> compare(x, hm.get(x.getRhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } );
}
if (!si.isPresent()) return 0; if (!si.isPresent()) return 0;
else return si.get(); else return si.get();
} }
} }
return 0;
} }
} }