22
33import java .io .FileNotFoundException ;
44import java .io .IOException ;
5+ import java .util .ArrayList ;
6+ import java .util .Arrays ;
7+ import java .util .List ;
58
69import javax .tools .FileObject ;
710import javax .tools .ForwardingJavaFileManager ;
811import javax .tools .JavaFileManager ;
912import javax .tools .JavaFileObject ;
1013
1114/**
12- * Created by trung on 5/3/15.
13- * Edited by turpid-monkey on 9/25/15, completed support for multiple compile units.
15+ * Created by trung on 5/3/15. Edited by turpid-monkey on 9/25/15, completed
16+ * support for multiple compile units.
1417 */
1518public class ExtendedStandardJavaFileManager extends
1619 ForwardingJavaFileManager <JavaFileManager > {
1720
18- private CompiledCode [] compiledCode ;
21+ private List < CompiledCode > compiledCode = new ArrayList < CompiledCode >() ;
1922 private DynamicClassLoader cl ;
2023
2124 /**
@@ -26,23 +29,27 @@ public class ExtendedStandardJavaFileManager extends
2629 * @param cl
2730 */
2831 protected ExtendedStandardJavaFileManager (JavaFileManager fileManager ,
29- DynamicClassLoader cl , CompiledCode ... compiledCode ) {
32+ DynamicClassLoader cl ) {
3033 super (fileManager );
31- this .compiledCode = compiledCode ;
3234 this .cl = cl ;
33- for (CompiledCode code : compiledCode ) {
34- this .cl .addCode (code );
35- }
3635 }
3736
3837 @ Override
39- public JavaFileObject getJavaFileForOutput (JavaFileManager .Location location , String className , JavaFileObject .Kind kind , FileObject sibling ) throws IOException {
40- for (CompiledCode code : compiledCode )
41- {
42- if (code .getClassName ().equals (className )) return code ;
43- }
44- throw new FileNotFoundException ("Missing source code for class " + className );
45- }
38+ public JavaFileObject getJavaFileForOutput (
39+ JavaFileManager .Location location , String className ,
40+ JavaFileObject .Kind kind , FileObject sibling ) throws IOException {
41+
42+ try {
43+ CompiledCode innerClass = new CompiledCode (className );
44+ compiledCode .add (innerClass );
45+ cl .addCode (innerClass );
46+ return innerClass ;
47+ } catch (Exception e ) {
48+ throw new RuntimeException (
49+ "Error while creating in-memory output file for "
50+ + className , e );
51+ }
52+ }
4653
4754 @ Override
4855 public ClassLoader getClassLoader (JavaFileManager .Location location ) {
0 commit comments