From 2c25e56a764ef672729da2d1121cb5bb96885431 Mon Sep 17 00:00:00 2001 From: JanUlrich Date: Tue, 20 Jun 2017 14:50:27 +0200 Subject: [PATCH] Einsetzen von Generics korrigieren --- .../typedeployment/TypeInsertFactory.java | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java b/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java index e6ae0229..b989e0b5 100644 --- a/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java +++ b/src/de/dhbwstuttgart/typedeployment/TypeInsertFactory.java @@ -96,9 +96,8 @@ public class TypeInsertFactory { for(TypePlaceholder tph : additionalInserts){ newGenerics.add(new Pair(tph, null)); } - for(Pair subtyping : newGenerics){ - ret.add(createGenericInsert((TypePlaceholder)subtyping.TA1, (TypePlaceholder)subtyping.TA2, cl, m)); - } + + ret.add(createGenericInsert(newGenerics, cl, m)); return ret; } @@ -123,21 +122,51 @@ public class TypeInsertFactory { return insert; } - private static TypeInsertPoint createGenericInsert(TypePlaceholder tph, TypePlaceholder bound, ClassOrInterface cl, Method m){ + private static TypeInsertPoint createGenericInsert(Set toInsert, ClassOrInterface cl, Method m){ //Momentan wird Methode ignoriert. Parameter werden immer als Klassenparameter angefügt: + //Offset zum Einstzen bestimmen: Token offset; String insert = ""; String end =" "; if(cl.getGenerics().iterator().hasNext()){ offset = cl.getGenerics().iterator().next().getOffset(); + insert+=","; }else{ offset = cl.getGenerics().getOffset(); insert += "<"; end = ">"; } - insert += tph.getName(); - if(bound != null){ - insert += " extends " + bound.getName(); + + //Alle einzusetzenden Generics und deren Bounds bestimmen: + HashMap> genericsAndBounds = new HashMap<>(); + for(Pair p : toInsert){ + if(!genericsAndBounds.containsKey(p.TA1)){ + genericsAndBounds.put((TypePlaceholder) p.TA1, new HashSet<>()); + } + if(p.TA2 != null){ + genericsAndBounds.get(p.TA1).add((TypePlaceholder) p.TA2); + if(!genericsAndBounds.containsKey(p.TA2)){ + genericsAndBounds.put((TypePlaceholder) p.TA2, new HashSet<>()); + } + } + } + + //String zum Einsetzen (Generics mit bounds) generieren: + Iterator it = genericsAndBounds.keySet().iterator(); + while(it.hasNext()){ + TypePlaceholder tph = it.next(); + insert += tph.getName(); + Set bounds = genericsAndBounds.get(tph); + if(bounds.size() > 0){ + insert += " extends "; + Iterator boundIt = bounds.iterator(); + while(boundIt.hasNext()){ + TypePlaceholder bound = boundIt.next(); + insert += bound.getName(); + if(boundIt.hasNext())insert += " & "; + } + } + if(it.hasNext())insert+=","; } return new TypeInsertPoint(offset, insert + end); }