EclipseのJDTコンパイラは、というインターフェイスを提供しています。これは、メソッドを定義します。findType(...)
は、カスケードコンパイルを可能にします。不思議なことに、標準のJDKコンパイラツールキットを使ってそれを行う方法があるかどうかを知りたいですか?javax.toolを使用したカスケードインメモリコンパイル
注、シナリオは相互依存関係を持っているテンプレートファイル生成されたクラスのためにメモリのコンパイルで行うテンプレートエンジンであり、それはあなたがテンプレートファイルに遭遇した順序を予測することはできません、これFoo
かもしれないが、最初にコンパイルする必要がありますそれはすでにコンパイル親Bar
になる前に、したがって、あなたは別のソースBar
を生成し、Foo
のコンパイルを継続するために、最初にそれをコンパイルする必要がありFoo
のコンパイル時意味、カスケードコンパイルを行うための仕組みが必要になりますようにいくつかのコードは次のとおりです。
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);
}
}
JDTの 'INameEnvironment.findType()'のポイントは、カスケードコンパイルを行うことができます。たとえば、クラス 'Bar'に依存する' Foo'クラスがあります。そして、私のアプリは 'Foo'をコンパイルする前に' Foo'をコンパイルしようとします。したがって 'Foo'のコンパイル時に、' Bar'のソースコードを生成してコンパイルし、 'Foo'のコンパイルを続けるロジックを実装できます。この種のものは 'ForwardJavaFileManager'でうまくいくのですか? –
あなたは私が記述しているものの上にそのタイプのものを実装することができるかもしれません。私は似たようなことをしています。特定のエラーが発生した場合は、正規表現を使用して欠落しているものを見つけ出し、スタブを生成/コンパイルします。しかし、JDTがシンボルの欠落を見つけるためにコンパイルの途中であなたにフックを与えると言っているのであれば、私はJavacがそれを利用できるとは思いません。あなたは、事前に、またはエラー、または 'リスト(...とそれを把握する必要があります) 'コールはパッケージを対象としているので、あるパッケージのリクエストが何かを生成しなければならないということを知っていれば、そこでカスケードをコンパイルすることができます。 – mentics
うーん...おそらく私は行く方法はありません。ポイントは私がBをコンパイルするとき、Aが見つからない、クラスAが欠けているだけでなく、ソースコードも準備ができていないことです。テンプレートファイル[a]からソースコードAを生成する必要があります。 JDTの 'findType'呼び出しは、ニーズに最適です。 –