2017-08-15 8 views
2

私の問題は、生成されたクラスのメンバーが実装として認識されないことです。これはScala 2.10/2.11/2.12のために構築されており、デフォルトは2.11です。 macroparadiseを使用して2.10。このScala Macros:生成されたクラスが実装されていないメンバーとコンパイルできない

ゴール凍結可能として、いくつかの特徴をマークし、データにアクセスするときに呼び出さそのgetメソッドを持つことになり、その凍結可能である各メソッドのscala.util.Tryを取るごとに、実装クラスを生成することでした。解凍不能なメソッドはすべてthrow new IllegalStateExceptionで埋められます。そして、特性によって定義されたメソッドを使用して必要なデータで塗りつぶされたFrozenクラスのインスタンスを作成するカスタムfreezeメソッドが作成されます。

私は 特性上に配置するための注釈マクロを設定と以下のような 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

あなたはそのブランチをチェックアウトし、API自体が続くScalaの2.11用のマクロプロジェクトをコンパイルしますsbt scalaDebuggerApi/compileを、実行して失敗をテストすることができます。

答えて

0

説明しました。私はメソッドを作成してボディを実装していましたが、各メソッドの古い修飾子を再利用し、Flag.OVERRIDE: FlagSetをタックしていました。実装されていないメソッドにはFlag.DEFERREDがあるので、私はModifiers(OVERRIDE | DEFERRED)を生成していました。これは本体があると考えても意味がありませんでした。 DEFERREDの修飾子を持つと、本体がバイトコード自体で表示されるにもかかわらず、メソッドのチェック時にコンパイラが本体を無視するように見えます。

関連する問題