私の問題は、生成されたクラスのメンバーが実装されていると認識されないことです。これは 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
構築中のツリーに実装が表示されているにもかかわらず、クラスによって何も実装されていないというエラーが発生します。
そのブランチをチェックアウトして を実行すると、失敗をテストできsbt scalaDebuggerApi/compile
ます。これにより、Scala 2.11 用のマクロ プロジェクトがコンパイルされ、続いて API 自体がコンパイルされます。