Вызов шаблонного выражения из другого в XTend

у меня есть вопрос о вызове методов выражения шаблона из другого выражения шаблона.

Пример ниже не работал, т.е. он не расширяется и «печатает» код на том месте, где он был вызван. Как я могу изменить этот код, чтобы напечатать результат ResourceGenerator().generate(resource) в том месте, где он вызывается? Обратите внимание, что ResourceGenerator().generate(resource) само по себе является шаблонным выражением.

class ServerGenerator extends RESTServiceGenerator {
       def generate(Server it) '''
          package nl.sytematic.projects.RESTServiceServlet;
          import javax.ws.rs.GET;
          import javax.ws.rs.Path;
          import javax.ws.rs.Produces;
          import javax.ws.rs.core.MediaType;


          @Path("«it.baseURI»")
          public class «it.name» {
              «it.resources.forEach[ resource |new ResourceGenerator().generate(resource)]»

          }

       '''

}

Надеюсь, я ясно выразился в своем вопросе. Пример был бы отличным! (Опять же: ResourceGenerator().generate возвращает CharSequence).


person Marten Sytema    schedule 01.10.2012    source источник


Ответы (1)


forEach всегда возвращает null и просто выполняет побочные эффекты. Что вам нужно, так это карта и соединение.

it.resources.map(resource |new ResourceGenerator().generate(resource)).join

Но есть еще лучший способ:

«FOR resource : resources»
  «new ResourceGenerator().generate(resource)»
«ENDFOR»

Я предлагаю сохранить и повторно использовать один экземпляр ResourceGenerator в качестве поля (используете ли вы внедрение зависимостей?) или сделать ResourceGenerator::generate статическим.

person Sven Efftinge    schedule 01.10.2012
comment
Спасибо! Да, один из этих вариантов будет включен. Основная цель состояла в том, чтобы, по крайней мере, получить файл расширения для каждого объекта первого класса в нашей входной метамодели и соблюдать ту же иерархию, что и в метамодели. Таким образом, мы хотим попытаться получить чистый генератор кода. Спасибо за чаевые! - person Marten Sytema; 02.10.2012