【问题标题】:XTEND For-Loop indexcontrol in DomainmodelGenerator.xtend (XTEXT codegeneration project)DomainmodelGenerator.xtend 中的 XTEND For-Loop indexcontrol(XTEXT 代码生成项目)
【发布时间】:2013-09-01 00:06:48
【问题描述】:

我完成了 eclipse.org/Xtext/documentation 上的教程并开始扩展这些示例。使用 Domainmodel.xtext 示例,我为每个实体生成了一个 Java-Classfile,如 Tut 中所述。

DSL 指定了任意数量的特性,也就是类属性:

  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 代码?

【问题讨论】:

    标签: dsl xtext xtend


    【解决方案1】:

    «FOR» 循环有一些非常方便的选项:

    • BEFORE string
    • SEPARATOR string
    • AFTER string

    这些允许您在项目之前、之间和之后发出额外的字符串。如果没有项目(空列表),则不会发出任何项目。

    所以在你的情况下,只需使用

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

    【讨论】:

      【解决方案2】:

      怎么样:

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

      【讨论】:

      • 优雅的工作正常。我继续阅读 XTEND 文档。学习了带有 ''' ''' 的多行字符串称为模板,FOR 循环语法以优雅的语法涵盖了此要求:` def compile_Constructors(Entity e) ''' public «e.name.toFirstUpper» ( «FOR f : e.features SEPARATOR ","» «f.type.fullyQualifiedName» «f.name.toFirstUpper» «ENDFOR» ) { } `
      • 抱歉,反引号代码不起作用,我遇到了 cmets 5 分钟超时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多