Xtext 2.8+格式化程序,使用注释格式化HiddenRegion

时间:2016-04-21 14:03:26

标签: eclipse formatting xtext xtend

我正在使用Xtext 2.9格式化程序,我正在尝试格式化hiddenRegion ,其中包含评论。以下是我想要格式化的文档区域的一部分:

Columns: 1:offset 2:length 3:kind 4: text 5:grammarElement
Kind: H=IHiddenRegion S=ISemanticRegion B/E=IEObjectRegion

35  0 H
35 15 S ""xxx::a::b""        Refblock:namespace=Namespace
50  0 H
50  1 S "}"                  Refblock:RCBRACKET
      E Refblock             PackageHead:Block=Refblock path:PackageHead/Block=Package'xxx_constants'/head=Model/packages[0]
51  0 H
51  1 S ":"                  PackageHead:COLON
      E PackageHead          Package:head=PackageHead path:Package'xxx_constants'/head=Model/packages[0]
52    >>>H "\n    "             Whitespace:TerminalRule'WS'
        "# asd"              Comment:TerminalRule'SL_COMMENT'
   15   "\n    "             Whitespace:TerminalRule'WS'<<<
      B Error'ASSD'          Package:expressions+=Expression path:Package'xxx_constants'/expressions[0]=Model/packages[0]
67  5 S "error"              Error:'error'
72  1 H " "                  Whitespace:TerminalRule'WS'

和语法的相应部分

Model:
    {Model}
    (packages+=Package)*;

Expression:
    Error | Warning | Enum | Text;

Package:
    {Package}
    'package' name=Name head=PackageHead
    (BEGIN
    (imports+=Import)*
    (expressions+=Expression)*
    END)?;

Error:
    {Error}
    ('error') name=ENAME parameter=Parameter COLON
    (BEGIN
    (expressions+=Estatement)+
    END)?;

PackageHead:
    Block=Refblock COLON;

问题是当我尝试在错误关键字之前添加一些字符时 例如

error.regionFor.keyword('error').prepend[setSpace("\n    ")]

此缩进在评论之前加上而不在其后面。如果在“错误”关键字之前进行单行注释,则会导致格式不正确。

为了更清晰,这里是我的语法的示例代码和所需行为的描述:

package xxx_constants {namespace="xxx::a::b"}:
     # asd
     error ASSD {0}:
         Hello {0,world}

预期结果 :(左侧一个空格)

package xxx_constants {namespace="xxx::a::b"}:
    # asd
    error ASSD {0}:
         Hello {0,world}

这是带有前置方法的实际结果

package xxx_constants {namespace="xxx::a::b"}:
    # asd
error ASSD {0}:
         Hello {0,world}

正如文档结构所说,HiddenRegion在这种情况下是声明:

# asd
    error

如何在关键字“错误”之前直接添加我的字符​​,而不是在评论之前?谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您正在创建缩进敏感语言,因为您明确地调用了public function handle() { \App\Investment::calculate(); sleep(30); \App\Investment::calculate(); } BEGIN

对于缩进敏感语言,我的答案是:您要覆盖

END

方法append []和prepend []你正在使用对注释是不可知的,稍后调用applyHiddenRegionFormatting()来决定如何在注释之间编织格式。

要使Xtext使用您自己的HiddenRegionReplacer子类,请覆盖

org.eclipse.xtext.formatting2.internal.HiddenRegionReplacer.applyHiddenRegionFormatting(List<ITextReplacer>)

对于的语言,执行空格敏感的lexing / parsing(默认情况下),答案是调用setSpace()来创建缩进或换行。

相反,做

org.eclipse.xtext.formatting2.AbstractFormatter2.createHiddenRegionReplacer(IHiddenRegion, IHiddenRegionFormatting)