2016-03-23 11 views
1

Ich habe den folgenden Code zu ersetzen:einfache Art und Weise Ausdruck Namen in ast

@compileTimeOnly("enable macro paradise to expand macro annotations") 
class replace extends StaticAnnotation { 
    def macroTransform(annottees: Any*) = macro replaceImpl.replace 
} 

object replaceImpl { 
    def replace(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = { 
    import c.universe._ 

    // ? 

    c.Expr[Any](q"") 
    } 
} 

über diesen Code, ich mag Variablennamen ersetzen (x) in nächstem Beispiel für die Nutzung:

@replace 
def foo(x: Int) = x + 1 

Es ist eine einfache Methode, aber wenn ich eine große Methode mit vielen Ausdruck habe, was ist der einfachste Weg, um Variablennamen zu ersetzen (von x bis y zum Beispiel)?

Antwort

2

Nach einigen Untersuchungen, ich brauche Transfomer#transform Methode zu verwenden, einige wie folgt aus:

val t = new Transformer { 
    override def transform(tree: Tree) = { 
    val nt = tree match { 
     case Ident(x) => Ident(someNewName) 
     case x => x 
    } 
    super.transform(newTree) 
    } 
} 

// and then 

val result = t.transform(inputTree)