Skip to content

Commit 32f5a17

Browse files
committed
Compute non-experimental top-level definition from symbols
1 parent b21523b commit 32f5a17

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

Diff for: compiler/src/dotty/tools/dotc/typer/Checking.scala

+21-24
Original file line numberDiff line numberDiff line change
@@ -804,22 +804,24 @@ object Checking {
804804
*
805805
*/
806806
def checkAndAdaptExperimentalImports(trees: List[Tree])(using Context): Unit =
807-
def nonExperimentalStats(trees: List[Tree]): List[Tree] = trees match
808-
case (_: ImportOrExport | EmptyTree) :: rest =>
809-
nonExperimentalStats(rest)
810-
case (tree @ TypeDef(_, impl: Template)) :: rest if tree.symbol.isPackageObject =>
811-
nonExperimentalStats(impl.body) ::: nonExperimentalStats(rest)
812-
case (tree: PackageDef) :: rest =>
813-
nonExperimentalStats(tree.stats) ::: nonExperimentalStats(rest)
814-
case (tree: MemberDef) :: rest =>
815-
if tree.symbol.isExperimental || tree.symbol.is(Synthetic) then
816-
nonExperimentalStats(rest)
817-
else
818-
tree :: nonExperimentalStats(rest)
819-
case tree :: rest =>
820-
tree :: nonExperimentalStats(rest)
821-
case Nil =>
822-
Nil
807+
def nonExperimentalTopLevelDefs(pack: Symbol): Iterator[Symbol] =
808+
def isNonExperimentalTopLevelDefinition(sym: Symbol) =
809+
!sym.isExperimental
810+
&& sym.source == ctx.compilationUnit.source
811+
&& !sym.isConstructor // not constructor of package object
812+
&& !sym.is(Package) && !sym.isPackageObject && !sym.name.endsWith(str.TOPLEVEL_SUFFIX)
813+
814+
val packageMembers =
815+
pack.info.decls
816+
.toList.iterator
817+
.filter(isNonExperimentalTopLevelDefinition)
818+
val packageObjectMembers =
819+
pack.info.decls
820+
.toList.iterator
821+
.filter(sym => sym.isClass && (sym.is(Package) || sym.isPackageObject))
822+
.flatMap(nonExperimentalTopLevelDefs)
823+
824+
packageMembers ++ packageObjectMembers
823825

824826
def unitExperimentalLanguageImports =
825827
def isAllowedImport(sel: untpd.ImportSelector) =
@@ -837,14 +839,9 @@ object Checking {
837839

838840
if ctx.owner.is(Package) || ctx.owner.name.startsWith(str.REPL_SESSION_LINE) then
839841
def markTopLevelDefsAsExperimental(why: String): Unit =
840-
for tree <- nonExperimentalStats(trees) do
841-
tree match
842-
case tree: MemberDef =>
843-
val sym = tree.symbol
844-
if !sym.isExperimental then
845-
sym.addAnnotation(ExperimentalAnnotation(s"Added by $why", sym.span))
846-
case _ =>
847-
// statements from a `val _ = ...`
842+
for sym <- nonExperimentalTopLevelDefs(ctx.owner) do
843+
sym.addAnnotation(ExperimentalAnnotation(s"Added by $why", sym.span))
844+
848845
unitExperimentalLanguageImports match
849846
case imp :: _ => markTopLevelDefsAsExperimental(i"top level $imp")
850847
case _ =>

0 commit comments

Comments
 (0)