Skip to content

Commit 5a4fe89

Browse files
committed
Fix #8520: Add Reflection.Symbol.typeMembers
1 parent 5aec4f8 commit 5a4fe89

File tree

6 files changed

+45
-0
lines changed

6 files changed

+45
-0
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/ReflectionCompilerInterface.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,6 +1732,12 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
17321732
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
17331733
}.toList
17341734

1735+
def Symbol_typeMembers(self: Symbol)(using ctx: Context): List[Symbol] =
1736+
self.unforcedDecls.filter(_.isType)
1737+
1738+
def Symbol_typeMember(self: Symbol)(name: String)(using ctx: Context): Symbol =
1739+
self.unforcedDecls.find(sym => sym.name == name.toTypeName)
1740+
17351741
def Symbol_classMethods(self: Symbol)(using ctx: Context): List[Symbol] =
17361742
self.typeRef.decls.iterator.collect {
17371743
case sym if isMethod(sym) => sym.asTerm

library/src/scala/tasty/Reflection.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2219,6 +2219,14 @@ class Reflection(private[scala] val internal: CompilerInterface) { self =>
22192219
def classMethods(using ctx: Context): List[Symbol] =
22202220
internal.Symbol_classMethods(sym)
22212221

2222+
/** Type member directly declared in the class */
2223+
def typeMembers(using ctx: Context): List[Symbol] =
2224+
internal.Symbol_typeMembers(sym)
2225+
2226+
/** Type member with the given name directly declared in the class */
2227+
def typeMember(name: String)(using ctx: Context): Symbol =
2228+
internal.Symbol_typeMember(sym)(name)
2229+
22222230
/** Get named non-private methods declared or inherited */
22232231
def method(name: String)(using ctx: Context): List[Symbol] =
22242232
internal.Symbol_method(sym)(name)

library/src/scala/tasty/reflect/CompilerInterface.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,12 @@ trait CompilerInterface {
13081308
/** Get all non-private methods declared or inherited */
13091309
def Symbol_methods(self: Symbol)(using ctx: Context): List[Symbol]
13101310

1311+
/** Type member directly declared in the class */
1312+
def Symbol_typeMembers(self: Symbol)(using ctx: Context): List[Symbol]
1313+
1314+
/** Type member with the given name directly declared in the class */
1315+
def Symbol_typeMember(self: Symbol)(name: String)(using ctx: Context): Symbol
1316+
13111317
/** The symbols of each type parameter list and value parameter list of this
13121318
* method, or Nil if this isn't a method.
13131319
*/

tests/run-macros/i8520.check

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
List((A,+))
2+
List((B,-))
3+
List((C, ))

tests/run-macros/i8520/Macro_1.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
}

tests/run-macros/i8520/Test_2.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
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+
}

0 commit comments

Comments
 (0)