Scala宏:生成的类无法使用未实现的成员进行编译

Scala宏:生成的类无法使用未实现的成员进行编译,scala,macros,scala-macro-paradise,Scala,Macros,Scala Macro Paradise,我的问题是,我生成的类的成员未被识别为已实现。这是为Scala 2.10/2.11/2.12构建的,默认为2.11。使用macroparadise 2.10 这样做的目的是将一些特性标记为freezable,并为每个采用scala.util的特性生成一个实现类。对于每个可freezable的方法,在访问数据时将调用其get方法。所有不可冻结的方法都用抛出新的IllegalStateException填充。然后创建一个自定义的freeze方法,该方法创建freezed类的实例,并使用trait定义

我的问题是,我生成的类的成员未被识别为已实现。这是为Scala 2.10/2.11/2.12构建的,默认为2.11。使用macroparadise 2.10

这样做的目的是将一些特性标记为freezable,并为每个采用
scala.util的特性生成一个实现类。对于每个可freezable的方法,在访问数据时将调用其
get
方法。所有不可冻结的方法都用
抛出新的IllegalStateException
填充。然后创建一个自定义的
freeze
方法,该方法创建
freezed
类的实例,并使用trait定义的方法填充所需的数据

我已经设置了一个注释宏,放置在traits上,并生成一个伴生对象,其内部类名为
冻结
,如下所示:

{
  abstract trait JavaInfo extends scala.AnyRef {
    @new CanFreeze() def isJavaInfo: Boolean;
    @new CannotFreeze() def toJavaInfo: AnyRef
  };
  object JavaInfo extends scala.AnyRef {
    def <init>() = {
      super.<init>();
      ()
    };
    class Frozen extends JavaInfo with java.io.Serializable {
      <paramaccessor> private val $isJavaInfo: scala.util.Try[Boolean] = _;
      def <init>($isJavaInfo: scala.util.Try[Boolean]) = {
        super.<init>();
        ()
      };
      override def isJavaInfo: Boolean = this.$isJavaInfo.get;
      override def toJavaInfo: AnyRef = throw new IllegalStateException("Method not frozen!")
    };
    def freeze(valueToFreeze: JavaInfo): Frozen = new Frozen(scala.util.Try.apply(valueToFreeze.isJavaInfo))
  };
  ()
}
其特点如下:

import org.scaladebugger.macros.freeze.{CanFreeze, CannotFreeze, Freezable}

@Freezable trait JavaInfo {
  @CanFreeze def isJavaInfo: Boolean
  @CannotFreeze def toJavaInfo: AnyRef
}
获取错误,即
freezed
类未实现任何内容,即使我在构建的树中看到了实现

问题代码如下:


您可以通过检查该分支并运行
sbt scalaDebuggerApi/compile
,来测试失败,它将编译Scala 2.11的宏项目,然后再编译API本身。

解决了这个问题。我创建了方法并实现了它们的主体,但是重用了每个方法的旧修饰符,只添加了
标志。OVERRIDE:FlagSet
。结果发现,未实现的方法上有一个
标志。DEFERRED
,所以我生成了一个
修饰符(OVERRIDE | DEFERRED)
,考虑到它有一个主体,这是没有意义的。似乎使用
DEFERRED
修饰符会导致编译器在检查方法时忽略主体,即使主体将显示在字节码本身中

import org.scaladebugger.macros.freeze.{CanFreeze, CannotFreeze, Freezable}

@Freezable trait JavaInfo {
  @CanFreeze def isJavaInfo: Boolean
  @CannotFreeze def toJavaInfo: AnyRef
}