@@ -49,26 +49,22 @@ class CheckShadowing extends MiniPhase:
4949
5050  override  def  description :  String  =  CheckShadowing .description
5151
52+   override  def  isEnabled (using  Context ):  Boolean  =  ctx.settings.Wshadow .value.nonEmpty
53+ 
5254  override  def  isRunnable (using  Context ):  Boolean  = 
53-     super .isRunnable && 
54-     ctx.settings.Wshadow .value.nonEmpty && 
55-     ! ctx.isJava
55+     super .isRunnable &&  ctx.settings.Wshadow .value.nonEmpty &&  ! ctx.isJava
5656
57-   //  Setup before the traversal
5857  override  def  prepareForUnit (tree : tpd.Tree )(using  Context ):  Context  = 
5958    val  data  =  ShadowingData ()
6059    val  fresh  =  ctx.fresh.setProperty(_key, data)
6160    shadowingDataApply(sd =>  sd.registerRootImports())(using  fresh)
6261
63-   //  Reporting on traversal's end
6462  override  def  transformUnit (tree : tpd.Tree )(using  Context ):  tpd.Tree  = 
6563    shadowingDataApply(sd => 
6664      reportShadowing(sd.getShadowingResult)
6765    )
6866    tree
6967
70-   //  MiniPhase traversal :
71- 
7268  override  def  prepareForPackageDef (tree : tpd.PackageDef )(using  Context ):  Context  = 
7369    shadowingDataApply(sd =>  sd.inNewScope())
7470    ctx
@@ -94,14 +90,14 @@ class CheckShadowing extends MiniPhase:
9490    if  tree.symbol.isAliasType then  //  if alias, the parent is the current symbol
9591      nestedTypeTraverser(tree.symbol).traverse(tree.rhs)
9692    if  tree.symbol.is(Param ) then  //  if param, the parent is up
97-       val  owner  =  tree.symbol.owner
98-       val  parent  =  if  (owner.isConstructor) then  owner.owner else  owner
99-       nestedTypeTraverser(parent).traverse(tree.rhs)(using  ctx.outer)
100-       shadowingDataApply(sd =>  sd.registerCandidate(parent, tree))
93+       val  enclosing  = 
94+         val  owner  =  tree.symbol.ownersIterator.dropWhile(_.is(Param )).next()
95+         if  owner.isConstructor then  owner.owner else  owner
96+       nestedTypeTraverser(enclosing).traverse(tree.rhs)(using  ctx.outer)
97+       shadowingDataApply(_.registerCandidate(enclosing, tree))
10198    else 
10299      ctx
103100
104- 
105101  override  def  transformPackageDef (tree : tpd.PackageDef )(using  Context ):  tpd.Tree  = 
106102    shadowingDataApply(sd =>  sd.outOfScope())
107103    tree
@@ -115,13 +111,16 @@ class CheckShadowing extends MiniPhase:
115111    tree
116112
117113  override  def  transformTypeDef (tree : tpd.TypeDef )(using  Context ):  tpd.Tree  = 
118-     if  tree.symbol.is(Param ) &&   isValidTypeParamOwner(tree.symbol.owner) then  //  Do not register for constructors the work is done for the Class owned equivalent TypeDef
119-       shadowingDataApply(sd =>  sd.computeTypeParamShadowsFor(tree.symbol.owner)(using  ctx.outer))
120-     if  tree.symbol.isAliasType then  //  No need to start outer here, because the TypeDef reached here it's already the parent
114+     //  Do not register for constructors the work is done for the Class owned equivalent TypeDef
115+     if  tree.symbol.is(Param ) then 
116+       val  owner  =  tree.symbol.ownersIterator.dropWhile(_.is(Param )).next()
117+       if  isValidTypeParamOwner(owner) then 
118+         shadowingDataApply(_.computeTypeParamShadowsFor(owner)(using  ctx.outer))
119+     //  No need to start outer here, because the TypeDef reached here it's already the parent
120+     if  tree.symbol.isAliasType then 
121121      shadowingDataApply(sd =>  sd.computeTypeParamShadowsFor(tree.symbol)(using  ctx))
122122    tree
123123
124-   //  Helpers :
125124  private  def  isValidTypeParamOwner (owner : Symbol )(using  Context ):  Boolean  = 
126125    ! owner.isConstructor &&  ! owner.is(Synthetic ) &&  ! owner.is(Exported )
127126
@@ -310,4 +309,3 @@ object CheckShadowing:
310309      case  class  ShadowResult (warnings : List [ShadowWarning ])
311310
312311end  CheckShadowing 
313- 
0 commit comments