同じであることがわかっているがコンパイラがそうではない2つのパス依存型の同等性を回避するにはどうすればよいですか?
Scala 2.10.0 M7を使用して、ASTをあるユニバースから別のユニバースに変換しようとしています。
case class MacroBridge(context: Context) {
def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ???
def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ???
}
マクロ実装内では、次のように使用できます。
val bridge = treehugger.MacroBridge(c)
def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
ただし、これによりコンパイラエラーが発生します。
[error] /scalamacros-getting-started/library/Macros.scala:21: type mismatch;
[error] found : c.universe.Tree
[error] required: bridge.context.universe.Tree
[error] possible cause: missing arguments for method or constructor
[error] def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
上記のコードc
では、明らかにと同じ値ですがbridge.context
、値型チェッカーがチェックできないためかもしれません。一般化された型制約を置くことは役に立ちませんでした:
def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree =
マクロでは、これでもエラーが発生しました。
[error] /scalamacros-getting-started/library/Macros.scala:21: Cannot prove that c.universe.Tree =:= bridge.context.universe.Tree.
[error] def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree)
context.universe
のような他の依存型にアクセスできるように、へのアクセスが必要TermName
です。キャスト以外にもっと良い回避策はありますか?:
def fromMacroTree(tree: c.universe.Tree): Tree =
bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree])