Xtext自定义DSL格式

时间:2015-06-17 16:23:27

标签: eclipse formatting dsl xtext xtend

在我的DSL中,我有很多东西,例如条件和一些声明,例如block(a; b; c; d;);

在我的configureFormatting函数中,我按以下顺序执行此操作:

for (Pair<Keyword, Keyword> pair : grammarAccess.findKeywordPairs("(", ")"))
{
   c.setNoSpace().after(pair.getFirst());
   c.setNoSpace().before(pair.getSecond());
}
c.setIndentation(block.getLeftParenthesisKeyword(),block.getRightParenthesisKeyword());
c.setLinewrap().after(block.getLeftParenthesisKeyword());
c.setLinewrap().before(block.getRightParenthesisKeyword());

预期是:

block (
     int z;
     int a;
     int y;
);
if (a = 1)

实际结果:

block (int z;
     int a;
     int y;);
if (a = 1)

2 个答案:

答案 0 :(得分:1)

你看到了实际的结果,因为在for循环中你明确地设置了你不想在第一个'('和'之前'之后的空格。

尝试以下方法:

for (Pair<Keyword, Keyword> pair : grammarAccess.findKeywordPairs("(", ")")) {
    c.setIndentation(pair.getFirst(), pair.getSecond()); // indent between ( )
    c.setLinewrap().after(pair.getFirst()); // linewrap after (
    c.setLinewrap().before(pair.getSecond()); // linewrap before )
    c.setNoSpace().after(pair.getSecond()); // no space after )
}

希望有所帮助!

答案 1 :(得分:0)

好吧,我已经弄清楚了。这很简单。我做了以下:

for (Pair<Keyword, Keyword> pair : grammarAccess.findKeywordPairs("(", ")"))
{
   if(pair.getFirst() != block.getLeftParenthesisKeyword())
        c.setNoSpace().after(pair.getFirst());
   if(pair.getSecond() != block.getRightParenthesisKeyword())       
        c.setNoSpace().before(pair.getSecond());
}
c.setIndentation(block.getLeftParenthesisKeyword(),block.getRightParenthesisKeyword());
c.setLinewrap().after(block.getLeftParenthesisKeyword());
c.setLinewrap().before(block.getRightParenthesisKeyword());