package org.mdkt.compiler; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.tools.FileObject; import javax.tools.ForwardingJavaFileManager; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; /** * Created by trung on 5/3/15. Edited by turpid-monkey on 9/25/15, completed * support for multiple compile units. */ public class ExtendedStandardJavaFileManager extends ForwardingJavaFileManager<JavaFileManager> { private List<CompiledCode> compiledCode = new ArrayList<CompiledCode>(); private DynamicClassLoader cl; /** * Creates a new instance of ForwardingJavaFileManager. * * @param fileManager * delegate to this file manager * @param cl */ protected ExtendedStandardJavaFileManager(JavaFileManager fileManager, DynamicClassLoader cl) { super(fileManager); this.cl = cl; } @Override public JavaFileObject getJavaFileForOutput( JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { try { CompiledCode innerClass = new CompiledCode(className); compiledCode.add(innerClass); cl.addCode(innerClass); return innerClass; } catch (Exception e) { throw new RuntimeException( "Error while creating in-memory output file for " + className, e); } } @Override public ClassLoader getClassLoader(JavaFileManager.Location location) { return cl; } }