Я пытаюсь переместить все объявления локальных переменных в объявления полей, используя janino, так что, если я введу следующий код
class A {
int a;
void test() {
int b = 0;
int c = 1;
b += c;
}
}
, проанализируем его как CompilationUnit
и изменим AST, используяTraverser
и разбор его обратно, я могу получить
class A {
int a;
int b;
int c;
void test() {
b = 0;
c = 1;
b += c;
}
}
Я написал следующий метод для создания Java.FieldDeclaration
из Java.LocalVariableDeclarationStatement
:
static Java.FieldDeclaration createFieldDecFromLocalDec(Java.LocalVariableDeclarationStatement lvds) {
Java.Modifiers modifiers = lvds.modifiers;
Java.Type type = lvds.type;
Java.VariableDeclarator[] declarators =
new Java.VariableDeclarator[lvds.variableDeclarators.length];
for (int i = 0; i < declarators.length; i++) {
Java.VariableDeclarator oldDec = lvds.variableDeclarators[i];
declarators[i] = new Java.VariableDeclarator(
Location.NOWHERE, oldDec.name, oldDec.brackets, null);
}
return new Java.FieldDeclaration(
Location.NOWHERE, null, lvds.modifiers, lvds.type, declarators);
}
Но когдаЯ запускаю код, получаю следующее исключение:
org.codehaus.janino.JaninoRuntimeException: Enclosing scope already set for type "int" at File 'codegen', Line 5, Column 8
Как мне избавиться от этого исключения?Или как мне достичь своей цели с помощью janino?Спасибо.