package bytecode; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import org.apache.commons.bcel6.classfile.JavaClass; import de.dhbwstuttgart.bytecode.ClassGenerator; import de.dhbwstuttgart.core.MyCompiler; import de.dhbwstuttgart.core.MyCompilerAPI; import de.dhbwstuttgart.logger.LoggerConfiguration; import de.dhbwstuttgart.logger.Section; import de.dhbwstuttgart.syntaxtree.SourceFile; import de.dhbwstuttgart.typeinference.ByteCodeResult; import de.dhbwstuttgart.typeinference.Menge; import de.dhbwstuttgart.typeinference.TypeinferenceResults; public abstract class ASTBytecodeTest { public static String rootDirectory = System.getProperty("user.dir")+"/test/bytecode/"; protected String testName = ""; protected SourceFile sourceFile = new SourceFile(); protected TypeinferenceResults results = new TypeinferenceResults(); protected Class getClassToTest(){ Class classToTest = null; try { ClassLoader classLoader = getClassLoader(); classToTest = classLoader.loadClass(testName); } catch (Exception e) { throw new RuntimeException(e); } return classToTest; } protected ClassLoader getClassLoader() throws Exception{ File file = new File(rootDirectory); URL url = file.toURL(); URL[] urls = new URL[]{url}; return new URLClassLoader(urls); } public ASTBytecodeTest(){ init(); LoggerConfiguration logConfig = new LoggerConfiguration().setOutput(Section.PARSER, System.out); MyCompilerAPI compiler = MyCompiler.getAPI(logConfig); try { Menge sourceFiles = new Menge<>(); sourceFiles.add(sourceFile); Menge bytecode = compiler.generateBytecode(sourceFiles, results); ByteCodeResult result = bytecode.firstElement(); JavaClass javaClass = result.getByteCode().getJavaClass(); javaClass.dump(new File(rootDirectory+javaClass.getClassName()+".class")); System.out.println(new File(rootDirectory+javaClass.getClassName()+".class").getAbsolutePath()); for(ClassGenerator cg: result.getByteCode().getExtraClasses().values()){ JavaClass jc = cg.getJavaClass(); jc.dump(new File(rootDirectory+jc.getClassName()+".class")); } }catch(Exception e){ throw new RuntimeException(e); } } protected abstract void init(); }