强制丢失资源的编译错误

时间:2012-10-13 14:57:44

标签: scala resources compiler-errors

是否有可能使Scala(或从Scala调用的Java)检查资源是否在编译时丢失,如果缺少则抛出编译错误?

我正在与许多开发人员合作开发一个大型Java / Scala混合项目,而我正在提供一个Scala组件,该组件在系统运行结束时就会启动。因此,如果我的组件抛出了缺少的资源运行时错误,那么它才会被发现很晚。我试图确保我的资源在那里,所以这不会发生。但好几次,主管工程师决定改变方向,我的资源改变了路径,我不知道所以没有改变我的代码,然后由于缺少资源,代码在我的组件中死亡。我们正在进行更集中的资源控制,但与此同时,是否有可能使Scala在丢失的资源上抛出编译错误?主要是好奇心,但如果结果很简单就可以实施。

ETA:关于构建工具的问题。这并不简单,因为每个人都在使用自己的环境。有些人正在使用eclipse,有些是netbeans,我正在使用emacs + sbt。因此,即使我插入了sbt检查,对于使用eclipse的其他人也没关系。

3 个答案:

答案 0 :(得分:3)

在2.10中,绝对有可能借助宏和字符串插值:

object CheckResource {

  import scala.reflect.macros.Context
  import scala.language.experimental.macros

  implicit class StringResource(sc: StringContext) {
    def res(): String = macro __res
  }

  def __res(c: Context)(): c.Expr[String] = {
    import c.universe._
    val str = c.prefix.tree match {
      case Apply(_, List(Apply(_, List(Literal(Constant(const: String)))))) =>
        if (!new java.io.File(const).exists())
          c.abort(c.enclosingPosition, s"file '$const' does not exist")
        else Literal(Constant(const))
    }
    c.Expr(str)
  }
}

scala> import CheckResource._
import CheckResource._

scala> val file = new java.io.File("test")
file: java.io.File = test

scala> file.createNewFile
res7: Boolean = true

scala> res"test"
res8: String = test

scala> file.delete
res9: Boolean = true

scala> res"test"
<console>:12: error: file 'test' does not exist
              res"test"
              ^

答案 1 :(得分:2)

实际上,您可能可以在Scala 2.10中使用宏执行此操作 - 宏是在编译时运行的一段代码。

这是否是一个明智的事情是完全是另一个问题(仅仅因为它在编译时可用并不一定意味着它将在运行时,反之亦然?)。我建议Richard在你的构建工具中做某事的建议可能更明智。

答案 2 :(得分:0)

不,你不能诱使编译器为你做这个检查。

是的,ant / maven / buildr / sbt可以为你做这个检查。

如果您想了解更多详细信息,请提供有关构建工具的信息。

相关问题