@@ -809,22 +809,24 @@ object Checking {
809
809
*
810
810
*/
811
811
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
828
830
829
831
def unitExperimentalLanguageImports =
830
832
def isAllowedImport (sel : untpd.ImportSelector ) =
@@ -842,14 +844,9 @@ object Checking {
842
844
843
845
if ctx.owner.is(Package ) || ctx.owner.name.startsWith(str.REPL_SESSION_LINE ) then
844
846
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
+
853
850
unitExperimentalLanguageImports match
854
851
case imp :: _ => markTopLevelDefsAsExperimental(i " top level $imp" )
855
852
case _ =>
0 commit comments