从scala宏的上下文中获取资源路径文件

时间:2013-12-11 04:23:34

标签: scala scala-macros scala-2.11

我想创建一个宏,在编译时验证其他项目中是否存在资源。是否有可能从上下文中获取此信息?

  def example_impl(c: Context): c.Expr[Unit] = {
    import c.universe._
    //instead of  
    // val r = this.getClass().getResource("/file.txt")

    val r = c.somthing.getResource("/file.txt")
    //...
  }

可能无法实现。但如果是的话,我想知道该怎么做。

2 个答案:

答案 0 :(得分:1)

让我们首先考虑什么是“资源”。资源是可以从类路径中的目录开始找到的文件。请注意,为此,jar文件是一个目录,因为它存储了一个zip文件系统。类路径是运行Java 时可用的环境信息。

还有一个根本问题:Scala编译器不知道这些资源在哪里!它接收源文件进行编译,可能是目的地目录,它有自己的类路径,但它们与运行scalac有关,而与scalac编译的代码无关。 / p>

不是“生成”资源的编译器 - 既不是scalac,也不是javac。它是其他工具,例如jar(命令行工具),并且通常由其他工具调用,例如构建系统(ant,maven,sbt)。

因此,没有关于可以找到这些资源的位置的信息 - 它们通常位于与源代码分开的目录中。您可以使用普通的Scala文件i / o支持来遍历目录等,但是在编译时没有“资源”信息可用。

答案 1 :(得分:1)

我最终确实使用了Context.classpath

https://github.com/marklemay/sacala-validation-macros/blob/master/macroHost2/src/main/scala/macroHost/Macros.scala

但是我只在scala IDE(eclipse)中测试过它。在我对它充满信心之前,它必须在sbt,intelij,maven和scalac中进行测试。