2017-07-08 8 views
0

私は現在Xtendアクティブアノテーション@Delegateの調整版であるアクティブアノテーションを作成しています。私はすでに、クラスDelegateProcessorとその内部クラスUtilの適合したコピーである醜いバージョンを持っています。しかし、これは私がクラス全体をコピーしたということは、2つのメソッドで数行のコードを適合させるだけであることを意味します。@Delegateアクティブ注釈のDelegateProcessorを拡張できますか?

DelegateProcessorUtilを変更して、変更する必要があるいくつかの方法を無効にしようとしました。最小限の設定(コードを参照)でさえ、これは動作しません。 Javadocのタグは私にこれをしないように勧めていますが、私は300行のコード全体をコピーする以外の手段はないとは思いません。

これは私の最小限の設定です:

import com.google.common.annotations.Beta 
import com.google.common.annotations.GwtCompatible 
import java.lang.annotation.Documented 
import java.lang.annotation.ElementType 
import java.lang.annotation.Target 
import java.util.List 
import org.eclipse.xtend.lib.annotations.Delegate 
import org.eclipse.xtend.lib.annotations.DelegateProcessor 
import org.eclipse.xtend.lib.macro.Active 
import org.eclipse.xtend.lib.macro.TransformationContext 
import org.eclipse.xtend.lib.macro.TransformationParticipant 
import org.eclipse.xtend.lib.macro.declaration.MutableMemberDeclaration 

/** 
* Copy of the Xtend {@link Delegate} annotation. 
*/ 
@Beta 
@GwtCompatible 
@Target(ElementType.FIELD, ElementType.METHOD) 
@Active(DelegateDeclaredProcessor) 
@Documented 
annotation DelegateDeclared { 
    /** 
    * Optional list of interfaces that this delegate is restricted to. 
    * Defaults to the common interfaces of the context type and the annotated 
    * element. 
    */ 
    Class<?>[] value = #[] 
} 

@Beta 
class DelegateDeclaredProcessor extends DelegateProcessor implements TransformationParticipant<MutableMemberDeclaration> { 

    override doTransform(List<? extends MutableMemberDeclaration> elements, extension TransformationContext context) { 
     val extension util = new Util(context) // Overridden to use my own Util class, which i want to adapt later on. 
     elements.forEach [ 
      if (validDelegate) { 
       methodsToImplement.forEach[method|implementMethod(method)] 
      } 
     ] 
    } 

    @Beta 
    static class Util extends DelegateProcessor.Util { // this is where I want to later override some methods. 
     new(TransformationContext context) { 
      super(context) 
     } 
    } 
} 

アノテーションを使用する場合、このコードは、次のエラーを生成します。

Error during annotation processing: 
java.lang.NullPointerException 
    at org.eclipse.xtend.lib.annotations.DelegateProcessor$Util.listedInterfaces(DelegateProcessor.java:258) 
    at org.eclipse.xtend.lib.annotations.DelegateProcessor$Util.areListedInterfacesValid(DelegateProcessor.java:184) 
    at org.eclipse.xtend.lib.annotations.DelegateProcessor$Util._isValidDelegate(DelegateProcessor.java:67) 
    at org.eclipse.xtend.lib.annotations.DelegateProcessor$Util.isValidDelegate(DelegateProcessor.java:592) 
    at jce.util.DelegateDeclaredProcessor.lambda$0(DelegateDeclaredProcessor.java:28) 
    at jce.util.DelegateDeclaredProcessor$$Lambda$15311/667735929.accept(Unknown Source) 
    at java.lang.Iterable.forEach(Iterable.java:75) 
    at jce.util.DelegateDeclaredProcessor.doTransform(DelegateDeclaredProcessor.java:36) 

は、ここでの問題は何ですか?間違ったことをやっているのですか、それともできないのですか? @Delegateのような既存のアクティブ注釈の適合バージョンを作成する別の方法はありますか?

+0

を逃すように見えますが、多分同じ使用のために同じエラーを生成元@Delegateアノテーションのですか? –

+0

いいえ、元の@Delegate注釈は正常に機能します。しかし、私自身はそうではありません。非常にシンプルな委任のためにそれを使用する場合でも。 – ConveniencePatterns

答えて

1

あなたには、いくつかのオーバーライド

@Beta 
static class Util extends DelegateProcessor.Util { // this is where I want to later override some methods. 

    extension TransformationContext context 

    new(TransformationContext context) { 
     super(context) 
     this.context = context 
    } 

    override getDelegates(TypeDeclaration it) { 
     declaredMembers.filter[findAnnotation(findTypeGlobally(DelegateDeclared)) !== null] 
    } 

    override listedInterfaces(MemberDeclaration it) { 
     findAnnotation(findTypeGlobally(DelegateDeclared)).getClassArrayValue("value").toSet 
    } 

} 
+0

それは本当に問題でした!ご助力ありがとうございます! – ConveniencePatterns

関連する問題