1

Macro Paradise を使用して Scala 2.10.3 を使用しています。オブジェクトに特性を追加しようとしているマクロ注釈があります。

@MyAnnotation
object Foo extends Bar {}

拡張後、次のようなものが必要です。

object Foo extends Bar with Baz {}

Bazコンパイル スコープでアクセス可能な特性はどこにありますか。マクロ パラダイスを使用すると、ターゲット ツリーをきれいに分解できます。

q"object $obj extends ..$bases { ..$body }" = tree

bases は、既存の拡張機能を List of Ident(newTypeName("Bar")) の形式で保持します。

basesに追加のBazエントリを追加してツリーを再構築するだけで済みますが、問題は、ターゲットに「すでに」 が含まれている可能性があることBazです。この場合、私はそれを追加したくありません。私に与えられた用語の名前は短縮されています。それらをマクロ内の実際の型参照に変換する方法はありますか?

マクロで次のことを試しましたc.typeCheck(Ident(newTypeName("Baz")))が、次のエラーが発生します。

scala.reflect.macros.TypeCheckException: trait some.Baz is not a value

コンテキストを調べて、使用する他の明らかな方法があるかどうかを確認しましたが、飛び出すものはありません。

どんな助けでも大歓迎です!

4

1 に答える 1