Java Xtext QuickFix API的Xtend lambda表达式重载

Java Xtext QuickFix API的Xtend lambda表达式重载,java,eclipse,lambda,xtext,xtend,Java,Eclipse,Lambda,Xtext,Xtend,我正在使用Xtend为我的Xtext语言的eclipseui插件编写自定义快速修复程序。其思想是扩展org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider,并使用org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor的accept方法调用 accept具有多个重载签名,包括: void accept(问题、字符串标签、字符串描述、字符串图像、IModificati

我正在使用Xtend为我的Xtext语言的eclipseui插件编写自定义快速修复程序。其思想是扩展
org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
,并使用
org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor的
accept
方法调用

accept
具有多个重载签名,包括:

  • void accept(问题、字符串标签、字符串描述、字符串图像、IModification修改)
  • void accept(问题、字符串标签、字符串描述、字符串图像、ISemanticModification语义修改)
使用Xtend的lambda表达式语法,使用第一个签名很容易:

@Fix(MyDSLValidator::无效的\u类型\u名称)
def removeInitialUnderscore(发行发行、发行解决方案接受者){
承兑人,承兑人,
“删除初始下划线”,
“删除初始下划线”,
'upcase.png')
[
上下文|
context.xtextDocument.replace(issue.offset,1,“”)
]
}
Xtend编译器生成以下Java代码:

public void removeInitialUnderscore(最终发行发行、最终发行解决方案接收人){
最终IModification_函数=新IModification(){
public void apply(最终IModificationContext上下文)引发异常{
IXtextDocument_xtextDocument=context.getxtDocument();
整数_offset=issue.getOffset();
_xtextDocument.replace((_offset).intValue(),1,“”);
}
};
承兑人,承兑人,
“删除初始下划线”,
“删除初始下划线”,
“upcase.png”,_函数);
}
现在,我想编写第二个快速修复程序,它使用
ISemanticModification
而不是
IModification
,这样我就可以访问底层EMF模型,而不仅仅是字符串。但是,我很难告诉Xtend编译器我要使用哪个重载方法:

@Fix(MyDSLValidator::缺少\u用法)
def ADDMISSINGUESStatement(发行发行、发行解决方案接收者或接收者){
承兑人,承兑人,
“添加缺少的use语句”,
“添加缺少的use语句”,
“upcase.png”,
[
对象元素|
(element.ecoContainer作为MyContainer)。usages.add(
(元素作为MyElement)。myattr.eContainer作为MyOtherContainer
)
])
}
Xtend总是认为我要传递一个
IModification
而不是
ismanticmodification
,并在编译的java代码中生成一个错误,因为这两个
apply
方法具有不同的签名,
IModification
采用
IModificationContext
,而
ismanticmodification
采用
EObject

@Fix(MyDSLValidator.MISSING_用法)
公开无效添加缺失声明(最终发行、最终发行解决方案接收者或接收者){
最终IModification_函数=新IModification(){
public void apply(最终IModificationContext元素)引发异常{
EObject _ecocontainer=element.ecocontainer();//编译错误
EList _usages=((MyContainer)_ecoContainer).getUsages();
MyAttr_MyAttr=((MyAttr)元素).getMyattr();
EObject_ecocontainer_1=_myattr.ecocontainer();
_用法.添加(
((MyOtherContainer)_ecocontainer_1));
}
};
承兑人,承兑人,
“添加缺少的use语句”,
“添加缺少的use语句”,
“upcase.png”,_函数);
}

如何告诉Xtend使用哪个重载?据我所知,在Xtend中不可能创建匿名对象,因此需要有另一种方法来调用
IssueResolutionAcceptor.accept
传递
ISemanticModification

ISemanticModification接受两个参数,其中IModification只使用一个参数。要实现语义修改,应使用一个lambda,该lambda分别具有两个参数:

acceptor.accept(issue,
    "Add missing use statement",
    "Add missing use statement",
    "upcase.png") [ element, context |
      ..
    ]