Recursively collect generics for FunN

This commit is contained in:
Daniel Holle 2023-05-15 16:52:20 +02:00
parent 9d9a1f6614
commit 66944cf3c1

View File

@ -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<TargetGenericType>();
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<TargetGenericType> 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<TargetType> argumentTypes, TargetType returnType) {
return String.format("Fun%d$$%s%s",
argumentTypes.size(),