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()
}
}
私はコンテキストとユニバースを調べましたが、適切な方法が見つかりませんでした。
私が今までに見つけた解決策は、(コンテキストを介して)マクロの囲むクラス/メソッドを取得し、ツリーを検索することでした。私がこれまでに見つかった
まあしたが、その後、私はのは、値や変数、クラスのフィールドを宣言した方法を検査する必要があり、クラスはクラス5月、その後、入れ子にすることができます他のクラス/特性などからいくつかのフィールドを継承しています。全体的に見るとかなり多くの場所があります。情報がすでに利用可能かどうかは疑問でした(コンパイラはどこかにある必要があります。 – adamw
私は十分な答えを得るためにマクロを使った経験が足りませんが、もっと良いものは見つけられません(他のマクロで助けを借りるなど)。私はあなたがシンボルテーブルにアクセスできるとは思わない。一つ目は、シンボル表は変更可能であり、そのままアクセス可能ではありません。少なくとも、リフレクション/マクロAPIの他の部分との一貫性のために 'SymbolTableApi'のような、限られた読み込み専用バージョンとして公開する必要があります。しかし、そのようなクラス/形質が存在するようには見えません。 –
小ニット:私たちがここで探している言葉は「シンボルテーブル」だとは思わない。おそらく "範囲"がうまくいくでしょうか? @adamwは、マクロが実行されているスコープにあるものが何であっても見ることができるようにしたい。シンボルテーブルは、(私の経験ではとにかく)外部の消費のために(そしてJVMのケースでは、タイプ情報を失う忘れてしまったmanglingの)mangled名前になりがちな記号の静的なフラットリストのほうが多いです。おそらくスカラは物事を別の方法で行います。 –