使用宏我想获得一个通用的解决方案来引用Symbol
案例类数据树的字段和子字段。
受此要点的启发,我创建了以下骨架:
import language.experimental.macros
import reflect.runtime.universe._
import reflect.macros.Context
object SubRef {
case class SubRef[ SourceT, TargetT ]( symbol : Symbol )
implicit def functionToSubRef
[ SourceT, TargetT ]
( f : SourceT => TargetT )
: SubRef[ SourceT, TargetT ]
= macro functionToSubRefMacro[ SourceT, TargetT ]
def functionToSubRefMacro
[ SourceT : c.WeakTypeTag, TargetT : c.WeakTypeTag ]
( c : Context )
( f : c.Expr[ SourceT => TargetT ] )
: c.Expr[ SubRef[ SourceT, TargetT ] ]
= ???
}
我希望这个解决方案能像这样工作:
case class A( b : B )
case class B( c : Int )
val ref : SubRef[ A, Int ] = _.b.c
如果传入函数,宏转换应该失败:
- 不是单一的表达
- 不返回符号的值,它是源符号的子字段,即
targetSymbol.owner[.owner...] == sourceSymbol
缺少的宏实现应该是什么?