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