Il compilatore JDT di Eclipse fornisce un'interfaccia INameEnvironment
che definisce il metodo findType(...)
che consente di eseguire la compilazione in cascata. Curiosamente vorrei sapere se ci sono mezzi per farlo usando il toolkit standard del compilatore JDK?Compilazione in memoria in cascata con javax.tool
Nota, lo scenario è un motore di template, che fare la compilazione memoria per classi generate file di modello che hanno interdipendenze, e non può prevedere l'ordine che avete incontrato un file di modello, quindi Foo
forza deve essere compilato prima prima che sia genitore Bar
compilato già, pertanto è necessario un meccanismo per fare la compilazione a cascata, cioè durante la compilazione di Foo
è necessario generare un'altra fonte Bar
e compilarlo prima al fine di continuare la compilazione s' Foo
: un po' di codice simile al seguente:
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);
}
}
Il punto di 'INameEnvironment.findType()' di JDT è che mi consente di eseguire la compilazione in cascata, ad esempio, ho una classe 'Foo' che dipende dalla classe' Bar'. E la mia app tenta di compilare 'Foo' prima che venga compilato' Bar', quindi durante la compilazione di 'Foo' posso implementare una logica per generare il codice sorgente di' Bar' e compilarlo e quindi continuare la compilazione di 'Foo'. Questo tipo di cose è fattibile con 'ForwardJavaFileManager'? –
Potrebbe essere in grado di implementare quel tipo di cosa in cima a ciò che descrivo. Faccio qualcosa di simile. Se ottengo determinati errori, io uso regex per scoprire cosa manca e generare/compilare uno stub per questo. Ma se stai dicendo che JDT ti dà degli aggetti nel bel mezzo della compilation per trovare i simboli mancanti, non penso che Javac abbia quello disponibile. Dovete o capirlo in anticipo, o con l'errore, o la lista '(...) 'call è per un pacchetto, quindi se sai che una richiesta per un determinato pacchetto significa che devi generare qualcosa, allora potresti inserire la cascata qui. – mentics
hmm ... probabilmente non è il modo per me di andare. Il punto è quando compilo B, ho trovato A mancante, non manca solo la classe A, ma anche il codice sorgente non è pronto, ho bisogno di generare il codice sorgente A da un file modello [a]. La chiamata 'findType' di JDT si adatta perfettamente alle esigenze. –