2017-08-15 73 views
2

我的问题是,我生成的类的成员没有被识别为已实现。这是为Scala 2.10/2.11/2.12构建的,2.11是默认设置。使用macroparadise 2.10。Scala宏:生成的类无法编译未实现的成员

的这个目标是对一些性状标记为可冷冻和产生用于每个需要scala.util.Try的每个是可冻结,将有其get方法访问数据时调用的方法的一个实现类。所有不可解析的方法都填入throw new IllegalStateException。并且创建一个自定义的freeze方法,该方法创建填充了使用由特征定义的方法所需的数据的Frozen类的实例。

我已成立的注释宏被放置在性状并生成伴侣对象与称为Frozen像下面的内部类:

{ 
    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)) 
    }; 
() 
} 

当我尝试运行出现以下错误我的特点JavaInfo宏:

[error] /Users/senk/projects/scala-debugger/scala-debugger-api/src/main/scala/org/scaladebugger/api/profiles/traits/info/JavaInfo.scala:9: class Frozen needs to be abstract, since: 
[error] it has 2 unimplemented members. 
[error] /** As seen from class Frozen, the missing signatures are as follows. 
[error] * For convenience, these are usable as stub implementations. 
[error] */ 
[error] override def isJavaInfo: Boolean = ??? 
[error] override def toJavaInfo: AnyRef = ??? 
[error] @Freezable trait JavaInfo { 
[error]^
[error] one error found 

这种特点本身如下:

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

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

得到错误,即Frozen类没有实现任何功能,尽管我在我正在构建的树中看到了实现。

代码问题就在这里:https://github.com/chipsenkbeil/scala-debugger/blob/AddFreezableMacroSupport/scala-debugger-macros/src/main/scala/org/scaladebugger/macros/freeze/FreezableMacro.scala

您可以通过检查该分支和运行sbt scalaDebuggerApi/compile,这将编译斯卡拉2.11宏项目,然后API本身测试失败。

回答

0

想通了。我正在创建方法并实现他们的身体,但重用了每种方法的旧修饰符,并加上了Flag.OVERRIDE: FlagSet。结果未实现的方法有一个Flag.DEFERRED对他们,所以我正在生产一个Modifiers(OVERRIDE | DEFERRED),考虑到它有一个机构没有意义。似乎修改器DEFERRED会导致编译器在检查方法时忽略主体,即使主体将显示在字节代码本身中。