Как расширить инициализаторы полей в процессоре аннотаций xtend - PullRequest
0 голосов
/ 19 мая 2018

Я использую активные аннотации для генерации полей в моих классах, и мне трудно обнаружить, как расширить выражения инициализатора полей.Без инициализаторов код выглядит следующим образом

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 это для моих инициализаторов?

...