diff --git a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java index 0bff4d5f..d0b6fda6 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java @@ -592,12 +592,26 @@ public class BytecodeGenMethod implements StatementVisitor { public void visit(LambdaExpression lambdaExpression) { this.lamCounter++; - //ToDo Etienne: umbauen String typeErasure = createDescriptorWithTypeErasure(lambdaExpression); - - ByteCodeForFunNGenerator.generateBCForFunN(lambdaExpression, typeErasure,path); - + //ByteCodeForFunNGenerator.generateBCForFunN(lambdaExpression, typeErasure,path); //old //ToDo Etienne: umbauen + FunN f; + //ToDo refactor with code for FunN underneath + ASTToIntermediate converter = new ASTToIntermediate(); + IntermediateInnerType returnType = (IntermediateInnerType) converter.convert(lambdaExpression.getReturnType()); + List arguments = lambdaExpression.params + .getFormalparalist() + .stream() + .map(FormalParameter::getType) + .map(resolver::resolve) + .map(converter::convert) + .filter(t -> t instanceof IntermediateInnerType) + .map(t -> (IntermediateInnerType) t) + .collect(Collectors.toList());//ToDo + f = new FunN(arguments, returnType); + FunN.writeClassFile(f.getSuperClassName(), f.getSuperBytecode(), path); + FunN.writeClassFile(f.getClassName(), f.getBytecode(), path); + //ToDo Etienne: umbauen end Lambda lam = new Lambda(lambdaExpression); String lamDesc = lam.accept(new DescriptorToString(resultSet)); // Call site, which, when invoked, returns an instance of the functional @@ -819,14 +833,12 @@ public class BytecodeGenMethod implements StatementVisitor { } else if(!helper.isInCurrPkg(clazz)){ if(clazz.contains(CONSTANTS.$$)) { mDesc = helper.getDescriptorOfApplyMethod(methCallType); + //helper.generateBCForFunN(mDesc); //old //ToDo Etienne: check if it works - //helper.generateBCForFunN(mDesc); FunN f; ASTToIntermediate converter = new ASTToIntermediate(); - IntermediateInnerType returnType = (IntermediateInnerType) converter.convert(resolver.resolve(methodCall.receiver.getType())); - if(methodCall - .arglist - .getArguments().size() > 0){ + //Fehler + IntermediateInnerType returnType = (IntermediateInnerType) converter.convert(resolver.resolve(methodCall.getType())); List arguments = methodCall .arglist .getArguments() @@ -837,10 +849,7 @@ public class BytecodeGenMethod implements StatementVisitor { .filter(t -> t instanceof IntermediateInnerType) .map(t -> (IntermediateInnerType) t) .collect(Collectors.toList());//ToDo - f = new FunN(arguments, returnType); - } else { - f = new FunN(returnType); - } + f = new FunN(arguments, returnType); FunN.writeClassFile(f.getSuperClassName(), f.getSuperBytecode(), path); FunN.writeClassFile(f.getClassName(), f.getBytecode(), path); diff --git a/src/main/java/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java b/src/main/java/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java index 613f672e..0b8d1346 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/descriptor/TypeToDescriptor.java @@ -14,7 +14,10 @@ public class TypeToDescriptor implements TypeVisitor{ @Override public String visit(RefType refType) { //ToDo Etienne: check if it works - if (refType.getName().toString().matches("Fun\\d+\\$\\$")) return new ASTToIntermediate().convert(refType).getDescriptor(); + if (refType.getName().toString().matches("Fun\\d+\\$\\$")){ + String descriptor = new ASTToIntermediate().convert(refType).getDescriptor(); + return descriptor.substring(1, descriptor.length() - 1); + } return refType.getName().toString().replace(".", "/"); // String t = refType.getName().toString().replace(".", "/"); diff --git a/src/main/java/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java b/src/main/java/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java index 347d0d08..e9fc63f9 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/signature/TypeToSignature.java @@ -31,7 +31,8 @@ public class TypeToSignature implements TypeVisitor { if(refType.getName().toString().equals("void")) return "V"; //ToDo Etienne: check if it works - if (refType.getName().toString().matches("Fun\\d+\\$\\$")) return new ASTToIntermediate().convert(refType).getSignature(); + if (refType.getName().toString().matches("Fun\\d+\\$\\$")) + return new ASTToIntermediate().convert(refType).getSignature(); // return refType.toString().replace(".", "/"); String params = ""; diff --git a/src/main/java/de/dhbwstuttgart/intermediate/convert/ASTToIntermediate.java b/src/main/java/de/dhbwstuttgart/intermediate/convert/ASTToIntermediate.java index 9e5a6932..a386dd50 100644 --- a/src/main/java/de/dhbwstuttgart/intermediate/convert/ASTToIntermediate.java +++ b/src/main/java/de/dhbwstuttgart/intermediate/convert/ASTToIntermediate.java @@ -1,6 +1,5 @@ package de.dhbwstuttgart.intermediate.convert; -import de.dhbwstuttgart.bytecode.utilities.Resolver; import de.dhbwstuttgart.exceptions.NotImplementedException; import de.dhbwstuttgart.intermediate.generation.FunN; import de.dhbwstuttgart.intermediate.types.*; @@ -19,13 +18,13 @@ public class ASTToIntermediate { System.out.println(originalType.getParaList().size()); if (originalType.getName().toString().matches("Fun\\d+\\$\\$")){ - if(originalType.getParaList().size() == 0) throw new RuntimeException("Incorrect FunN Type: No params are defined!"); - ASTToIntermediate converter = new ASTToIntermediate(); + if(originalType.getParaList().size() == 0) + throw new RuntimeException("Incorrect FunN Type: No params are defined!"); List parameters = originalType.getParaList(); IntermediateInnerType returnType = (IntermediateInnerType) convert(parameters.get(parameters.size() - 1)); - parameters.remove(parameters.size() - 1); return new FunN(parameters .stream() + .limit((parameters.size() - 1) > 0 ? (parameters.size() - 1) : 0) .map(this::convert) .filter(t -> t instanceof IntermediateInnerType) .map(t -> (IntermediateInnerType) t) @@ -70,6 +69,7 @@ public class ASTToIntermediate { //ToDo Etienne: check if it works public IntermediateRefType convert(TypePlaceholder originalType){ + //ToDo zu Generic nachher return new IntermediateRefType(new JavaClassName(Type.getInternalName(Object.class))); } diff --git a/src/main/java/de/dhbwstuttgart/intermediate/generation/FunN.java b/src/main/java/de/dhbwstuttgart/intermediate/generation/FunN.java index fc8119a0..11b1ccc8 100644 --- a/src/main/java/de/dhbwstuttgart/intermediate/generation/FunN.java +++ b/src/main/java/de/dhbwstuttgart/intermediate/generation/FunN.java @@ -60,9 +60,9 @@ public final class FunN extends IntermediateRefType { typArguments.size(), typArguments .stream() - .map(IntermediateType::getSignature) + .map(IntermediateInnerType::getDescriptor) .collect(Collectors.joining()), - returnType.getSignature()) + returnType.getDescriptor()) .replace('/', '$') .replace(";", "$_$")), Stream.concat(typArguments.stream(), Stream.of(returnType)).collect(Collectors.toList())); @@ -138,6 +138,7 @@ public final class FunN extends IntermediateRefType { } //ToDo Etienne: Auslagern in andere Klasse; + @Deprecated public static boolean writeClassFile(String className, byte[] bytecode, File directory) { try (FileOutputStream output = new FileOutputStream(new File(directory , className + CONSTANTS.EXTENSIONCLASS))){ output.write(bytecode); diff --git a/src/main/java/de/dhbwstuttgart/intermediate/types/IntermediateRefType.java b/src/main/java/de/dhbwstuttgart/intermediate/types/IntermediateRefType.java index be32f860..91be08c0 100644 --- a/src/main/java/de/dhbwstuttgart/intermediate/types/IntermediateRefType.java +++ b/src/main/java/de/dhbwstuttgart/intermediate/types/IntermediateRefType.java @@ -82,7 +82,7 @@ public class IntermediateRefType extends IntermediateInnerType{ } signature += ";"; } - signature.replace('.','/'); + signature = signature.replace('.','/'); this.signature = signature; return signature; }