2013-03-26 43 views
7

我有一個表示包,對象和類的符號列表,並且想要在宏上下文中導入它們。在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

搶關於進口更多的提示,反映等通過源代碼我還沒有用'TreeGen'完成這個工作,但是如果你在一個普通的舊宏中編寫這個,你需要將'sym.name'(它現在是'TypeName')改成'TermName'。 – 2013-07-08 12:02:15

+0

如何做到這一點?我想我嘗試了'asTerm',但那不起作用。 – soc 2013-07-08 12:16:56

+1

下面是[一個簡單的例子](https://gist.github.com/travisbrown/5948460),它將你的代碼和我正在研究的實驗結合起來。無論您是否將'TypeName'轉換爲'TermName',但只有'TermName'版本可以工作,相同的東西都會被打印出來。 – 2013-07-08 12:43:09

回答