2016-08-08 6 views
3

マクロを使用してコンパイル時に現在の型に暗黙的に存在するかどうかをテストできますか?暗黙的に存在するかどうかのテスト

inferImplicitValueを使用することが可能である必要があり、この

def packOne(tpe:c.universe.Type,....) = { 
    if(tpe =:= ByteTpe) makeast1 
    else if (tpe =:= LongTpe) makeast2 
    else if (tpe =:= c.typeOf[java.lang.String]) makeast3 
    .... 
    else exists implicit convention for TPE { 
    q""" 
    // call some function with implicit PACK[T] 
    implicitly[Packer[$tpe]].pack(...) 
    """ 
    } else { 
    // Make default conversion 
    } 

} 

答えて

2

のようなもの:

val t = c.internal.typeRef(NoPrefix, typeOf[Packer[_]].typeSymbol, List(tpe)) 
c.inferImplicitValue(t) match { 
    case EmptyTree => … // default conversion 
    case packer => q"packer.pack(…)" 
} 
+0

奇妙それがテストENVでは動作しません: このマクロは暗黙 HTTPSを見つけることができません:// github.com/martende/mondao/blob/master/src/main/scala/mondao/Macro.scala#L110テスト中 https://github.com/martende/mondao/blob/master/src/test/scala /MacroSpec.scala#L48 – Oleg

+0

その間にソースを変更しましたか?私はあなたのレポをクローンしましたが、 'BsonNumber($ nameStr)'のエラーを受け取りました(文字列には適用されません)。 AFAICSでは、 'inferImplicitValue'の使用法はありません。 – devkat

+0

それは最初のコミットだったそう申し訳ありません:、 – Oleg

関連する問題