我正在使用 Xtend 为我的 Xtext 语言的 Eclipse UI 插件编写自定义 QuickFixes。这个想法是扩展 org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
并使用调用 org.eclipse.xtext.ui 的
.accept
方法.editor.quickfix.IssueResolutionAcceptor
accept
有几个重载的签名,包括:
void accept(Issue问题,String标签,String描述,String图片,IModification修改)
void accept(Issue issue,String label,String description,String image,ISemanticModification semanticModification)
使用 Xtend 的 lambda 表达式语法可以轻松使用这些签名中的第一个:
@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);
}
现在我想编写第二个使用 ISemanticModification
而不是 IModification
的 QuickFix,这样我就可以访问底层 EMF 模型,而不仅仅是字符串。但是,我很难告诉 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
)
])
}
Xtend 总是认为我想传递 IModification
而不是 ISemanticModification
并在编译的 java 代码中产生错误,因为这两个 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
。
最佳答案
ISemanticModification 接受两个参数,而 IModification 只使用一个参数。要实现语义修改,您应该使用分别带有两个参数的 lambda:
acceptor.accept(issue,
"Add missing use statement",
"Add missing use statement",
"upcase.png") [ element, context |
..
]
关于java - Xtend lambda 表达式重载 Xtext QuickFix API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18764059/