通过Xtend ActiveAnnotations实现自动接口

时间:2014-06-02 14:08:45

标签: java code-generation xtend

我们说,我有一个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吗?有没有其他方法可以实现我的目标?

2 个答案:

答案 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