Class Scala中符号的导入和通配符导入

Class Scala中符号的导入和通配符导入,class,scala,macros,import,scala-macros,Class,Scala,Macros,Import,Scala Macros,我有一个代表包、对象和类的符号列表,希望在宏上下文中导入它们 对于包和对象,这意味着通配符导入,对于类,这意味着“标准”导入 给定一个由一些.package、一些.Class和一些.Object组成的列表[Symbol],我如何正确导入它们,以及如何决定需要使用“标准”还是通配符导入 我目前的做法是: def importPackageOrModuleOrClass(sym: Symbol): Import = if (sym.isPackage || sym.isModule) // e.

我有一个代表包、对象和类的符号列表,希望在宏上下文中导入它们

对于包和对象,这意味着通配符导入,对于类,这意味着“标准”导入

给定一个由
一些.package
一些.Class
一些.Object
组成的
列表[Symbol]
,我如何正确导入它们,以及如何决定需要使用“标准”还是通配符导入

我目前的做法是:

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) // <--- ?????
def importpackage或moduleorclass(sym:Symbol):导入=
if(sym.isPackage | | sym.isModule)//e。G导入scala.\u,scala.Predef
通用输入(sym)
else//e。G导入java.lang.String
gen.mkImport(sym.enclosuringpackage,sym.name,sym.name)//您需要像这样获取“TermName”

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

你可以通过

上的源代码获取更多关于导入、反射等的提示。我没有使用
TreeGen
之类的东西,但是如果你是在一个常规的旧宏中编写的,你需要将
sym.name
(当前是
TypeName
)更改为
TermName
。怎么做?我想我试过asTerm,但没有成功。下面是一个结合了你的代码和我前一段时间正在做的一个实验的例子。无论您是否将
TypeName
转换为
TermName
,都会打印相同的内容,但只有
TermName
版本可以工作。谢谢,我找到了它
gen.mkImport(sym.enclosuringpackage,sym.name.toTermName,sym.name.toTermName)
works!