diff --git a/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java b/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java index 270a0bb5..ee3b6c27 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java @@ -3,11 +3,13 @@ package de.dhbwstuttgart.bytecode; import de.dhbwstuttgart.target.tree.TargetGeneric; import de.dhbwstuttgart.target.tree.type.TargetGenericType; import de.dhbwstuttgart.target.tree.type.TargetRefType; +import de.dhbwstuttgart.target.tree.type.TargetSpecializedType; import de.dhbwstuttgart.target.tree.type.TargetType; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -71,14 +73,15 @@ public class FunNGenerator { boolean containsGeneric = false; String genericSignature = "<"; + var generics = new HashSet(); for (TargetType typeArgument : parameters) { - //ToDo Etienne: Refactor - if (typeArgument instanceof TargetGenericType generic){ - //if(genericSignature.contains(generic.name())) continue; - genericSignature += String.format("%s:%s", generic.name(), objectSignature); - containsGeneric = true; - } + collectGenericTypeArguments(generics, typeArgument); } + for (var generic : generics) { + genericSignature += String.format("%s:%s", generic.name(), objectSignature); + containsGeneric = true; + } + genericSignature += ">"; if (containsGeneric) funNClassSignature.insert(0, genericSignature); @@ -88,6 +91,15 @@ public class FunNGenerator { return classWriter.toByteArray(); } + private static void collectGenericTypeArguments(HashSet generics, TargetType typeArgument) { + if (typeArgument instanceof TargetSpecializedType specializedType) { + for (var arg : specializedType.params()) + collectGenericTypeArguments(generics, arg); + } else if (typeArgument instanceof TargetGenericType genericType) { + generics.add(genericType); + } + } + public static String getSpecializedClassName(List argumentTypes, TargetType returnType) { return String.format("Fun%d$$%s%s", argumentTypes.size(),