Equalize type variables in covariant and contravariant position
This commit is contained in:
parent
de417d3ee6
commit
699155e21a
@ -270,10 +270,29 @@ public class ASTToTargetAST {
|
|||||||
computedGenericsOfClasses.put(classOrInterface, result);
|
computedGenericsOfClasses.put(classOrInterface, result);
|
||||||
eliminateCyclesAndInfima(result);
|
eliminateCyclesAndInfima(result);
|
||||||
eliminateInnerTypeVariables(classOrInterface, result);
|
eliminateInnerTypeVariables(classOrInterface, result);
|
||||||
|
equalizeTypeVariables(result);
|
||||||
|
|
||||||
System.out.println("Class " + classOrInterface.getClassName().getClassName() + ": " + result);
|
System.out.println("Class " + classOrInterface.getClassName().getClassName() + ": " + result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void equalizeTypeVariables(Set<ResultPair<?, ?>> input) {
|
||||||
|
for (var pair : new HashSet<>(input)) {
|
||||||
|
if (pair instanceof PairTPHsmallerTPH ptph) {
|
||||||
|
if (ptph.left.getVariance() == 1 && ptph.right.getVariance() == -1) {
|
||||||
|
equality.put(ptph.left, ptph.right);
|
||||||
|
input.remove(ptph);
|
||||||
|
for (var pair2 : new HashSet<>(input)) {
|
||||||
|
if (pair2 instanceof PairTPHsmallerTPH ptph2 && ptph2.right.equals(ptph.left)) {
|
||||||
|
input.remove(pair2);
|
||||||
|
input.add(new PairTPHsmallerTPH(ptph2.left, ptph.right));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void findTphs(RefTypeOrTPHOrWildcardOrGeneric type, Set<TypePlaceholder> tphs) {
|
void findTphs(RefTypeOrTPHOrWildcardOrGeneric type, Set<TypePlaceholder> tphs) {
|
||||||
if (type instanceof RefType refType) {
|
if (type instanceof RefType refType) {
|
||||||
refType.getParaList().forEach(t -> findTphs(t, tphs));
|
refType.getParaList().forEach(t -> findTphs(t, tphs));
|
||||||
|
Loading…
Reference in New Issue
Block a user