@@ -98,17 +98,17 @@ object MainProxies {
9898      val  body  =  Try (call, handler ::  Nil , EmptyTree )
9999      val  mainArg  =  ValDef (nme.args, TypeTree (defn.ArrayType .appliedTo(defn.StringType )), EmptyTree )
100100        .withFlags(Param )
101-       /**  Replace typed `Ident`s that have been typed with a TypeSplice with the reference to the symbol. 
102-        *  The annotations will be retype-checked in another scope that may not have the same imports. 
101+ 
102+       /**  This context is used to create the `TypeSplices` wrapping annotations 
103+        *  below. These should have `mainFun` as their owner (and not the 
104+        *  enclosing package class that we would get otherwise) so that 
105+        *  subsequent owner changes (for example in `Typer.typedTypedSplice`) are 
106+        *  correct. See #22364 and associated tests. 
103107       */  
104-       def  insertTypeSplices  =  new  TreeMap  {
105-           override  def  transform (tree : Tree )(using  Context ):  Tree  =  tree match 
106-             case  tree : tpd.Ident  @ unchecked =>  TypedSplice (tree)
107-             case  tree =>  super .transform(tree)
108-       }
108+       val  annotsCtx  =  ctx.fresh.setOwner(mainFun)
109109      val  annots  =  mainFun.annotations
110110        .filterNot(_.matches(defn.MainAnnot ))
111-         .map(annot =>  insertTypeSplices.transform (annot.tree))
111+         .map(annot =>  TypedSplice (annot.tree)( using  annotsCtx ))
112112      val  mainMeth  =  DefDef (nme.main, (mainArg ::  Nil ) ::  Nil , TypeTree (defn.UnitType ), body)
113113        .withFlags(JavaStatic  |  Synthetic )
114114        .withAnnotations(annots)
0 commit comments