Xtext formatting2 API-EList的内部缩进 功能

问题描述 投票:0回答:1

[我正在跟Indent lines of text using Xtext formatting API提出一个稍微不同的问题,现在我对我在说的东西有了更多的了解。

我在使用formatting2 API缩进分配给列表的元素时遇到麻烦。

这里是一个完整的示例,演示了该问题:

MyDsl.xtext

grammar org.xtext.example.mydsl.MyDsl hidden(WS)

import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    greeting=Greeting
;

Greeting:
    'Hello' ','? name=SIMPLE_WORD '!' NL+
    lines+=Line*
;

Line: {Line}
    SIMPLE_WORD+
    NL
;

terminal SIMPLE_WORD: 
    ('0'..'9' | 'a'..'z' | 'A'..'Z') 
    ('0'..'9' | 'a'..'z' | 'A'..'Z' | '-' | '_')*
;
terminal NL: ('\r'? '\n');
terminal WS: (' ' | '\t');

MyDslFormatter.xtend

class MyDslFormatter extends AbstractFormatter2 {

    @Inject extension MyDslGrammarAccess

    def dispatch void format(Model model, extension IFormattableDocument document) {
        model.greeting.format()

        println(document)
    }

    def dispatch void format(Greeting greeting, extension IFormattableDocument document) {
        for (line : greeting.lines) {
            line.format()
            line.prepend[indent]
        }
    }

    def dispatch void format(Line line, extension IFormattableDocument document) {
        // TODO...
    }
}

MyDslFormattingTest.xtend

@RunWith(XtextRunner)
@InjectWith(MyDslInjectorProvider)
class MyDslFormattingTest {

    @Inject extension FormatterTestHelper

    @Test
    def void indentLines() {
        assertFormatted[
            toBeFormatted = '''
                Hello, World!
                The quick brown fox
                Jumps over the lazy dog
            '''
            expectation = '''
                Hello, World!
                    The quick brown fox
                    Jumps over the lazy dog
            '''
        ]
    }
}

输出:

----------- RootDocument with ITextReplacers (syntax: <offset|text>) -----------
Hello, World!
<14|>The quick brown fox
<34|>Jumps over the lazy dog
--------------------------------------------------------------------------------
14 0 "": HiddenRegionReplacer: indentInc=1;indentDec=1
34 0 "": HiddenRegionReplacer: indentInc=1;indentDec=1

由于没有缩进,测试失败。

我已经尝试了很多方法来解决这个问题,但是每次我认为有什么用处时,总会导致indentInc=1;indentDec=1结果,导致缩进被抵消。

任何想法我做错了什么,或者如何解决这个问题?

干杯,谢谢!

eclipse formatting xtext
1个回答
0
投票

我能够通过考试

def dispatch void format(Greeting greeting, extension IFormattableDocument document)  {
    val begin = greeting.regionFor.ruleCallTo(NLRule)
    val end = greeting.lines.last.regionFor.ruleCallTo(NLRule)

    interior(begin, end)[indent]
    for (line : greeting.lines) {
        line.format
        line.prepend[indent]
    }
}

[Answer由Xtext社区论坛上的Tamás提供。

© www.soinside.com 2019 - 2024. All rights reserved.