Форматирование Xtext Custom DSL

В моем DSL у меня есть () для многих вещей, например, условий if и некоторых объявлений, таких как 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)

person Ayman Salah    schedule 17.06.2015    source источник


Ответы (2)


вы видите фактический результат, потому что в цикле 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 )
}

Надеюсь, это поможет!

person Franz Becker    schedule 17.06.2015
comment
Это не решило мою проблему. В результате все, что имеет скобки, находится на новой строке, а это не то, что мне нужно. Я хотел, чтобы такие вещи, как условие If, выглядели так, if (a = 1) без пробелов и других вещей, имеющих скобки, которые я хочу видеть как блок с отступом и на строках между скобками, а не рядом с самими скобками. Вы меня понимаете? - person Ayman Salah; 18.06.2015
comment
Конечно, я не рассматривал другой вариант использования в вашей грамматике, но рад, что вы нашли решение. Между прочим, это новый API форматирования (хотя он все еще помечен как бета-версия): eclipse.org/Xtext/documentation/ он мощнее и проще в написании. - person Franz Becker; 18.06.2015
comment
Да, я видел это. Но я пока не могу работать с бета-версией. Спасибо большое. - person Ayman Salah; 18.06.2015

Хорошо, я понял это. Это было просто. Я сделал следующее:

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());
person Ayman Salah    schedule 18.06.2015