Skip to content

Commit c9ace66

Browse files
authored
Fix reflect typeMembers to return all members (#15033)
Fixes #14902
2 parents ddcaeca + 8df1134 commit c9ace66

File tree

6 files changed

+43
-9
lines changed

6 files changed

+43
-9
lines changed

compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,13 +2619,15 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
26192619
case sym if sym.isType => sym.asType
26202620
}.toList
26212621

2622-
def memberType(name: String): Symbol = typeMember(name)
2622+
def memberType(name: String): Symbol =
2623+
self.typeRef.decls.find(sym => sym.name == name.toTypeName)
26232624
def typeMember(name: String): Symbol =
2624-
self.unforcedDecls.find(sym => sym.name == name.toTypeName)
2625+
lookupPrefix.member(name.toTypeName).symbol
26252626

2626-
def memberTypes: List[Symbol] = typeMembers
2627+
def memberTypes: List[Symbol] =
2628+
self.typeRef.decls.filter(_.isType)
26272629
def typeMembers: List[Symbol] =
2628-
self.unforcedDecls.filter(_.isType)
2630+
lookupPrefix.typeMembers.map(_.symbol).toList
26292631

26302632
def declarations: List[Symbol] =
26312633
self.typeRef.info.decls.toList

library/src/scala/quoted/Quotes.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3879,17 +3879,17 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
38793879
def declaredTypes: List[Symbol]
38803880

38813881
/** Type member with the given name directly declared in the class */
3882-
@deprecated("Use typeMember", "3.1.0")
3882+
@deprecated("Use declaredType or typeMember", "3.1.0")
38833883
def memberType(name: String): Symbol
38843884

3885-
/** Type member with the given name directly declared in the class */
3885+
/** Type member with the given name declared or inherited in the class */
38863886
def typeMember(name: String): Symbol
38873887

38883888
/** Type member directly declared in the class */
3889-
@deprecated("Use typeMembers", "3.1.0")
3889+
@deprecated("Use declaredTypes or typeMembers", "3.1.0")
38903890
def memberTypes: List[Symbol]
38913891

3892-
/** Type member directly declared in the class */
3892+
/** Type member directly declared or inherited in the class */
38933893
def typeMembers: List[Symbol]
38943894

38953895
/** All members directly declared in the class */

scaladoc/src/dotty/tools/scaladoc/tasty/SyntheticSupport.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ object SyntheticsSupport:
4949
c.symbol.typeRef.baseClasses.map(b => b -> c.symbol.typeRef.baseType(b)).tail
5050

5151
def typeForClass(using Quotes)(c: reflect.ClassDef): reflect.TypeRepr =
52-
c.symbol.typeRef.appliedTo(c.symbol.typeMembers.filter(_.isTypeParam).map(_.typeRef))
52+
c.symbol.typeRef.appliedTo(c.symbol.declaredTypes.filter(_.isTypeParam).map(_.typeRef))
5353

5454
/* We need there to filter out symbols with certain flagsets, because these symbols come from compiler and TASTY can't handle them well.
5555
They are valdefs that describe case companion objects and cases from enum.

tests/run-macros/i14902.check

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
List(X)
2+
List(X, Y, Z)
3+
List(X)
4+
List(Y, Z)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import scala.quoted.*
2+
3+
inline def typeMembers[A]: List[String] = ${ typeMembersExpr[A] }
4+
inline def declaredTypes[A]: List[String] = ${ declaredTypesExpr[A] }
5+
6+
private def typeMembersExpr[A: Type](using Quotes): Expr[List[String]] = {
7+
import quotes.reflect.*
8+
val members = TypeRepr.of[A].typeSymbol.typeMembers
9+
Expr(members.map(_.name))
10+
}
11+
12+
private def declaredTypesExpr[A: Type](using Quotes): Expr[List[String]] = {
13+
import quotes.reflect.*
14+
val decls = TypeRepr.of[A].typeSymbol.declaredTypes
15+
Expr(decls.map(_.name))
16+
}

tests/run-macros/i14902/Test_2.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
@main def Test: Unit =
2+
println(typeMembers[A])
3+
println(typeMembers[B])
4+
println(declaredTypes[A])
5+
println(declaredTypes[B])
6+
7+
class A:
8+
type X
9+
10+
class B extends A:
11+
type Y
12+
type Z

0 commit comments

Comments
 (0)