2013-03-12 4 views
5

たとえば、マクロの呼び出しサイトですべての値とその型を取得するには? 少なくとも現在のクラスの値だけですか?たとえば、マクロ内のシンボルテーブルにアクセスできますか?

class A { 
    val v1 = 10 
    var v2 = "2" 

    def m { 
    val m3 = true 

    // Here I would like to get information that v1: Int, v2: String and 
    // v3: Boolean are available 
    macroInvocation() 
    } 
} 

私はコンテキストとユニバースを調べましたが、適切な方法が見つかりませんでした。

私が今までに見つけた解決策は、(コンテキストを介して)マクロの囲むクラス/メソッドを取得し、ツリーを検索することでした。私がこれまでに見つかった

答えて

2

唯一の解決策は、ツリーに(文脈によって)マクロの外側のクラス/メソッドを取得し、検索することです

私はあなたが実際に検査されていることを意味する気持ちを持っています宣言されたフィールドを抽出するためにAST自体あなたはそれをする必要はありません。 cがあなたのContext値である場合は、あなただけ行うことができます:はい、

c.enclosingClass.symbol.typeSignature.members 
+0

まあしたが、その後、私はのは、値や変数、クラスのフィールドを宣言した方法を検査する必要があり、クラスはクラス5月、その後、入れ子にすることができます他のクラス/特性などからいくつかのフィールドを継承しています。全体的に見るとかなり多くの場所があります。情報がすでに利用可能かどうかは疑問でした(コンパイラはどこかにある必要があります。 – adamw

+0

私は十分な答えを得るためにマクロを使った経験が足りませんが、もっと良いものは見つけられません(他のマクロで助けを借りるなど)。私はあなたがシンボルテーブルにアクセスできるとは思わない。一つ目は、シンボル表は変更可能であり、そのままアクセス可能ではありません。少なくとも、リフレクション/マクロAPIの他の部分との一貫性のために 'SymbolTableApi'のような、限られた読み込み専用バージョンとして公開する必要があります。しかし、そのようなクラス/形質が存在するようには見えません。 –

+0

小ニット:私たちがここで探している言葉は「シンボルテーブル」だとは思わない。おそらく "範囲"がうまくいくでしょうか? @adamwは、マクロが実行されているスコープにあるものが何であっても見ることができるようにしたい。シンボルテーブルは、(私の経験ではとにかく)外部の消費のために(そしてJVMのケースでは、タイプ情報を失う忘れてしまったmanglingの)mangled名前になりがちな記号の静的なフラットリストのほうが多いです。おそらくスカラは物事を別の方法で行います。 –

関連する問題