2017-03-05 91 views
0

在保持用Scala編寫2.10.x老Scala代碼重寫後,意想不到的事情發生在我身上時,我試着輸入macros檢查TypeTree。看看下面的代碼,Typetree類型檢查

annottees.map(_.tree).toList match { 
    case q"$mods def $name[..$tpes](...$args) : $returnType = { ..$body }" :: Nil => 
    val isUnit = c.typeCheck(q"type T = $returnType;()").children.head match { 
     case TypeDef(_, _, _, tpt) => tpt.tpe =:= typeOf[Unit] 
    } 
    //... business logic 

正如你所看到的,我想要做的是簡單的 - 試圖以決定是否註解的方法的返回類型爲Unit。它服務的宗旨,但我注意到,有時AST的returnType得到改寫 returnType確實 Unit 。例如,

原來AST爲returnType是,

isUnit
Select(Ident(scala), newTypeName("Unit")) 

後,

Select(Ident(scala), scala.Unit) 

其結果是,對於一些返回Unit方法 的宏展開的失敗編譯。

這是一個錯誤或東西,我應該期待什麼?有沒有辦法避開它?

回答

0

好了,確實是AST樹可以是可變的。我想通我需要的returnType重複傳遞,以保持它被轉化成別的東西。

annottees.map(_.tree).toList match { 
    case q"$mods def $name[..$tpes](...$args) : $returnType = { ..$body }" :: Nil => 
    val isUnit = c.typeCheck(q"type T = ${returnType.duplicate};()").children.head match { 
     case TypeDef(_, _, _, tpt) => tpt.tpe =:= typeOf[Unit] 
    } 
//... business logic