2013-03-26 5 views
7

私は、パッケージ、オブジェクト、クラスを表すSymbolのリストを持っており、それらをマクロコンテキストでインポートしたいと考えています。Scalaのシンボルのインポートとワイルドカードのインポート

パッケージとオブジェクトの場合、これはワイルドカードのインポートを意味し、クラスの場合は "標準"インポートを意味します。

考えるList[Symbol]どのように私は適切にそれらをインポートするだろうし、どのように私は、「標準」またはワイルドカードのインポートを使用する必要があるかどうかを決めることができ、some.packagesome.Classsome.Objectからなりますか?

私の現在のアプローチはこれです:

def importPackageOrModuleOrClass(sym: Symbol): Import = 
    if (sym.isPackage || sym.isModule) // e. g. import scala._, scala.Predef 
    gen.mkWildcardImport(sym) 
    else        // e. g. import java.lang.String 
    gen.mkImport(sym.enclosingPackage, sym.name, sym.name) // <--- ????? 

パッケージ/モジュールのインポート作品が、それは正しい見えますが、クラスのインポートにはありません。

+1

でソースコードを経由してなど、あなたが反映して、輸入に関するより多くのヒントをつかむことができ

def importPackageOrModuleOrClass(sym: Symbol): Import = if (sym.isPackage || sym.isModule) gen.mkWildcardImport(sym) else gen.mkImport(sym.enclosingPackage, sym.name.toTermName, sym.name.toTermName) 

... 「TERMNAME」このようなを取得する必要があります'TreeGen'を使ってこれを行いましたが、これを普通の古いマクロで書いていたならば、' sym.name'(現在は 'TypeName'です)を' TermName'に変更する必要があります。 –

+0

どうすればいいですか?私は 'asTerm'を試したと思うが、うまくいかなかった。 – soc

+1

私はしばらく前に取り組んでいた実験とあなたのコードを組み合わせた[簡単な例](https://gist.github.com/travisbrown/5948460)です。 'TypeName'を' TermName'に変換するかどうかにかかわらず、 'TermName'バージョンだけが動作するかどうかにかかわらず、同じことが出力されます。 –

答えて

関連する問題