File tree Expand file tree Collapse file tree 5 files changed +69
-0
lines changed
src/reflect/scala/reflect/internal Expand file tree Collapse file tree 5 files changed +69
-0
lines changed Original file line number Diff line number Diff line change @@ -1890,6 +1890,10 @@ trait Types
1890
1890
super .invalidateTypeRefCaches()
1891
1891
narrowedCache = null
1892
1892
}
1893
+ override def forceDirectSuperclasses : Unit =
1894
+ sym0.rawInfo.decls.foreach { decl =>
1895
+ if (decl.isModule || ! decl.isTerm) decl.rawInfo.forceDirectSuperclasses
1896
+ }
1893
1897
override protected def finishPrefix (rest : String ) = objectPrefix + rest
1894
1898
override def directObjectString = super .safeToString
1895
1899
override def toLongString = toString
Original file line number Diff line number Diff line change
1
+ import scala .language .experimental .macros
2
+
3
+ import scala .reflect .macros .blackbox .Context
4
+
5
+ class TC [T ](val subclasses : List [String ])
6
+
7
+ object TC {
8
+ implicit def instance [T ]: TC [T ] = macro instanceImpl[T ]
9
+
10
+ def instanceImpl [T ](c : Context )(implicit tT : c.WeakTypeTag [T ]): c.Tree = {
11
+ import c .universe ._
12
+
13
+ val subclasses =
14
+ if (tT.tpe.typeSymbol.isClass)
15
+ tT.tpe.typeSymbol.asClass.knownDirectSubclasses.map(_.toString).toList
16
+ else Nil
17
+
18
+ q """ new TC[ $tT]( $subclasses) """
19
+ }
20
+ }
Original file line number Diff line number Diff line change
1
+ object Test extends App {
2
+ def callMacro [T : TC ]: List [String ] = implicitly[TC [T ]].subclasses
3
+ assert(callMacro[ADT ] == List (" class ADTConstructor" ))
4
+ }
5
+
6
+ sealed trait ADT
7
+ object ADT {
8
+ final case class ADTConstructor () extends ADT
9
+ }
Original file line number Diff line number Diff line change
1
+ import scala .language .experimental .macros
2
+
3
+ import scala .reflect .macros .blackbox .Context
4
+
5
+ class TC [T ](val subclasses : List [String ])
6
+
7
+ object TC {
8
+ implicit def instance [T ]: TC [T ] = macro instanceImpl[T ]
9
+
10
+ def instanceImpl [T ](c : Context )(implicit tT : c.WeakTypeTag [T ]): c.Tree = {
11
+ import c .universe ._
12
+
13
+ val subclasses =
14
+ if (tT.tpe.typeSymbol.isClass)
15
+ tT.tpe.typeSymbol.asClass.knownDirectSubclasses.map(_.toString).toList
16
+ else Nil
17
+
18
+ q """ new TC[ $tT]( $subclasses) """
19
+ }
20
+ }
Original file line number Diff line number Diff line change
1
+ object Test extends App {
2
+ def callMacro [T : TC ]: List [String ] = implicitly[TC [T ]].subclasses
3
+ assert(callMacro[ADT ] == List (" class ADTConstructor" ))
4
+ assert(ADT .instance.subclasses == List (" class ADTConstructor" ))
5
+ assert(ADT .ADTConstructor .ctorInstance.subclasses == Nil )
6
+ }
7
+
8
+ sealed trait ADT
9
+ object ADT {
10
+ final val instance = implicitly[TC [ADT ]]
11
+
12
+ final case class ADTConstructor () extends ADT
13
+ object ADTConstructor {
14
+ final val ctorInstance = implicitly[TC [ADTConstructor ]]
15
+ }
16
+ }
You can’t perform that action at this time.
0 commit comments