Создание класса в методе с ложкой

Я работал над процессором, который внедряет внутренний класс внутри метода, и у меня много проблем с выяснением того, как генерировать класс и инициализацию сопутствующего объекта без автоматической генерации неправильного полностью квалифицированного имени,

Например, я обрабатывал такие вещи, как: я делал новый класс:

CtClass internal = getFactory().Core().createClass();

а затем вставив его перед элементом в методе

element.insertBefore(internal);

но когда я делаю заявление об инициализации:

CtConstructorCall call = getFactory().Core().createConstructorCall();
call.setType(internal);
internal.insertAfter(call);

Я получаю звонок, который выглядит так:

Main.internal initializedInternalObject = new Main.internal();

куда Main это имя всего класса, внутри которого есть все, даже если internal объявляется только внутри определенного метода. Я пытался использовать метод getFactory().Class(). Create() для внутренних классов, но этот метод, похоже, предназначен только для классов, вложенных в классы, а не для классов, разделенных внутри методов.

Я делаю что-то не так с объявлением класса? Я просто сталкиваюсь с ограничением способности ложки генерировать внутренние классы? Какие-либо предложения?

Спасибо всем!

2 ответа

Решение

Одним из возможных решений является префикс внутреннего имени класса цифрой.

Это работает?

Не стесняйтесь использовать проблемы Github для сообщения о странном поведении.

Хотя это и является своего рода хаком, выражения фрагмента кода допускают ручное переопределение выражений, включающих вызовы имени типа и конструктора данного внутреннего класса. Например:

String constructorCallSnippet = 
    "new " + classType.toString() + "(" 
    + String.join(", ", args.stream().map(a -> a.toString()).collect(toList()))
    + ")";
CtExpression constructorCall =
    getFactory().Code().createCodeSnippetExpression(constructorCallSnippet);
Другие вопросы по тегам