Xtext formatting2 API - EList<EObject> 特征的内部缩进
Xtext formatting2 API - Interior indentation of an EList<EObject> feature
我正在跟进 Indent lines of text using Xtext formatting API 来问一个稍微不同的问题,现在我对我在说什么有了更多的了解。
我在使用格式 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]
}
}
我正在跟进 Indent lines of text using Xtext formatting API 来问一个稍微不同的问题,现在我对我在说什么有了更多的了解。
我在使用格式 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]
}
}