私は現在Xtendアクティブアノテーション@Delegate
の調整版であるアクティブアノテーションを作成しています。私はすでに、クラスDelegateProcessor
とその内部クラスUtil
の適合したコピーである醜いバージョンを持っています。しかし、これは私がクラス全体をコピーしたということは、2つのメソッドで数行のコードを適合させるだけであることを意味します。@Delegateアクティブ注釈のDelegateProcessorを拡張できますか?
DelegateProcessor
とUtil
を変更して、変更する必要があるいくつかの方法を無効にしようとしました。最小限の設定(コードを参照)でさえ、これは動作しません。 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
のような既存のアクティブ注釈の適合バージョンを作成する別の方法はありますか?
を逃すように見えますが、多分同じ使用のために同じエラーを生成元@Delegateアノテーションのですか? –
いいえ、元の@Delegate注釈は正常に機能します。しかし、私自身はそうではありません。非常にシンプルな委任のためにそれを使用する場合でも。 – ConveniencePatterns