【发布时间】:2015-06-29 16:57:31
【问题描述】:
我正在阅读“使用 xtext 和 xtend 实现 DSL”一书,它说当使用上下文菜单中的格式或使用它的快捷方式“Ctrl + Shift + F”时会调用格式化程序。它还说“如果您提供自定义格式化程序,这不仅会在调用格式菜单时使用,而且还会在 xtext 需要在手动修改 AST 模型后更新编辑器内容时使用(例如执行语义修改的快速修复) ”。
话虽如此,我遇到了一个问题,即当我的 quickfix 被调用时,格式化程序没有被调用,导致文本看起来很糟糕。 示例:
----1-----
---快速修复前的文字---
entity myentity {
FooBar s;
} entity second{}
----2-----
---Quickfix 添加未实现的实体---
entity myentity {
FooBar s;
} entity FooBar {
} entity second{}
----3-----
---手动调用格式化程序(它应该是什么样子)---
entity myentity {
FooBar s;
}
entity FooBar {
}
entity second {
}
QuickFix 实施:
@Fix(Diagnostic::LINKING_DIAGNOSTIC)
def CreateMissingEntity(Issue issue, IssueResolutionAcceptor acceptor)
{
acceptor.accept(issue,"Create missing entity.","Create missing entity.", "" ,
[element, context |
val currentEntity = element.getContainerOfType(typeof(Entity))
val model = currentEntity.eContainer as Model
model.entities.add(model.entities.indexOf(currentEntity)+1, EntitiesFactory::eINSTANCE.createEntity() => [name = context.xtextDocument.get(issue.offset,issue.length)])
]
);
}
格式化程序实现:
@Inject extension EntitiesGrammarAccess g
override protected void configureFormatting(FormattingConfig c) {
//entitites
val e = g.entityAccess
// indentation between {}
c.setIndentation(e.leftCurlyBracketKeyword_3,e.rightCurlyBracketKeyword_5)
// newline after {
c.setLinewrap.after(e.leftCurlyBracketKeyword_3)
// newlines after }
c.setLinewrap(2).after(e.rightCurlyBracketKeyword_5)
//attributes
val a = g.attributeAccess
// newline after ;
c.setLinewrap.after(a.semicolonKeyword_2)
// remove spaces before ;
c.setNoSpace.before(a.semicolonKeyword_2)
c.setLinewrap(0, 1, 2).before(SL_COMMENTRule)
c.setLinewrap(0, 1, 2).before(ML_COMMENTRule)
c.setLinewrap(0, 1, 1).after(ML_COMMENTRule)
}
如果在快速修复后实际上调用了格式化程序,我一直在搜索,但什么也没找到。这是真的吗?如果不是,我如何从 quickfix 代码中以编程方式调用格式化程序。
【问题讨论】:
标签: eclipse-plugin xtext xtend