Eclipse's JDT compiler provide an interface INameEnvironment
which defines method findType(...)
enable you to do cascade compilation. Curiously I would like to know if there are any means to do it using standard JDK compiler toolkit?
Note, the scenario is a template engine which do in memory compilation for template file generated classes which have inter-dependencies, and it cannot forecast the order you encountered a template file, thus Foo
might needs to be compiled first before it's parent Bar
compiled already, therefore you need a mechanism to do cascade compilation, meaning during compilation of Foo
you need to generate another source Bar
and compile it first in order to continue Foo
's compilation: some code like the follows:
private NameEnvironmentAnswer findType(final String name) {
try {
if (!name.contains(TemplateClass.CN_SUFFIX)) {
return findStandType(name);
}
char[] fileName = name.toCharArray();
TemplateClass templateClass = classCache.getByClassName(name);
// TemplateClass exists
if (templateClass != null) {
if (templateClass.javaByteCode != null) {
ClassFileReader classFileReader = new ClassFileReader(templateClass.javaByteCode, fileName, true);
return new NameEnvironmentAnswer(classFileReader, null);
}
// Cascade compilation
ICompilationUnit compilationUnit = new CompilationUnit(name);
return new NameEnvironmentAnswer(compilationUnit, null);
}
// So it's a standard class
return findStandType(name);
} catch (ClassFormatException e) {
// Something very very bad
throw new RuntimeException(e);
}
}
INameEnvironment.findType()
is it allows me to do cascade compilation, say, I have classFoo
which depends on classBar
. And my app tries to compileFoo
beforeBar
is compiled, thus during compilation ofFoo
I can implement a logic to generate the source code ofBar
and compile it and then continue compilation ofFoo
. Is this kind of stuff doable withForwardJavaFileManager
? – Aholla