2

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

これの目的は、いくつかの特性をフリーズ可能としてマークし、データにアクセスするときにメソッドが呼び出される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))
  };
  ()
}

trait でマクロを実行しようとすると、次のエラーが発生します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ます。これにより、Scala 2.11 用のマクロ プロジェクトがコンパイルされ、続いて API 自体がコンパイルされます。

4

1 に答える 1