Каскадная компиляция в памяти с помощью javax.tool

Компилятор Eclipse JDT предоставляет интерфейс INameEnvironment , который определяет метод findType (...) , который позволяет вам сделать каскадную компиляцию. Любопытно, что я хотел бы знать, есть ли какие-либо средства сделать это с помощью стандартного инструментария компилятора JDK?

Примечание , сценарий представляет собой механизм шаблонов, который выполняет компиляцию памяти для классов, сгенерированных файлом шаблона, которые имеют взаимозависимости, и он не может предсказать порядок, в котором вы встретили файл шаблона, поэтому Foo может потребоваться сначала скомпилировать, прежде чем его родительский Bar уже скомпилирован, поэтому вам нужен механизм для выполнения каскадной компиляции, то есть во время компиляции Foo вам необходимо сгенерировать другой исходный код Bar и сначала скомпилировать его, чтобы продолжить компиляцию 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);
    }
}
10
задан Gelin Luo 6 January 2013 в 23:05
поделиться