diff --git a/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java b/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java index 6ea6e616..52bffb30 100644 --- a/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java +++ b/src/main/java/de/dhbwstuttgart/bytecode/Codegen.java @@ -1435,6 +1435,8 @@ public class Codegen { var access = method.access(); if (method.block() == null) access |= ACC_ABSTRACT; + if (clazz instanceof TargetInterface) + access |= ACC_PUBLIC; // TODO The older codegen has set ACC_PUBLIC for all methods, good for testing but bad for everything else MethodVisitor mv = cw.visitMethod(access, method.name(), method.getDescriptor(), method.getSignature(), null); diff --git a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java index fae04d71..42f4f094 100644 --- a/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java +++ b/src/main/java/de/dhbwstuttgart/core/JavaTXCompiler.java @@ -57,6 +57,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; +import java.sql.Array; import java.util.*; import java.util.Map.Entry; import java.util.function.Function; @@ -128,11 +129,11 @@ public class JavaTXCompiler { } public ConstraintSet getConstraints() throws ClassNotFoundException, IOException { - List allClasses = new ArrayList<>();// environment.getAllAvailableClasses(); - List importedClasses = new ArrayList<>(); + Set allClasses = new HashSet<>();// environment.getAllAvailableClasses(); ClassOrInterface objectClass = ASTFactory.createClass(classLoader.loadClass(new JavaClassName("java.lang.Object").toString())); // Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC for (Entry source : sourceFiles.entrySet()) { + var importedClasses = new ArrayList(); for (JavaClassName name : source.getValue().getImports()) { importedClasses.addAll(getAvailableClasses(name)); } @@ -140,18 +141,17 @@ public class JavaTXCompiler { ClassOrInterface importedClass = ASTFactory.createClass(c); importedClasses.add(importedClass); } + source.getValue().availableClasses.addAll(importedClasses); } for (File f : this.sourceFiles.keySet()) { SourceFile sf = sourceFiles.get(f); - sf = new SourceFile(sf.getPkgName(), sf.KlassenVektor.stream().map(cl -> new ClassOrInterface(cl)).collect(Collectors.toCollection(ArrayList::new)), sf.imports); + SourceFile sf_new = new SourceFile(sf.getPkgName(), sf.KlassenVektor.stream().map(cl -> new ClassOrInterface(cl)).collect(Collectors.toCollection(ArrayList::new)), sf.imports); // sf enthaelt neues Source-File, neue Klassen-Objekte und neue // ArrayListen-Objekte fuer Fields, Construktoren und Methoden // Alle anderen Objekte werden nur kopiert. - SourceFile sf_new = sf; - sf.KlassenVektor.forEach(cl -> addMethods(sf_new, cl, importedClasses, objectClass)); - allClasses.addAll(sf.getClasses()); + sf_new.KlassenVektor.forEach(cl -> addMethods(sf_new, cl, sf.availableClasses, objectClass)); + allClasses.addAll(sf_new.getClasses()); } - allClasses.addAll(importedClasses); TYPE ty = new TYPE(sourceFiles.values(), allClasses); return ty.getConstraints(); } diff --git a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java index 925a7b05..ce330b40 100644 --- a/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java +++ b/src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java @@ -143,7 +143,8 @@ public class SyntaxTreeGenerator { if (srcfile.packageDeclaration() != null) this.pkgName = convert(srcfile.packageDeclaration()); Map imports = GatherNames.getImports(srcfile, packageCrawler, compiler); - this.imports = imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet()); + this.imports.addAll(imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet())); + for (Java17Parser.ClassOrInterfaceContext type : srcfile.classOrInterface()) { ClassorinterfacedeclContext clsoif; if (type instanceof NoclassorinterfaceContext) { diff --git a/src/main/java/de/dhbwstuttgart/syntaxtree/SourceFile.java b/src/main/java/de/dhbwstuttgart/syntaxtree/SourceFile.java index 6745d53f..a0a7e42e 100644 --- a/src/main/java/de/dhbwstuttgart/syntaxtree/SourceFile.java +++ b/src/main/java/de/dhbwstuttgart/syntaxtree/SourceFile.java @@ -15,6 +15,8 @@ public class SourceFile extends SyntaxTreeNode { public final List KlassenVektor; public final Set imports; + public List availableClasses = new ArrayList<>(); + /** * Die SourceFile repräsntiert eine zu einem Syntaxbaum eingelesene Java-Datei. * SourceFile stellt dabei den Wurzelknoten des Syntaxbaumes dar. diff --git a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java index d8de982e..e12e7b05 100644 --- a/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java +++ b/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPE.java @@ -16,19 +16,23 @@ import java.util.*; public class TYPE { private final Collection sfs; - private final TypeInferenceInformation typeInferenceInformation; + private final Set allAvailableClasses; - public TYPE(Collection sourceFiles, Collection allAvailableClasses){ + public TYPE(Collection sourceFiles, Set allAvailableClasses){ sfs = sourceFiles; - this.typeInferenceInformation = new TypeInferenceInformation(allAvailableClasses); + this.allAvailableClasses = allAvailableClasses; } public ConstraintSet getConstraints() { ConstraintSet ret = new ConstraintSet(); for(SourceFile sf : sfs) - for (ClassOrInterface cl : sf.KlassenVektor) { - ret.addAll(getConstraintsClass(cl ,typeInferenceInformation)); - } + for (ClassOrInterface cl : sf.KlassenVektor) { + System.out.println(sf.availableClasses); + var allClasses = new HashSet(); + allClasses.addAll(allAvailableClasses); + allClasses.addAll(sf.availableClasses); + ret.addAll(getConstraintsClass(cl, new TypeInferenceInformation(allClasses))); + } return ret; }