Как создать поле `String[]` с активной аннотацией xtend?

Я пробовал с активной аннотацией xtend и хочу создать живую аннотацию, которая может генерировать поле String[] для записи имен параметров метода.

@Target(ElementType::TYPE)
@Active(typeof(ParameterRecorderProcessor))
annotation ParameterRecorder {
}

class ParameterRecorderProcessor extends AbstractClassProcessor {

    override doTransform(MutableClassDeclaration annotatedClass, extension TransformationContext context) {

        var iii = 0;

        // add the public methods to the interface
        for (method : annotatedClass.declaredMethods) {
            if (method.visibility == Visibility::PUBLIC) {
                iii = iii + 1
                annotatedClass.addField(method.simpleName + "_" + iii) [
                    type = typeof(String[]).newTypeReference // String[] doesn't work

                    var s = ""
                    for (p : method.parameters) {
                        if(s.length > 0) s = s + ","
                        s = s + "\"" + p.simpleName + "\""
                    }
                    val ss = s

                    initializer = [
                        '''[«ss»]'''
                    ]
                ]
            }
        }
    }
}

Вы можете видеть, что я использую typeof(String[]).newTypeReference для определения типа нового созданного поля, но это не работает. Сгенерированный Java-код выглядит так:

private Object index_1;

Он использует Object, а часть initializer должна быть пустой.

Как это исправить?


person Freewind    schedule 30.03.2013    source источник


Ответы (1)


Это похоже на ошибку для меня. В качестве обходного пути вы можете использовать typeof(String).newTypeReference.newArrayTypeReference или более краткое string.newArrayTypeReference

person Sebastian Zarnekow    schedule 02.04.2013