From 9862df9e6339fd51ce556ff5236538f0898029ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Pl=C3=BCmicke?= Date: Thu, 8 Mar 2018 01:12:17 +0100 Subject: [PATCH] modified: ../../src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java modified: ../../src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java Minimum funktion soweit --- .../typeinference/unify/TypeUnifyTask.java | 9 +++++++-- .../unify/model/OrderingUnifyPair.java | 19 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java index 3a0dab30..9ebea45e 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java +++ b/src/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java @@ -312,13 +312,18 @@ public class TypeUnifyTask extends RecursiveTask>> { ArrayList> nextSetasList = new ArrayList<>(nextSet); Set> result = new HashSet<>(); int i = 0; - Set a_next = oup.min(nextSetasList.iterator()); + Set a_next; + if (nextSetasList.size()>1) + a_next = oup.min(nextSetasList.iterator()); + else a_next = nextSetasList.iterator().next(); while (nextSetasList.size() != 0) { Set a = a_next; //writeLog("nextSet: " + nextSetasList.toString()+ "\n"); nextSetasList.remove(a); if (nextSetasList.size() > 0) - a_next = oup.min(nextSetasList.iterator()); + if (nextSetasList.size()>1) + a_next = oup.min(nextSetasList.iterator()); + else a_next = nextSetasList.iterator().next(); //PL 2018-03-01 //TODO: 1. Maximum und Minimum unterscheiden //TODO: 2. compare noch für alle Elmemente die nicht X =. ty sind erweitern diff --git a/src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java b/src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java index be561934..199e7c6a 100644 --- a/src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java +++ b/src/de/dhbwstuttgart/typeinference/unify/model/OrderingUnifyPair.java @@ -26,8 +26,16 @@ public class OrderingUnifyPair extends Ordering> { public OrderingUnifyPair(IFiniteClosure fc) { this.fc = fc; } - - public int compare (UnifyPair left, UnifyPair right) { + public int compareEq (UnifyPair left, UnifyPair right) { + if (right.getRhsType() instanceof ExtendsType || right.getRhsType() instanceof SuperType) { + return fc.compare(left.getRhsType(), right.getRhsType(), PairOperator.SMALLERDOTWC); + } + else { + return fc.compare(left.getRhsType(), right.getRhsType(), PairOperator.SMALLERDOT); + } + } + /* + public int compareEq (UnifyPair left, UnifyPair right) { if (left == null || right == null) System.out.println("Fehler"); if (left.getLhsType() instanceof PlaceholderType) { @@ -37,6 +45,7 @@ public class OrderingUnifyPair extends Ordering> { return fc.compare(left.getLhsType(), right.getLhsType(), left.getPairOp()); } } + */ public Pair> compare (UnifyType left, UnifyType right) { UnifyPair up = new UnifyPair(left, right, PairOperator.SMALLERDOT); @@ -108,7 +117,7 @@ public class OrderingUnifyPair extends Ordering> { BinaryOperator> combiner = (x,y) -> { x.putAll(y); return x;}; HashMap hm = rseq.reduce(new HashMap(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner); lseq = lseq.filter(x -> !(hm.get(x.getLhsType()) == null)); - Optional si = lseq.map(x -> compare(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } ); + Optional si = lseq.map(x -> compareEq(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } ); if (!si.isPresent()) return 0; else return si.get(); } @@ -132,13 +141,13 @@ public class OrderingUnifyPair extends Ordering> { if (leftlewc.iterator().next().getLhsType() instanceof PlaceholderType) { hm = rsleuni.stream().reduce(new HashMap(), (x, y)-> { x.put(y.getLhsType(),y); return x; }, combiner); Stream lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getLhsType()) == null)); - si = lslewcstr.map(x -> compare(x, hm.get(x.getLhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } ); + 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(), (x, y)-> { x.put(y.getRhsType(),y); return x; }, combiner); Stream lslewcstr = lsleuni.stream().filter(x -> !(hm.get(x.getRhsType()) == null)); - si = lslewcstr.map(x -> compare(x, hm.get(x.getRhsType()))).reduce((x,y)-> { if (x == y) return x; else return 0; } ); + 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();