@@ -804,20 +804,23 @@ object Checking {
804804   * 
805805   */  
806806  def  checkAndAdaptExperimentalImports (trees : List [Tree ])(using  Context ):  Unit  = 
807-     def  nonExperimentalTopLevelDefs (pack : Symbol ):  Iterator [Symbol ] = 
808-       def  isNonExperimentalTopLevelDefinition (sym : Symbol ) = 
809-         sym.isDefinedInCurrentRun
810-         &&  sym.source ==  ctx.compilationUnit.source
811-         &&  ! sym.isConstructor //  not constructor of package object
812-         &&  ! sym.is(Package ) &&  ! sym.name.isPackageObjectName
813-         &&  ! sym.isExperimental
814- 
815-       pack.info.decls.toList.iterator.flatMap:  sym => 
816-         if  sym.isClass &&  (sym.is(Package ) ||  sym.isPackageObject) then 
817-           nonExperimentalTopLevelDefs(sym)
818-         else  if  isNonExperimentalTopLevelDefinition(sym) then 
819-           sym ::  Nil 
820-         else  Nil 
807+     def  nonExperimentalTopLevelDefs ():  Iterator [Symbol ] = 
808+       new  TreeAccumulator [List [Symbol ]] {
809+         override  def  apply (x : List [Symbol ], tree : tpd.Tree )(using  Context ):  List [Symbol ] = 
810+           def  addIfExperimental (sym : Symbol ) = 
811+             if  ! sym.isExperimental then  sym ::  x
812+             else  x
813+           tree match  {
814+             case  tpd.PackageDef (_, contents) => 
815+               super .apply(x, contents)
816+             case  defdef : tpd.DefDef  =>  addIfExperimental(defdef.symbol)
817+             case  valdef : tpd.ValDef  =>  addIfExperimental(valdef.symbol)
818+             case  typeDef @  tpd.TypeDef (_, temp : Template ) if  typeDef.symbol.isPackageObject => 
819+               super .apply(x, temp.body)
820+             case  typeDef @  tpd.TypeDef (_, Template (_, _, _, _)) =>  addIfExperimental(typeDef.symbol)
821+             case  _ =>  x
822+           }
823+       }.apply(Nil , ctx.compilationUnit.tpdTree).iterator
821824
822825    def  unitExperimentalLanguageImports  = 
823826      def  isAllowedImport (sel : untpd.ImportSelector ) = 
@@ -835,7 +838,7 @@ object Checking {
835838
836839    if  ctx.owner.is(Package ) ||  ctx.owner.name.startsWith(str.REPL_SESSION_LINE ) then 
837840      def  markTopLevelDefsAsExperimental (why : String ):  Unit  = 
838-         for  sym <-  nonExperimentalTopLevelDefs(ctx.owner ) do 
841+         for  sym <-  nonExperimentalTopLevelDefs() do 
839842          sym.addAnnotation(ExperimentalAnnotation (s " Added by  $why" , sym.span))
840843
841844      unitExperimentalLanguageImports match 
0 commit comments