@@ -11,23 +11,32 @@ private object ModelImpl {
11
11
case ClassDef (mods, name, tparams, tpl @ Template (parents, sf, body)) :: companion =>
12
12
val bokeh = q " io.continuum.bokeh "
13
13
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
+
14
35
val expandedBody = body.flatMap {
36
+ case q " include[ $mixin] " =>
37
+ expandInclude(None , mixin)
15
38
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)
31
40
case field => field :: Nil
32
41
}
33
42
0 commit comments