From a654f55deb74d75c22fe5dbdd5e5bb265da85342 Mon Sep 17 00:00:00 2001 From: Daniel Holle Date: Thu, 25 Jul 2024 17:05:27 +0200 Subject: [PATCH] Fix yTest --- .../dhbwstuttgart/bytecode/FunNGenerator.java | 24 +++++++++++++++---- .../syntaxtree/factory/ASTFactory.java | 2 ++ .../target/generate/GenerateGenerics.java | 12 ++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java b/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java index 9b6bd15f..ae039ade 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/FunNGenerator.java @@ -1,11 +1,13 @@ package de.dhbwstuttgart.bytecode; +import de.dhbwstuttgart.syntaxtree.statement.Break; import de.dhbwstuttgart.target.tree.TargetGeneric; import de.dhbwstuttgart.target.tree.type.*; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; +import java.sql.Array; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -35,19 +37,33 @@ public class FunNGenerator { public List parameters = new ArrayList<>(); final String descriptor; public final List inParams; + public final List realParams; public GenericParameters(List params, int numReturns) { - this.inParams = params; + this.realParams = params; + this.inParams = flattenTypeParams(params); var type = new TargetRefType(FunNGenerator.getSuperClassName(params.size() - 1, numReturns), params); descriptor = applyDescriptor(type, this); } + private static List flattenTypeParams(List params) { + var res = new ArrayList(); + for (var param : params) { + if (param instanceof TargetSpecializedType tspec) { + res.addAll(flattenTypeParams(tspec.params())); + } else { + res.add(param); + } + } + return res; + } + public TargetType getReturnType() { - return FunNGenerator.getReturnType(inParams); + return FunNGenerator.getReturnType(realParams); } public List getArguments() { - return FunNGenerator.getArguments(inParams); + return FunNGenerator.getArguments(realParams); } } @@ -162,7 +178,7 @@ public class FunNGenerator { } public static String getSpecializedClassName(GenericParameters gep) { - return getSpecializedClassName(getArguments(gep.inParams), getReturnType(gep.inParams)); + return getSpecializedClassName(gep.getArguments(), gep.getReturnType()); } public static String getSpecializedClassName(List argumentTypes, TargetType returnType) { diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java index 63767c4d..520097d8 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/factory/ASTFactory.java @@ -34,6 +34,7 @@ public class ASTFactory { private static final HashMap cache = new HashMap<>(); public static ClassOrInterface createClass(java.lang.Class jreClass) { + System.out.println(jreClass); if (cache.containsKey(jreClass)) return cache.get(jreClass); @@ -173,6 +174,7 @@ public class ASTFactory { superClass = (RefType) createType(java.lang.Object.class); } List implementedInterfaces = new ArrayList<>(); + System.out.println(jreClass); for (Type jreInterface : jreClass.getGenericInterfaces()) { implementedInterfaces.add((RefType) createType(jreInterface)); } diff --git a/src/main/java/de/dhbwstuttgart/target/generate/GenerateGenerics.java b/src/main/java/de/dhbwstuttgart/target/generate/GenerateGenerics.java index 403ccdb8..a0d7c5c7 100644 --- a/src/main/java/de/dhbwstuttgart/target/generate/GenerateGenerics.java +++ b/src/main/java/de/dhbwstuttgart/target/generate/GenerateGenerics.java @@ -652,14 +652,12 @@ public abstract class GenerateGenerics { } void normalize(Set result, Set classGenerics, Set usedTphs) { - outer: - for (var tph : usedTphs) { - for (var p1 : new HashSet<>(result)) { - if (p1 instanceof PairLT ptph && ptph.left.equals(ptph.right)) - result.remove(p1); // TODO This is a bit strange - if (p1.left.equals(tph)) continue outer; - } + for (var p1 : new HashSet<>(result)) { + if (p1 instanceof PairLT ptph && ptph.left.resolve().equals(ptph.right.resolve())) + result.remove(p1); // TODO This is a bit strange + } + for (var tph : usedTphs) { if (classGenerics == null || classGenerics.stream().noneMatch((pair) -> pair.left.equals(tph))) addToPairs(result, new PairEQ(tph, ASTToTargetAST.OBJECT)); }