Formatting 引用元素的XText格式规则
我试图用一个简单的例子来描述这个问题。比方说,我有一个语法,看起来像这样:Formatting 引用元素的XText格式规则,formatting,xtext,Formatting,Xtext,我试图用一个简单的例子来描述这个问题。比方说,我有一个语法,看起来像这样: Model: rules+=Rule*; Rule: View | Element; Element: 'element' name=ID members+=Member members+=Member* 'end'; View: 'view' name=ID 'for' forElement=[Element] forMembers+=[Member] forMember
Model:
rules+=Rule*;
Rule:
View | Element;
Element:
'element' name=ID members+=Member members+=Member* 'end';
View:
'view' name=ID 'for' forElement=[Element]
forMembers+=[Member] forMembers+=[Member]* 'end';
Member:
'member' name=ID;
这种语言的一个简单例子是:
// Element is where the Members are instantiated
element Foo
member bar
member foobar
member barfoo
member something
end
// Views only reference the members by simple name
view FooView for Foo
bar
foobar
something
end
我有一个自定义作用域提供程序,用于查看规则的forMembers
属性:
class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
def scope_View_forMembers(View view, EReference reference) {
Scopes.scopeFor(view.forElement.members);
}
}
到目前为止一切都很好,我的问题来了:
我还有一个格式化程序,无法为引用的成员添加规则:
class MyDslFormatter extends AbstractDeclarativeFormatter {
@Inject extension MyDslGrammarAccess
override protected void configureFormatting(FormattingConfig c) {
// Rules for element: line breaks, indentation increment and decrement
c.setLinewrap(1).after(elementAccess.nameAssignment_1)
c.setLinewrap(1).after(elementRule)
c.setIndentationIncrement.after(elementAccess.nameAssignment_1)
c.setIndentationDecrement.before(elementAccess.endKeyword_4)
// Rules for view: line breaks, indentation increment and decrement
c.setLinewrap(1).after(viewAccess.forElementElementCrossReference_3_0)
c.setLinewrap(1).after(viewRule)
c.setIndentationIncrement.after(viewAccess.forElementElementCrossReference_3_0)
c.setIndentationDecrement.before(viewAccess.endKeyword_6)
//formatting for Member rule, only works, where Member rules are instantiated.
c.setLinewrap(1).after(memberRule)
}
}
如您所见,我已经为元素
和视图
规则以及成员
规则设置了格式。但是,成员
规则的格式仅适用于其实例化的(例如,元素
声明)。当我运行此格式化程序(Ctrl+Shift+F)时,我得到以下格式:
element Foo
member bar
member foobar
member barfoo
member something
end
view FooView for Foo
bar foobar something end
但是,我希望所有引用的成员也在一个新行中如何才能做到这一点?非常感谢您的帮助 成员在视图规则中被引用。必须在以下成员之后设置换行:
c.setLinewrap(1).after(viewAccess.forMembersAssignment_4)
c.setLinewrap(1).after(viewAccess.forMembersAssignment_5)