XTEND Управление индексом For-Loop в DomainmodelGenerator.xtend (проект генерации кода XTEXT)

Я проработал учебные пособия на eclipse.org/Xtext/documentation и начал расширять эти примеры. Работая с образцом Domainmodel.xtext, я создаю файл Java-класса для каждой сущности, как указано в Tut.

DSL определяет произвольное количество функций, также известных как свойства класса:

  Entity:
  'entity' name = ID 
          ('extends' superType = [Entity | QualifiedName])?
   '{'
   (features += Feature)*
   '}'
    ;

Затем в DomainmodelGenerator.xtend я добавил код для создания конструктора JAVA-класса. XTEND-Forloop перебирает все аргументы - выглядит так:

def compile_Constructors(Entity e) '''
public «e.name.toFirstUpper»
       (
      «FOR f : e.features»
           «f.type.fullyQualifiedName» «f.name.toFirstUpper», 
      «ENDFOR»
        ) 
{}  
'''

Проблема С этим последним параметром все еще выделяется запятая. Как я могу получить контроль в XTEND над loopindex, чтобы генератор выдавал допустимый код JAVA?


person olippuner    schedule 27.08.2013    source источник


Ответы (2)


Как насчет:

def compile_Constructors(Entity e) '''
    public «e.name.toFirstUpper»
           (
           «e.features.map[type.fullyQualifiedName + ' ' + name.toFirstUpper].join(', ')»
           ) 
    {}
'''
person ZhekaKozlov    schedule 28.08.2013
comment
элегантный работает нормально. Я продолжал читать документацию XTEND. Выученная многострочная строка с ''' ''' называется шаблоном, и синтаксис цикла FOR покрывает это требование элегантным синтаксисом: ` def compile_Constructors(Entity e) ''' public «e.name.toFirstUpper» ( : e.features SEPARATOR ,» «f.type.fullyQualifiedName» «f.name.toFirstUpper» «ENDFOR» ) { } ` - person olippuner; 28.08.2013
comment
извините, обратные кавычки для кода не работали, и я столкнулся с 5-минутным тайм-аутом для комментариев. - person olippuner; 28.08.2013

Цикл «FOR» имеет несколько очень удобных опций:

  • BEFORE string
  • SEPARATOR string
  • AFTER string

Это позволяет вам создавать дополнительные строки до, между и после элементов. Если элементов нет (пустой список), ни один из них не выдается.

Так что в вашем случае просто используйте

«FOR f : e.features SEPARATOR ', '»
person A.H.    schedule 31.08.2013