@@ -11,23 +11,32 @@ private object ModelImpl {
1111 case ClassDef (mods, name, tparams, tpl @ Template (parents, sf, body)) :: companion =>
1212 val bokeh = q " io.continuum.bokeh "
1313
14+ def expandInclude (prefix : Option [Tree ], mixin : Tree ) = {
15+ val fields =
16+ c.typecheck(tq " $mixin" , c.TYPEmode )
17+ .tpe
18+ .members
19+ .filter(_.isModule)
20+ .map(_.asModule)
21+ .filter(_.typeSignature <:< typeOf[AbstractField ])
22+
23+ fields.map { field =>
24+ val name = prefix match {
25+ case Some (prefix) => TermName (s " ${prefix}_ ${field.name}" )
26+ case None => field.name
27+ }
28+ val sig = field.typeSignature
29+ val tpe = sig.member(TypeName (" ValueType" )).typeSignatureIn(sig)
30+ // TODO: add support for precise field type (Vectorized, NonNegative, etc.)
31+ q " object $name extends this.Field[ $tpe] "
32+ }
33+ }
34+
1435 val expandedBody = body.flatMap {
36+ case q " include[ $mixin] " =>
37+ expandInclude(None , mixin)
1538 case q " $prefix = include[ $mixin] " =>
16- val fields =
17- c.typecheck(tq " $mixin" , c.TYPEmode )
18- .tpe
19- .members
20- .filter(_.isModule)
21- .map(_.asModule)
22- .filter(_.typeSignature <:< typeOf[AbstractField ])
23-
24- fields.map { field =>
25- val name = TermName (s " ${prefix}_ ${field.name}" )
26- val sig = field.typeSignature
27- val tpe = sig.member(TypeName (" ValueType" )).typeSignatureIn(sig)
28- // TODO: add support for precise field type (Vectorized, NonNegative, etc.)
29- q " object $name extends this.Field[ $tpe] "
30- }
39+ expandInclude(Some (prefix), mixin)
3140 case field => field :: Nil
3241 }
3342
0 commit comments