如何在注释类上强制scala宏注释约束?

如何在注释类上强制scala宏注释约束?,scala,macros,annotations,Scala,Macros,Annotations,我正在尝试实现一个“简单”的util库,它将带注释的scalatest套件放在一个套件实例中,为它们提供一个特定的运行上下文 trait MyContext extends BeforeAndAfterAll { //declarations of values override def beforeAll() = {/* run various init procedures */} override def afterAll() = {/* tear everything dow

我正在尝试实现一个“简单”的util库,它将带注释的scalatest套件放在一个套件实例中,为它们提供一个特定的运行上下文

trait MyContext extends BeforeAndAfterAll {
  //declarations of values
  override def beforeAll() = {/* run various init procedures */}
  override def afterAll() = {/* tear everything down */}
}
这部分工作正常,如果我自己编写Suites实例,我就可以使用它。 我想编写的是scala注释,其中包含一个宏,该宏将采用所有带注释的org.scalatest.Suite子类型并生成Suites类,如中所示:

class testThisInContext extends StaticAnnotation{ /* ...  */}

@testThisInContext
class TestOne extends WordSpec {}

@testThisInContext
class TestTwo extends FlatSuite {}
然后将生成:

class InContextSuites extends Suites(new TestOne, new TestTwo) with MyContext {}
还可以通过向类添加
@org.scalatest.DoNotDiscover
注释来修改这些类(以避免在上下文之外执行)

当带注释的类不是Suite的子类(这会使生成的类无法编译)时,我需要一种方法来中断宏的应用程序(并抛出一个错误)


我还没有弄清楚如何在ClassDef的modifiers实例中键入check注释(以便在需要时添加注释)。

正如我在中提到的,这与当前框架中的情况一样非常困难。不过,可能会有变通办法。例如,您是否可以将现有类的定义替换为其转换后的版本?需要添加一个新的(java)注释,以防止重复执行scalatests。因此,转换已定义的类没有问题。