TypeInsert Fehler beheben

This commit is contained in:
JanUlrich 2017-08-23 01:43:20 +02:00
parent 1023ed8557
commit bbc61c67a9
2 changed files with 33 additions and 19 deletions

View File

@ -0,0 +1,26 @@
package de.dhbwstuttgart.typedeployment;
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.constraints.Pair;
public class GenericInsertPair {
public TypePlaceholder TA1;
public TypePlaceholder TA2;
public GenericInsertPair(TypePlaceholder additionalTPH, TypePlaceholder superType) {
TA1 = additionalTPH;
TA2 = superType;
}
public GenericInsertPair(Pair pair) {
TA1 = (TypePlaceholder) pair.TA1;
TA2 = (TypePlaceholder) pair.TA2;
}
public boolean contains(TypePlaceholder additionalTPH) {
if(TA1.equals(additionalTPH))return true;
if(TA2.equals(additionalTPH))return true;
return false;
}
}

View File

@ -65,14 +65,14 @@ public class TypeInsertFactory {
} }
//Alle Bounds finden: //Alle Bounds finden:
Set<Pair> newGenerics = new HashSet<>(); Set<GenericInsertPair> newGenerics = new HashSet<>();
boolean added = true; boolean added = true;
while(added){ while(added){
//Fügt alle TPHs an, welche mit den additionalInserts in Verbindung stehen. //Fügt alle TPHs an, welche mit den additionalInserts in Verbindung stehen.
added = false; added = false;
for(Pair pair : pairs){ for(Pair pair : pairs){
if (additionalInserts.contains(pair.TA1) || additionalInserts.contains(pair.TA2)) { if (additionalInserts.contains(pair.TA1) || additionalInserts.contains(pair.TA2)) {
newGenerics.add(pair); newGenerics.add(new GenericInsertPair(pair));
added |= additionalInserts.add((TypePlaceholder) pair.TA1); added |= additionalInserts.add((TypePlaceholder) pair.TA1);
added |= additionalInserts.add((TypePlaceholder) pair.TA2); added |= additionalInserts.add((TypePlaceholder) pair.TA2);
} }
@ -82,27 +82,15 @@ public class TypeInsertFactory {
//Fügt noch die Additional Inserts an, welche mit nichts in Verbindung stehen: //Fügt noch die Additional Inserts an, welche mit nichts in Verbindung stehen:
for(TypePlaceholder additionalTPH : additionalInserts){ for(TypePlaceholder additionalTPH : additionalInserts){
boolean inside = false; boolean inside = false;
for(Pair p :newGenerics){ for(GenericInsertPair p :newGenerics){
if(p.TA2.equals(additionalTPH) || p.TA1.equals(additionalTPH)){ if(p.contains(additionalTPH)){
inside = true; inside = true;
break; break;
} }
} }
if(! inside)newGenerics.add(new Pair(additionalTPH, additionalTPH)); if(! inside)newGenerics.add(new GenericInsertPair(additionalTPH, null));
} }
/*
//Alle TPHs die man noch als Generics anfügen muss einsetzen:
additionalInserts.clear();
for(Pair subtypings : newGenerics){
if(additionalInserts.contains(subtypings.TA1)){
additionalInserts.remove(subtypings.TA1);
}
}
for(TypePlaceholder tph : additionalInserts){
newGenerics.add(new Pair(tph, null));
}
*/
ret.add(createGenericInsert(newGenerics, cl, m)); ret.add(createGenericInsert(newGenerics, cl, m));
//return ret; //return ret;
@ -133,7 +121,7 @@ public class TypeInsertFactory {
return insert; return insert;
} }
private static TypeInsertPoint createGenericInsert(Set<Pair> toInsert, ClassOrInterface cl, Method m){ private static TypeInsertPoint createGenericInsert(Set<GenericInsertPair> toInsert, ClassOrInterface cl, Method m){
//Momentan wird Methode ignoriert. Parameter werden immer als Klassenparameter angefügt: //Momentan wird Methode ignoriert. Parameter werden immer als Klassenparameter angefügt:
//Offset zum Einstzen bestimmen: //Offset zum Einstzen bestimmen:
Token offset; Token offset;
@ -151,7 +139,7 @@ public class TypeInsertFactory {
//Alle einzusetzenden Generics und deren Bounds bestimmen: //Alle einzusetzenden Generics und deren Bounds bestimmen:
HashMap<TypePlaceholder, HashSet<TypePlaceholder>> genericsAndBounds = new HashMap<>(); HashMap<TypePlaceholder, HashSet<TypePlaceholder>> genericsAndBounds = new HashMap<>();
for(Pair p : toInsert){ for(GenericInsertPair p : toInsert){
if(!genericsAndBounds.containsKey(p.TA1)){ if(!genericsAndBounds.containsKey(p.TA1)){
genericsAndBounds.put((TypePlaceholder) p.TA1, new HashSet<>()); genericsAndBounds.put((TypePlaceholder) p.TA1, new HashSet<>());
} }