【问题标题】:Imports and wildcard imports of Symbols in ScalaScala 中符号的导入和通配符导入
【发布时间】:2013-03-16 00:07:58
【问题描述】:

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

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

给定一个由some.packagesome.Classsome.Object 组成的List[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) // <--- ?????

包/模块导入有效,但类导入不起作用,尽管看起来正确。

【问题讨论】:

  • 我还没有用TreeGen 的东西来做这个,但是如果你用一个普通的旧宏来写这个,你需要改变sym.name(目前是TypeName ) 转换成TermName
  • 如何做到这一点?我想我尝试了asTerm,但没有奏效。
  • 这是a quick example,它将您的代码与我不久前进行的一项实验相结合。无论您是否将TypeName 转换为TermName,都会打印相同的内容,但只有TermName 版本有效。
  • 谢谢,我想通了! gen.mkImport(sym.enclosingPackage, sym.name.toTermName, sym.name.toTermName) 工作!

标签: class scala macros import scala-macros


【解决方案1】:

您需要像这样获取 "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)

您可以通过http://xuwei-k.github.io/scala-compiler-sxr/scala-compiler-2.10.0/scala/reflect/internal/Importers.scala.html的源代码获取有关导入、反射等的更多提示

【讨论】:

    最近更新 更多