如何让 Xtend 中的 AFTER 分隔符紧跟在最后一项之后

How to have the AFTER separator in Xtend just behind last item

我使用 Xtend 从我的 Xtext 语法生成一些文本输出。我的问题很简单,看文档和例子都搞不明白,求指教!

让我们假设,我有一个包含一些项目的列表。我使用 SEPARATOR 功能为 FOR 循环中的每个项目生成一行。最后我想要一个使用 AFTER 的最终分隔符。这是一个演示它的示例代码:

val list = #["a", "b", "c"]
'''
«FOR item : list SEPARATOR "," AFTER ","»
   «item»
«ENDFOR»
'''

这样,我收到以下输出:

a,
b,
c
,

现在的问题是:如何让最后的 , 分隔符紧跟在 c 之后而不是在新行上?正确格式化输出对我来说非常重要(实际上它比 a,b,c 更复杂,而且分隔符的位置很重要)。我想要这个:

a,
b,
c,

求高手帮忙!

在您的简单示例中,由于 SEPARATOR 和 AFTER 相同,您应该完全跳过 separator/after 内容,而只使用

'''
   «FOR item : list»
      «item»,
   «ENDFOR»
'''

Xtend 的空白检测会跳过 FOR 和 ENDFOR 之后的换行符。问题是在执行循环后应用 AFTER,并且您的 loop-body 包含进入输出(灰色空间)的尾随换行符。您可以通过在一行中编写整个循环来克服这个问题,例如

'''
   «FOR item: list SEPARATOR ',\n' AFTER ',\n'»«item»«ENDFOR»
'''

并在循环的 body 变长时提取一个方法。为了更好的可读性,您可以在 guillemets 中添加任意数量的空格,例如

'''
   «FOR item: list SEPARATOR ',\n' AFTER ',\n'»«
      item
   »«ENDFOR»
'''

对于较小的身体,您也可以考虑使用 prefer join()

'''
   «list.join(',\n')»,
'''

或更一般的 map()、reduce() 等等。