[我正在跟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
结果,导致缩进被抵消。
任何想法我做错了什么,或者如何解决这个问题?
干杯,谢谢!
我能够通过考试
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]
}
}