Scala宏:生成的类无法使用未实现的成员进行编译
我的问题是,我生成的类的成员未被识别为已实现。这是为Scala 2.10/2.11/2.12构建的,默认为2.11。使用macroparadise 2.10 这样做的目的是将一些特性标记为freezable,并为每个采用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.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
}