forked from JavaTX/JavaCompilerCore
modified: src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java
compare(Matrix, Vector<gen_ab>, ? extends Vector<? extends Integer>> <.? gen_ab eingefuegt.
This commit is contained in:
parent
0315a1f144
commit
95943b1627
@ -123,36 +123,72 @@ public class OrderingUnifyPair extends Ordering<Set<UnifyPair>> {
|
|||||||
}
|
}
|
||||||
//Fall 1 und 4
|
//Fall 1 und 4
|
||||||
if (lefteq.size() == 1 && righteq.size() == 1 && (leftlewc.size() > 0 || rightlewc.size() > 0)) {
|
if (lefteq.size() == 1 && righteq.size() == 1 && (leftlewc.size() > 0 || rightlewc.size() > 0)) {
|
||||||
|
if (lefteq.iterator().next().getLhsType().getName().equals("A"))
|
||||||
|
System.out.print("");
|
||||||
UnifyPair lseq = lefteq.iterator().next();
|
UnifyPair lseq = lefteq.iterator().next();
|
||||||
UnifyPair rseq = righteq.iterator().next();
|
UnifyPair rseq = righteq.iterator().next();
|
||||||
Pair<Integer, Set<UnifyPair>> int_Unifier = compare(lseq.getRhsType(), rseq.getRhsType());
|
if (lseq.getRhsType().getName().equals("Object")) {
|
||||||
Unifier uni = new Unifier();
|
if (rseq.getRhsType().getName().equals("Object")) return 0;
|
||||||
int_Unifier.getValue().stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
else return 1;
|
||||||
if (!lseq.getRhsType().getName().equals(rseq.getRhsType().getName())
|
|
||||||
|| leftlewc.size() == 0 || rightlewc.size() == 0) return int_Unifier.getKey();
|
|
||||||
else {
|
|
||||||
Set <UnifyPair> lsleuni = leftlewc.stream().map(uni::apply).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
Set <UnifyPair> rsleuni = rightlewc.stream().map(uni::apply).collect(Collectors.toCollection(HashSet::new));
|
|
||||||
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
|
|
||||||
|
|
||||||
HashMap<UnifyType,UnifyPair> hm;
|
|
||||||
Optional<Integer> si;
|
|
||||||
//1. Fall
|
|
||||||
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
|
||||||
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
|
|
||||||
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getLhsType()) == null));
|
|
||||||
si = lslewcstr.map(x -> fc.compare(x.getRhsType(), hm.get(x.getLhsType()).getRhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
|
||||||
}
|
|
||||||
//4. Fall
|
|
||||||
else {
|
|
||||||
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getRhsType(),y); return x; }, combiner);
|
|
||||||
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getRhsType()) == null));
|
|
||||||
si = lslewcstr.map(x -> fc.compare(x.getLhsType(), hm.get(x.getRhsType()).getLhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
|
||||||
}
|
|
||||||
if (!si.isPresent()) return 0;
|
|
||||||
else return si.get();
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (rseq.getRhsType().getName().equals("Object")) return -1;
|
||||||
|
}
|
||||||
|
if (leftlewc.size() == rightlewc.size()) {
|
||||||
|
Pair<Integer, Set<UnifyPair>> int_Unifier = compare(lseq.getRhsType(), rseq.getRhsType());
|
||||||
|
Unifier uni = new Unifier();
|
||||||
|
int_Unifier.getValue().stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
|
if (!lseq.getRhsType().getName().equals(rseq.getRhsType().getName())
|
||||||
|
|| leftlewc.size() == 0 || rightlewc.size() == 0) return int_Unifier.getKey();
|
||||||
|
else {
|
||||||
|
Set <UnifyPair> lsleuni = leftlewc.stream().map(uni::apply).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
Set <UnifyPair> rsleuni = rightlewc.stream().map(uni::apply).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
BinaryOperator<HashMap<UnifyType,UnifyPair>> combiner = (x,y) -> { x.putAll(y); return x;};
|
||||||
|
|
||||||
|
HashMap<UnifyType,UnifyPair> hm;
|
||||||
|
Optional<Integer> si;
|
||||||
|
//1. Fall
|
||||||
|
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
||||||
|
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner);
|
||||||
|
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getLhsType()) == null));
|
||||||
|
si = lslewcstr.map(x -> fc.compare(x.getRhsType(), hm.get(x.getLhsType()).getRhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
||||||
|
}
|
||||||
|
//4. Fall
|
||||||
|
else {
|
||||||
|
hm = rsleuni.stream().reduce(new HashMap<UnifyType,UnifyPair>(), (x, y)-> { x.put(y.getRhsType(),y); return x; }, combiner);
|
||||||
|
Stream<UnifyPair> lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getRhsType()) == null));
|
||||||
|
si = lslewcstr.map(x -> fc.compare(x.getLhsType(), hm.get(x.getRhsType()).getLhsType(), PairOperator.SMALLERDOTWC)).reduce((x,y)-> { if (x == y) return x; else return 0; } );
|
||||||
|
}
|
||||||
|
if (!si.isPresent()) return 0;
|
||||||
|
else return si.get();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (leftlewc.size() > 0) {
|
||||||
|
Set<UnifyPair> subst;
|
||||||
|
if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
||||||
|
subst = leftlewc.stream().map(x -> new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
subst = leftlewc.stream().map(x -> new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
Unifier uni = new Unifier();
|
||||||
|
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
|
lseq = uni.apply(lseq);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Set<UnifyPair> subst;
|
||||||
|
if (rightlewc.iterator().next().getLhsType() instanceof PlaceholderType) {
|
||||||
|
subst = rightlewc.stream().map(x -> new UnifyPair(x.getLhsType(), x.getRhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
subst = rightlewc.stream().map(x -> new UnifyPair(x.getRhsType(), x.getLhsType(), PairOperator.EQUALSDOT)).collect(Collectors.toCollection(HashSet::new));
|
||||||
|
}
|
||||||
|
Unifier uni = new Unifier();
|
||||||
|
subst.stream().forEach(x -> uni.add((PlaceholderType) x.getLhsType(), x.getRhsType()));
|
||||||
|
rseq = uni.apply(rseq);
|
||||||
|
}
|
||||||
|
return compareEq(lseq, rseq);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user