2017-08-15 121 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會導致編譯器在檢查方法時忽略主體,即使主體將顯示在字節代碼本身中。

相關問題