我们说,我有一个Java界面:
public interface IMyInterface {
void hello(String who);
}
我想用Xtend创建一个活动注释,它自动(并且通常)为Xtend类实现该接口。所以,当我写
时@InterfaceImplementor
class MyInterfaceImplementation implements IMyInterface {
}
我希望Xtend生成
@InterfaceImplementor
@SuppressWarnings("all")
public class MyInterfaceImplementation implements IMyInterface {
public void hello(final String who) {
delegate.hello(who);
}
}
我到目前为止:
@Active(typeof(ImplementationGenerator))
annotation InterfaceImplementor{}
class ImplementationGenerator implements TransformationParticipant<MutableClassDeclaration> {
override doTransform(List<? extends MutableClassDeclaration> annotatedTargetElements, extension TransformationContext context)
{
for(element : annotatedTargetElements)
{
for(method : element.declaredMethods)
{
implementMethod(element, method, context)
}
}
}
def implementMethod(MutableClassDeclaration clazz, MutableMethodDeclaration method, extension TransformationContext context)
{
method.body = ['''delegate.«method.simpleName»(«method.callParameters»);''']
}
def callParameters(MutableMethodDeclaration method)
{
method.parameters.map[ simpleName ].join(', ')
}
}
只要我覆盖目标类中的每个方法,这都有效:
@InterfaceImplementor
class MyInterfaceImplementation implements IMyInterface {
override hello(String who) {}
}
但是,我实际上希望Xtend生成整个类体,而不必手动声明每个方法。为此,我尝试在活动注释中使用element.implementedInterfaces
,但这些仅仅是TypeReference
s,我不知道如何从类型引用中获取声明的方法。所以这就是我被困住的地方。
在活动注释评估期间甚至可以解析TypeReference
吗?有没有其他方法可以实现我的目标?
答案 0 :(得分:2)
“element.declaredMethods”返回本地声明的方法(即在您的情况下为空)。您需要遍历已实现接口的方法,然后在当前注释目标中创建新方法。
答案 1 :(得分:1)
您还可以查看新的Xtend内置@Delegate注释。
此示例取自发行说明(https://eclipse.org/xtend/releasenotes.html):
interface I {
def void m1()
def void m2()
def void m3()
}
class A implements I {
override m1() {}
override m2() {}
override m3() {}
}
class B implements I {
//all methods automatically implemented
@Delegate A delegate = new A
}
以下是Xtend在线文档中相关部分的链接:https://eclipse.org/xtend/documentation/204_activeannotations.html