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

Xtext 2.8+ formatter, formatting HiddenRegion with comment

我正在使用 Xtext 2.9 格式化程序,我正在尝试 格式化包含 comment 的 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    ")]

这个缩进在评论之前而不是在评论之后。如果在 'error' 关键字之前有单行注释,这会导致格式不正确。

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

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

这是预期结果:(左边一个space)

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

如何将我的字符直接放在关键字 'error' 之前而不是评论之前? 谢谢。

我假设您正在创建缩进敏感的语言,因为您明确调用了 BEGINEND

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

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

您使用的方法 append[] 和 prepend[] 与评论无关,稍后会调用 applyHiddenRegionFormatting() 来决定如何在评论之间编织格式。

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

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

对于 not 对空格敏感的语言 lexing/parsing(这是默认设置),答案是 not 调用setSpace() 创建缩进或换行。

相反,

pkg.interior[indent]
pkg.regionFor.keyword(":").append[newLine]
pkg.append[newLine]