File tree 6 files changed +45
-0
lines changed
compiler/src/dotty/tools/dotc/tastyreflect
6 files changed +45
-0
lines changed Original file line number Diff line number Diff line change @@ -1738,6 +1738,12 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
1738
1738
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
1739
1739
}.toList
1740
1740
1741
+ def Symbol_typeMembers (self : Symbol )(using ctx : Context ): List [Symbol ] =
1742
+ self.unforcedDecls.filter(_.isType)
1743
+
1744
+ def Symbol_typeMember (self : Symbol )(name : String )(using ctx : Context ): Symbol =
1745
+ self.unforcedDecls.find(sym => sym.name == name.toTypeName)
1746
+
1741
1747
def Symbol_classMethods (self : Symbol )(using ctx : Context ): List [Symbol ] =
1742
1748
self.typeRef.decls.iterator.collect {
1743
1749
case sym if isMethod(sym) => sym.asTerm
Original file line number Diff line number Diff line change @@ -2225,6 +2225,14 @@ class Reflection(private[scala] val internal: CompilerInterface) { self =>
2225
2225
def classMethods (using ctx : Context ): List [Symbol ] =
2226
2226
internal.Symbol_classMethods (sym)
2227
2227
2228
+ /** Type member directly declared in the class */
2229
+ def typeMembers (using ctx : Context ): List [Symbol ] =
2230
+ internal.Symbol_typeMembers (sym)
2231
+
2232
+ /** Type member with the given name directly declared in the class */
2233
+ def typeMember (name : String )(using ctx : Context ): Symbol =
2234
+ internal.Symbol_typeMember (sym)(name)
2235
+
2228
2236
/** Get named non-private methods declared or inherited */
2229
2237
def method (name : String )(using ctx : Context ): List [Symbol ] =
2230
2238
internal.Symbol_method (sym)(name)
Original file line number Diff line number Diff line change @@ -1313,6 +1313,12 @@ trait CompilerInterface {
1313
1313
/** Get all non-private methods declared or inherited */
1314
1314
def Symbol_methods (self : Symbol )(using ctx : Context ): List [Symbol ]
1315
1315
1316
+ /** Type member directly declared in the class */
1317
+ def Symbol_typeMembers (self : Symbol )(using ctx : Context ): List [Symbol ]
1318
+
1319
+ /** Type member with the given name directly declared in the class */
1320
+ def Symbol_typeMember (self : Symbol )(name : String )(using ctx : Context ): Symbol
1321
+
1316
1322
/** The symbols of each type parameter list and value parameter list of this
1317
1323
* method, or Nil if this isn't a method.
1318
1324
*/
Original file line number Diff line number Diff line change
1
+ List((A,+))
2
+ List((B,-))
3
+ List((C, ))
Original file line number Diff line number Diff line change
1
+ import scala .quoted ._
2
+
3
+ inline def test [T [_]]: Unit = $ { testExpr[T ] }
4
+
5
+ def testExpr [T [_]: Type ](using QuoteContext ): Expr [Unit ] = {
6
+ import qctx .tasty ._
7
+ def variance (f : Flags ) =
8
+ if f.is(Flags .Covariant ) then " +"
9
+ else if f.is(Flags .Contravariant ) then " -"
10
+ else " "
11
+ val t = ' [T ].unseal.tpe.typeSymbol.typeMembers.map(x => (x.name, variance(x.flags)))
12
+ ' { println($ {Expr (t.toString)}) }
13
+ }
Original file line number Diff line number Diff line change
1
+ trait X [+ A ]
2
+ trait Y [- B ]
3
+ trait Z [C ]
4
+
5
+ @ main def Test = {
6
+ test[X ]
7
+ test[Y ]
8
+ test[Z ]
9
+ }
You can’t perform that action at this time.
0 commit comments