3

Xtend を使用して、Xtext 言語の Eclipse UI プラグイン用のカスタム QuickFixes を作成しています。アイデアは、のメソッドを拡張org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProviderして使用することです。acceptorg.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor

acceptには、次のようなオーバーロードされたシグネチャがいくつかあります。

  • void accept(Issue issue, String label, String description, String image, IModification modification)
  • void accept(Issue issue, String label, String description, String image, ISemanticModification semanticModification)

Xtend のラムダ式の構文を使用すると、これらのシグネチャの最初のものを簡単に使用できます。

@Fix(MyDSLValidator::INVALID_TYPE_NAME)
def removeInitialUnderscore(Issue issue, IssueResolutionAcceptor acceptor) {
    acceptor.accept(issue,
    "Remove initial underscore",
    "Remove initial underscore",
    'upcase.png')
    [
        context |
        context.xtextDocument.replace(issue.offset, 1, "")
    ]
}

Xtend コンパイラは、次の Java コードを生成します。

public void removeInitialUnderscore(final Issue issue, final IssueResolutionAcceptor acceptor) {
  final IModification _function = new IModification() {
    public void apply(final IModificationContext context) throws Exception {
      IXtextDocument _xtextDocument = context.getXtextDocument();
      Integer _offset = issue.getOffset();
      _xtextDocument.replace((_offset).intValue(), 1, "");
    }
  };
  acceptor.accept(issue, 
    "Remove initial underscore", 
    "Remove initial underscore", 
    "upcase.png", _function);
}

ここで、文字列だけでなく、基礎となる EMF モデルにアクセスできるように、ISemanticModification代わりにを使用する 2 つ目の QuickFix を書きたいと思います。IModificationただし、使用したいメソッドのオーバーロードを Xtend コンパイラに伝えるのに苦労しています。

@Fix(MyDSLValidator::MISSING_USAGE)
def addMissingUseStatement(Issue issue, IssueResolutionAcceptor acceptor) {
    acceptor.accept(issue,
    "Add missing use statement",
    "Add missing use statement",
    "upcase.png",
    [
        EObject element |
        (element.eContainer as MyContainer).usages.add(
                    (element as MyElement).myattr.eContainer as MyOtherContainer
                )
    ])
}

IModificationXtend は、常に an の代わりに anを渡したいと考えISemanticModification、コンパイルされた Java コードでエラーを生成します。これは、2 つのメソッドのapplyシグネチャがIModification異なりIModificationContext、.ISemanticModificationEObject

@Fix(MyDSLValidator.MISSING_USAGE)
public void addMissingUseStatement(final Issue issue, final IssueResolutionAcceptor acceptor) {
  final IModification _function = new IModification() {
    public void apply(final IModificationContext element) throws Exception {
      EObject _eContainer = element.eContainer(); // COMPILE ERROR
      EList<Circuit> _usages = ((MyContainer) _eContainer).getUsages();
      MyAttr _myattr = ((MyAttr ) element).getMyattr();
      EObject _eContainer_1 = _myattr.eContainer();
      _usages.add(
        ((MyOtherContainer) _eContainer_1));
    }
  };
  acceptor.accept(issue, 
    "Add missing use statement", 
    "Add missing use statement", 
    "upcase.png", _function);
}

どのオーバーロードを使用するかを Xtend に伝えるにはどうすればよいですか? 私の知る限り、Xtend で無名オブジェクトを作成することはできないため、別の方法で をIssueResolutionAcceptor.accept渡す必要がありますISemanticModification

4

1 に答える 1

2

ISemanticModification は 2 つの引数を受け入れますが、IModification は 1 つの引数のみを使用します。セマンティックな変更を実装するには、それぞれ 2 つのパラメーターを持つラムダを使用する必要があります。

acceptor.accept(issue,
    "Add missing use statement",
    "Add missing use statement",
    "upcase.png") [ element, context |
      ..
    ]
于 2013-09-12T14:31:46.700 に答える