@@ -804,22 +804,24 @@ object Checking {
804
804
*
805
805
*/
806
806
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
823
825
824
826
def unitExperimentalLanguageImports =
825
827
def isAllowedImport (sel : untpd.ImportSelector ) =
@@ -837,14 +839,9 @@ object Checking {
837
839
838
840
if ctx.owner.is(Package ) || ctx.owner.name.startsWith(str.REPL_SESSION_LINE ) then
839
841
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
+
848
845
unitExperimentalLanguageImports match
849
846
case imp :: _ => markTopLevelDefsAsExperimental(i " top level $imp" )
850
847
case _ =>
0 commit comments