2013-03-30 1 views
0

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

@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 часть имеет быть пустым.

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

ответ

0

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

Смежные вопросы