File tree 5 files changed +35
-15
lines changed
compiler/src/dotty/tools/dotc
5 files changed +35
-15
lines changed Original file line number Diff line number Diff line change @@ -1578,6 +1578,32 @@ object SymDenotations {
1578
1578
if (is(Private ))
1579
1579
copySymDenotation(name = expandedName, initFlags = this .flags &~ Private )
1580
1580
else this
1581
+
1582
+ /** If this is a sealed class, its known children in the order of textual occurrence
1583
+ */
1584
+ def children (using Context ): List [Symbol ] =
1585
+
1586
+ def completeChildrenIn (owner : Symbol ) =
1587
+ def maybeChild (c : Symbol ) =
1588
+ ! owner.is(Package )
1589
+ || c.infoOrCompleter.match
1590
+ case _ : SymbolLoaders .SecondCompleter => c.associatedFile == symbol.associatedFile
1591
+ case _ => false
1592
+ if owner.isClass then
1593
+ for c <- owner.info.decls.toList if c.isClass && maybeChild(c) do
1594
+ c.ensureCompleted()
1595
+
1596
+ if is(Sealed ) then
1597
+ if ! is(ChildrenQueried ) && ! ctx.isAfterTyper then
1598
+ // During typer, make sure all visible children are completed, so that
1599
+ // they show up in Child annotations. A class is visible if it is defined
1600
+ // in the same scope as `cls` or in the companion object of `cls`.
1601
+ completeChildrenIn(owner)
1602
+ completeChildrenIn(companionClass)
1603
+ setFlag(ChildrenQueried )
1604
+
1605
+ annotations.collect { case Annotation .Child (child) => child }.reverse
1606
+ end children
1581
1607
}
1582
1608
1583
1609
/** The contents of a class definition during a period
Original file line number Diff line number Diff line change @@ -1780,7 +1780,7 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
1780
1780
}
1781
1781
1782
1782
def Symbol_children (self : Symbol )(using ctx : Context ): List [Symbol ] =
1783
- dotty.tools.dotc.transform. SymUtils ( self) .children
1783
+ self.children
1784
1784
1785
1785
private def isField (sym : Symbol )(using ctx : Context ): Boolean = sym.isTerm && ! sym.is(Flags .Method )
1786
1786
Original file line number Diff line number Diff line change @@ -188,21 +188,8 @@ class SymUtils(val self: Symbol) extends AnyVal {
188
188
|| sym.isType && isAccessible(sym.owner, cls)
189
189
! isAccessible(self.owner, cls)
190
190
191
- /** If this is a sealed class, its known children in the order of textual occurrence */
192
- def children (implicit ctx : Context ): List [Symbol ] = {
193
- if (self.isType)
194
- self.setFlag(ChildrenQueried )
195
-
196
- if (self.isAllOf(JavaEnumTrait ))
197
- self.linkedClass.info.decls.foreach(_.ensureCompleted())
198
-
199
- self.annotations.collect {
200
- case Annotation .Child (child) => child
201
- }.reverse
202
- }
203
-
204
191
def hasAnonymousChild (implicit ctx : Context ): Boolean =
205
- children.exists(_ `eq` self)
192
+ self. children.exists(_ `eq` self)
206
193
207
194
/** Is symbol directly or indirectly owned by a term symbol? */
208
195
@ tailrec final def isLocal (implicit ctx : Context ): Boolean = {
Original file line number Diff line number Diff line change
1
+ def Test =
2
+ val mirror = summon[deriving.Mirror .SumOf [Foo ]]
3
+ summon[mirror.MirroredElemTypes =:= (Foo .Baz .type , Bar )]
Original file line number Diff line number Diff line change
1
+ sealed trait Foo
2
+ object Foo :
3
+ case object Baz extends Foo
4
+ case class Bar (x : Int ) extends Foo
You can’t perform that action at this time.
0 commit comments