在XTend中从另一个调用模板表达式

时间:2012-10-01 14:58:14

标签: code-generation 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)。

1 个答案:

答案 0 :(得分:6)

forEach总是返回null,只是做副作用。你想要的是地图和连接。

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

但还有更好的方法:

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

我建议保持并重用一个ResourceGenerator实例作为字段(你使用依赖注入吗?)或者使ResourceGenerator :: generate static。