Scala macro: rewrite partial function into match -


i rewrite partial function match expression.

//macro , impl def pfrewrite(pf: partialfunction[int, int]) = macro responderimpl.pfrewriteimpl  def pfrewriteimpl(c: context)(pf: c.expr[partialfunction[int, int]]) = {   import c.universe._    val cas = pf.tree.collect {     case x: defdef if x.name.decoded == "applyorelse" =>       x.collect {         case cq"$x => $y" =>  cq"""$x => $y"""       }   }.flatten    val sval = newtermname("someval")    val rewrite = q"""     $sval match {       case ..$cas     }   """   c.expr(rewrite) } 

in code got partialfunction , take cases applyorelse method, next create match expression "someval". value code:

 //test  def test {   val someval = 10    pfrewrite {    case 1 => 10    case _ => 100   }  } 

but got errors:

[error]  found   : int(10) [error]  required: nothing [error]       case 1 => 10 [error]                 ^ 

and etc.

it possible rewrite partial function call match ?

typically these kinds of awkward error messages stem mixing typed , untyped trees (for more details take @ scala macros: difference between typed (aka typechecked) untyped trees). therefore, until we've fixed situation, it's practice resetlocalattrs on typed trees plan mix untyped ones.

this case not exception. using c.resetlocalattrs(pf.tree) instead of pf.tree reveals real problem macro expansion:

12:57 ~/projects/master/sandbox (master)$ scalac test.scala test.scala:5: error: not found: value default      macros.pfrewrite {                       ^ 

if enable -xprint:typer, 1 of ways see macro expansions (along -ymacro-debug-lite , -ymacro-debug-verbose), we'll see what's going on:

[[syntax trees @ end of                     typer]] // test.scala package <empty> {   object test extends anyref app {     def <init>(): test.type = {       test.super.<init>();       ()     };     def test: unit = {       val someval: int = 10;       {         someval match {           case 1 => 10           case _ => 100           case (defaultcase$ @ _) => <default: error>.apply(<x1: error>)         };         ()       }     }   } } 

it looks partial function synthesis adds default case can't reuse as-is, refers synthetic variables defined in synthesized class.


Comments

Popular posts from this blog

Android layout hidden on keyboard show -

google app engine - 403 Forbidden POST - Flask WTForms -

c - Why would PK11_GenerateRandom() return an error -8023? -