Scala: Equivalence of path-dependent types

path-dependent-type, scala, scala-macros

Solution

I could the following make to work:

case class MacroBridge[C <: Context](context: C) {
  def fromMacroTree(tree: context.universe.Tree): context.universe.Tree = ???
}

trait MB {
  def meth(c: Context) {
    val bridge = MacroBridge[c.type](c)
    def fromMacroTree(tree: c.universe.Tree): c.universe.Tree =
      bridge.fromMacroTree(tree)
  }
}

I had nearly the same problem some time ago.

Problem

How do I get around with equivalence of two path-dependent types that I know are the same but the compiler does not? Using Scala 2.10.0 M7 I am trying to convert an AST from one universe to another. ``` case class MacroBridge(context: Context) { def toMacroTree(tree: treehugger.forest.Tree): context.universe.Tree = ??? def fromMacroTree(tree: context.universe.Tree): treehugger.forest.Tree = ??? } ``` Within a macro implementation, I can use it as: ``` val bridge = treehugger.MacroBridge(c) def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree) ``` However, this results to a compiler error: ``` [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) ``` In the above code `c` is clearly the same value as `bridge.context`, but maybe because it's a value type checker cannot check it. Putting generalized type constraint did not help: ``` def fromMacroTree[A](tree: A)(implicit ev: A =:= context.universe.Tree): Tree = ``` In the macro this still resulted to an error: ``` [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) ``` I need the access to `context.universe` so I can get to other dependent types like `TermName`. Is there a better work around besides casting?: ``` def fromMacroTree(tree: c.universe.Tree): Tree = bridge.fromMacroTree(tree.asInstanceOf[bridge.context.universe.Tree]) ```

Original source

Related problems