Я использую активные аннотации для генерации полей в моих классах, и мне трудно обнаружить, как расширить выражения инициализатора полей.Без инициализаторов код выглядит следующим образом
class JavaFxPropertyProcessor implements TransformationParticipant<MutableFieldDeclaration>{
def private transform(MutableFieldDeclaration field, extension TransformationContext context){
fields.forEach[transform(context)]
}
def private transform(MutableFieldDeclaration field, extension TransformationContext context){
val clazz = field.declaringType as MutableClassDeclaration
val theClass = SomeJavaClass //any non-parameterised java class here
clazz.addField("myField")[
type = theClass.newTypeReference
initializer = ['''new <<toJavaCode(theClass.newTypeReference()>>(this)''']
]
}
}
Это прекрасно работает, когда в поле нет инициализатора.Иногда мне бы хотелось, чтобы у поля был инициализатор, и он отлично работает для литералов int
и bool
, просто выгрузив инициализатор в виде строки в выражение
val theInitializer = field.initializer //this is not null
clazz.addField("myField2")[
type = theClass.newTypeReference
initializer = [
'''new <<toJavaCode(theClass.newTypeReference()>>(this, <<theInitializer.toString>>)'''
]
]
Когда инициализатор представляет собой списокбуквально, скажем, например, #[1,2,3]
, тогда явно наивная техника initializer.toString
не работает, так как она создает код Java, такой как
val myField = new List<Integer>(#[1,2,3]);
Так как мне получить, чтобы оценить / развернуть field.initializer
(который имеет тип org.eclipse.xtend.lib.macro.expression
) для того, чтобы java-ise это для моих инициализаторов?