【问题标题】:quickfix format using xtext使用 xtext 的 quickfix 格式
【发布时间】: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


    【解决方案1】:

    这是一个可以,一个

    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();
        }
    
    }
    

    【讨论】:

    • 嗯,请您澄清一下代码它的作用是什么?它在什么文件中?从我看到的情况来看,它触发了“保存”的格式是这样写的吗?我想要实现的是在 quickfix 上触发格式。
    • 它确实有效。但我真的不知道为什么。该代码根本不暗示这一点。非常感谢
    • 该代码只是在快速修复上启用了格式化。默认情况下它是关闭的。
    • 非常感谢。我在使用 xtext 时遇到其他问题,您介意帮忙吗? @克里斯蒂安
    • 在此处或在 Eclipse xtext 论坛中创建新问题
    【解决方案2】:

    发现这个线程很有用,我想问有没有办法做到这一点,每当用户完成编写代码时,它会自动格式化(或在运行时),而无需 (ctrl+shift+f)。以上建议仅适用于快速修复。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多