Skip to content

Commit 32701e1

Browse files
committed
Compute non-experimental top-level definition from symbols
1 parent ad92dcd commit 32701e1

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
@@ -809,22 +809,24 @@ object Checking {
809809
*
810810
*/
811811
def checkAndAdaptExperimentalImports(trees: List[Tree])(using Context): Unit =
812-
def nonExperimentalStats(trees: List[Tree]): List[Tree] = trees match
813-
case (_: ImportOrExport | EmptyTree) :: rest =>
814-
nonExperimentalStats(rest)
815-
case (tree @ TypeDef(_, impl: Template)) :: rest if tree.symbol.isPackageObject =>
816-
nonExperimentalStats(impl.body) ::: nonExperimentalStats(rest)
817-
case (tree: PackageDef) :: rest =>
818-
nonExperimentalStats(tree.stats) ::: nonExperimentalStats(rest)
819-
case (tree: MemberDef) :: rest =>
820-
if tree.symbol.isExperimental || tree.symbol.is(Synthetic) then
821-
nonExperimentalStats(rest)
822-
else
823-
tree :: nonExperimentalStats(rest)
824-
case tree :: rest =>
825-
tree :: nonExperimentalStats(rest)
826-
case Nil =>
827-
Nil
812+
def nonExperimentalTopLevelDefs(pack: Symbol): Iterator[Symbol] =
813+
def isNonExperimentalTopLevelDefinition(sym: Symbol) =
814+
!sym.isExperimental
815+
&& sym.source == ctx.compilationUnit.source
816+
&& !sym.isConstructor // not constructor of package object
817+
&& !sym.is(Package) && !sym.isPackageObject && !sym.name.endsWith(str.TOPLEVEL_SUFFIX)
818+
819+
val packageMembers =
820+
pack.info.decls
821+
.toList.iterator
822+
.filter(isNonExperimentalTopLevelDefinition)
823+
val packageObjectMembers =
824+
pack.info.decls
825+
.toList.iterator
826+
.filter(sym => sym.isClass && (sym.is(Package) || sym.isPackageObject))
827+
.flatMap(nonExperimentalTopLevelDefs)
828+
829+
packageMembers ++ packageObjectMembers
828830

829831
def unitExperimentalLanguageImports =
830832
def isAllowedImport(sel: untpd.ImportSelector) =
@@ -842,14 +844,9 @@ object Checking {
842844

843845
if ctx.owner.is(Package) || ctx.owner.name.startsWith(str.REPL_SESSION_LINE) then
844846
def markTopLevelDefsAsExperimental(why: String): Unit =
845-
for tree <- nonExperimentalStats(trees) do
846-
tree match
847-
case tree: MemberDef =>
848-
val sym = tree.symbol
849-
if !sym.isExperimental then
850-
sym.addAnnotation(ExperimentalAnnotation(s"Added by $why", sym.span))
851-
case _ =>
852-
// statements from a `val _ = ...`
847+
for sym <- nonExperimentalTopLevelDefs(ctx.owner) do
848+
sym.addAnnotation(ExperimentalAnnotation(s"Added by $why", sym.span))
849+
853850
unitExperimentalLanguageImports match
854851
case imp :: _ => markTopLevelDefsAsExperimental(i"top level $imp")
855852
case _ =>

0 commit comments

Comments
 (0)