Eclipse plugin 使用xtext的快速修复格式
我在读《用xtext和xtend实现DSL》一书,书中说,当使用上下文菜单中的格式或使用快捷方式“Ctrl+Shift+F”时,会调用格式化程序。它还说,“如果您提供了自定义格式化程序,则不仅在调用“格式”菜单时使用,而且在手动修改AST模型(例如,执行语义修改的快速修复程序)后,当xtext需要更新编辑器内容时也会使用此程序。” 尽管如此,我遇到了一个问题,即当调用我的quickfix时,格式化程序没有被调用,从而导致了一个外观糟糕的文本。 例如: ----一,----- ---快速修复前的文本--- ----二,----- ---快速修复添加未实现的实体--- ----三,----- ---手动调用格式化程序(其外观) 快速修复实施:Eclipse plugin 使用xtext的快速修复格式,eclipse-plugin,xtext,xtend,Eclipse Plugin,Xtext,Xtend,我在读《用xtext和xtend实现DSL》一书,书中说,当使用上下文菜单中的格式或使用快捷方式“Ctrl+Shift+F”时,会调用格式化程序。它还说,“如果您提供了自定义格式化程序,则不仅在调用“格式”菜单时使用,而且在手动修改AST模型(例如,执行语义修改的快速修复程序)后,当xtext需要更新编辑器内容时也会使用此程序。” 尽管如此,我遇到了一个问题,即当调用我的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)
}
格式化程序实现:
@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)
}
我一直在搜索格式化程序是否真的像书中所说的那样在快速修复后被调用,但什么也没有找到。这是真的吗?如果不是,我如何从快速修复代码中以编程方式调用格式化程序。这是一个可以而是一个点
public class MyDslUiModule extends org.xtext.example.mydsl1.ui.AbstractMyDslUiModule {
public MyDslUiModule(AbstractUIPlugin plugin) {
super(plugin);
}
public Class<? extends ITextEditComposer> bindITextEditComposer() {
return MyDslTextEditComposer.class;
}
}
public class MyDslTextEditComposer extends DefaultTextEditComposer {
@Override
protected SaveOptions getSaveOptions() {
return SaveOptions.newBuilder().format().getOptions();
}
}
公共类MyDslUiModule扩展org.xtext.example.mydsl1.ui.AbstractMyDslUiModule{
公共MyDslUiModule(AbstractUIPlugin插件){
超级(插件);
}
public Class发现这个线程很有用,我想问,有没有办法做到这一点,每当用户完成编写代码时,它会自动格式化(或在运行时),而不使用(ctrl+shift+f).以上建议仅适用于quickfix。嗯,请您澄清代码,它具体做什么?它在什么文件中?据我所知,它会触发“保存”格式这是写的吗?我想实现的是在快速修复上触发格式。它确实有效。但我真的不知道为什么。代码根本没有暗示这一点。多谢了。代码只是在快速修复上启用格式。默认情况下,它是关闭的。非常感谢。我在xtext上遇到了其他问题。你介意帮忙吗?@christiancreate此处或eclipse xtext论坛中的新问题是的。提出一个问题,我将为您回答。好的,我发布了一个新问题,请访问此。
public class MyDslUiModule extends org.xtext.example.mydsl1.ui.AbstractMyDslUiModule {
public MyDslUiModule(AbstractUIPlugin plugin) {
super(plugin);
}
public Class<? extends ITextEditComposer> bindITextEditComposer() {
return MyDslTextEditComposer.class;
}
}
public class MyDslTextEditComposer extends DefaultTextEditComposer {
@Override
protected SaveOptions getSaveOptions() {
return SaveOptions.newBuilder().format().getOptions();
}
}