Scala:自定义编译器警告

时间:2014-03-09 16:41:31

标签: java scala annotations

我用一些抽象程序(返回Unit的方法)创建了一个特征。然后我创建了一个子特征,它为了方便开发而放入虚拟实现{}。但是我想在虚拟特征上添加编译器警告:“使用虚拟特征可能无法实现所有功能。在生产中使用基本特征。”

我查看了Scala注释和Java注释,但我找不到合适的注释或方法。我可以使用一个已弃用的注释,但这是相当不优雅的:

@deprecated("GraphicMethodsDummy contains procedure stubs. Inherit from GraphicMethods for production", "")

继承弃用似乎没有多大优势,因为生成编译器消息的方法似乎是私有的,无法覆盖。

2 个答案:

答案 0 :(得分:1)

  1. 更改您的API,以便只能通过“创建者”方法获取虚拟特征(例如,在配套对象中)。
  2. 将“创建者方法”实施为a def macro它看起来像这样:

  3. class Dummy
    
    object creator {
        def apply(): Dummy = macro creatorImpl
    
        def creatorImpl(c: Context)(): c.Expr[Dummy] = {
            import c.universe._
    
            c.warning(c.enclosingPosition,
                """Using the dummy trait all functionality may not be implemented. 
                            Use the base trait in production.""")
    
            reify(new Dummy)
        }
    }
    

    请注意,在各种API(例如Guava)中常用的另一种较少涉及的方法是只为您的类添加自定义注释(例如@NotSafeForProd)。但是,这当然不会生成编译器警告。

答案 1 :(得分:1)

如果定期弃用不够好,那么滚动你自己的方法:

package scala {
  class noProd extends deprecatedInheritance("Provide an impl for production", since="forever")
}

package dummyonly {

  trait Abs { def f(i: Int): String }

  @noProd
  class Dummy extends Abs {
    def f(i: Int) = i.toString
  }
}

在单独的编译单元中:

//dummyonly2.scala:3: warning: inheritance from class Dummy in package dummyonly is deprecated: Provide an impl for production

package dummyonly {
  class Mine extends Dummy
}

编辑:

特权注释对scala是私有的,但它非常有用,将它隐藏在蒲式耳下是犯罪行为。

我真的不知道,但代码评论上写着:

// for now, this needs to be generalized to communicate other modifier deltas

或者,用短语来表达WTF?我知道什么是“修饰语”,但是“修饰语delta”超出了我的意思。但是,该评论表明,当注释找出如何使其以可维护的方式工作时,注释可能会看到更广泛的访问。

我认为应该使用分号而不是逗号,即“for now; ...”,但Scala程序员编程是为了避免使用分号,即使在语法正确的情况下也能避免使用分号。