0
用於Scala的類的實現I型有一些問題階宏和識別實現類型構造函數。 不知道,如果我在這裏做得不對或有什麼正確的調用會。 從文檔,它看起來像typeSignatureIn
應該返回正確的信息,例如ClassTag [INT],但是當我運行宏,我居然得到ClassTag [U]這無法編譯爲U是類型參數,而不是實現類型。獲取使用宏
import scala.language.experimental.macros
import scala.reflect.ClassTag
import scala.reflect.macros.Context
def macroImpl[T: c.WeakTypeTag](c: Context) = {
import c.universe._
val typeToMock = weakTypeOf[T]
val primaryConstructorOpt = typeToMock.members.collectFirst {
case method: MethodSymbolApi if method.isPrimaryConstructor => method
}
val constructorArgumentsTypes = primaryConstructorOpt.map {
constructor =>
val constructorTypeContext = constructor.typeSignatureIn(typeToMock)
val constructorArguments = constructor.paramss
constructorArguments.map { symbols =>
symbols.map(_.typeSignatureIn(constructorTypeContext))
}
}
println(typeToMock)
println(constructorArgumentsTypes)
c.literalUnit
}
def foo[T] = macro macroImpl[T]
class Foo[U: ClassTag]
foo[Foo[Int]]
運行它:
scala> foo[Foo[Int]]
Foo[Int]
Some(List(List(), List(scala.reflect.ClassTag[U]))
我需要得到ClassTag [INT]以某種方式能夠產生正確的樹後,任何想法?
千恩萬謝。仍然在努力將其整合到更廣泛的代碼庫中,但它給了我一個很好的領導下一步要研究的內容 –