2013-08-27 3 views
0

Я работал над учебниками по eclipse.org/Xtext/documentation и расширил эти образцы. Работая с образцом Domainmodel.xtext, я генерирую Java-Classfile для каждого объекта, как указано в Tut.XTEND For-Loop indexcontrol в DomainmodelGenerator.xtend (проект преобразования кодов XTEXT)

Маршрутизатор DSL указывает arbitry ряд особенностей, ака свойств класса:

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

В DomainmodelGenerator.xtend Затем я добавил код для генерации JAVA-classconstructor. Циклы 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-код?

ответ

2

Как насчет:

def compile_Constructors(Entity e) ''' 
    public «e.name.toFirstUpper» 
      (
      «e.features.map[type.fullyQualifiedName + ' ' + name.toFirstUpper].join(', ')» 
      ) 
    {} 
''' 
+0

элегантный отлично работает. Я продолжал читать документацию XTEND. Узнал MultiLineString с «» «„“» называется шаблоном, для-Луп Синтаксис покрывает это требование с элегантным синтаксисом: '\t четкости compile_Constructors (Entity е)„“» общественности «e.name.toFirstUpper » ( \t \t« ЗА F: e.features СЕПАРАТОРА "" » \t \t«f.type.fullyQualifiedName» «f.name.toFirstUpper» \t \t«ENDFOR» ) { \t } ' – olippuner

+0

жалкие обратные ссылки для кода не работали, и я запускаю 5-минутный тайм-аут для комментариев. – olippuner

2

Петля «FOR» имеет несколько вариантов, которые очень удобно:

  • BEFORE string
  • SEPARATOR string
  • AFTER string

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

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

«FOR f : e.features SEPARATOR ', '»