Xtend を使用して、Xtext 言語の Eclipse UI プラグイン用のカスタム QuickFixes を作成しています。アイデアは、のメソッドを拡張org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
して使用することです。accept
org.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
)
])
}
IModification
Xtend は、常に an の代わりに anを渡したいと考えISemanticModification
、コンパイルされた Java コードでエラーを生成します。これは、2 つのメソッドのapply
シグネチャがIModification
異なりIModificationContext
、.ISemanticModification
EObject
@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
。