@@ -54,11 +54,12 @@ class Namer { typer: Typer =>
5454
5555  import  untpd .* 
5656
57-   val  TypedAhead       :  Property .Key [tpd.Tree ]            =  new  Property .Key 
58-   val  ExpandedTree     :  Property .Key [untpd.Tree ]          =  new  Property .Key 
59-   val  ExportForwarders :  Property .Key [List [tpd.MemberDef ]] =  new  Property .Key 
60-   val  SymOfTree        :  Property .Key [Symbol ]              =  new  Property .Key 
61-   val  AttachedDeriver  :  Property .Key [Deriver ]             =  new  Property .Key 
57+   val  TypedAhead        :  Property .Key [tpd.Tree ]            =  new  Property .Key 
58+   val  ExpandedTree      :  Property .Key [untpd.Tree ]          =  new  Property .Key 
59+   val  ExportForwarders  :  Property .Key [List [tpd.MemberDef ]] =  new  Property .Key 
60+   val  ParentRefinements :  Property .Key [List [Symbol ]]        =  new  Property .Key 
61+   val  SymOfTree         :  Property .Key [Symbol ]              =  new  Property .Key 
62+   val  AttachedDeriver   :  Property .Key [Deriver ]             =  new  Property .Key 
6263    //  was `val Deriver`, but that gave shadowing problems with constructor proxies
6364
6465  /**  A partial map from unexpanded member and pattern defs and to their expansions. 
@@ -1485,6 +1486,7 @@ class Namer { typer: Typer =>
14851486    /**  The type signature of a ClassDef with given symbol */  
14861487    override  def  completeInCreationContext (denot : SymDenotation ):  Unit  =  {
14871488      val  parents  =  impl.parents
1489+       val  parentRefinements  =  new  mutable.LinkedHashMap [Name , Type ]
14881490
14891491      /*  The type of a parent constructor. Types constructor arguments
14901492       * only if parent type contains uninstantiated type parameters. 
@@ -1536,7 +1538,8 @@ class Namer { typer: Typer =>
15361538        val  ptype  =  parentType(parent)(using  completerCtx.superCallContext).dealiasKeepAnnots
15371539        if  (cls.isRefinementClass) ptype
15381540        else  {
1539-           val  pt  =  checkClassType(ptype, parent.srcPos,
1541+           val  pt  =  checkClassType(
1542+               ptype.separateRefinements(cls, parentRefinements), parent.srcPos,
15401543              traitReq =  parent ne parents.head, stablePrefixReq =  true )
15411544          if  (pt.derivesFrom(cls)) {
15421545            val  addendum  =  parent match  {
@@ -1564,6 +1567,21 @@ class Namer { typer: Typer =>
15641567        }
15651568      }
15661569
1570+       /**  Enter all parent refinements as public class members, unless a definition 
1571+        *  with the same name already exists in the class. 
1572+        */  
1573+       def  enterParentRefinementSyms (refinements : List [(Name , Type )]) = 
1574+         val  refinedSyms  =  mutable.ListBuffer [Symbol ]()
1575+         for  (name, tp) <-  refinements do 
1576+           if  decls.lookupEntry(name) ==  null  then 
1577+             val  flags  =  tp match 
1578+               case  tp : MethodOrPoly  =>  Method  |  Synthetic  |  Deferred 
1579+               case  _ =>  Synthetic  |  Deferred 
1580+             refinedSyms +=  newSymbol(cls, name, flags, tp, coord =  original.rhs.span.startPos).entered
1581+         if  refinedSyms.nonEmpty then 
1582+           typr.println(i " parent refinement symbols:  ${refinedSyms.toList}" )
1583+           original.pushAttachment(ParentRefinements , refinedSyms.toList)
1584+ 
15671585      /**  If `parents` contains references to traits that have supertraits with implicit parameters 
15681586       *  add those supertraits in linearization order unless they are already covered by other 
15691587       *  parent types. For instance, in 
@@ -1632,6 +1650,7 @@ class Namer { typer: Typer =>
16321650      cls.invalidateMemberCaches() //  we might have checked for a member when parents were not known yet.
16331651      cls.setNoInitsFlags(parentsKind(parents), untpd.bodyKind(rest))
16341652      cls.setStableConstructor()
1653+       enterParentRefinementSyms(parentRefinements.toList)
16351654      processExports(using  localCtx)
16361655      defn.patchStdLibClass(cls)
16371656      addConstructorProxies(cls)
0 commit comments