@@ -49,26 +49,22 @@ class CheckShadowing extends MiniPhase:
49
49
50
50
override def description : String = CheckShadowing .description
51
51
52
+ override def isEnabled (using Context ): Boolean = ctx.settings.Wshadow .value.nonEmpty
53
+
52
54
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
56
56
57
- // Setup before the traversal
58
57
override def prepareForUnit (tree : tpd.Tree )(using Context ): Context =
59
58
val data = ShadowingData ()
60
59
val fresh = ctx.fresh.setProperty(_key, data)
61
60
shadowingDataApply(sd => sd.registerRootImports())(using fresh)
62
61
63
- // Reporting on traversal's end
64
62
override def transformUnit (tree : tpd.Tree )(using Context ): tpd.Tree =
65
63
shadowingDataApply(sd =>
66
64
reportShadowing(sd.getShadowingResult)
67
65
)
68
66
tree
69
67
70
- // MiniPhase traversal :
71
-
72
68
override def prepareForPackageDef (tree : tpd.PackageDef )(using Context ): Context =
73
69
shadowingDataApply(sd => sd.inNewScope())
74
70
ctx
@@ -94,14 +90,14 @@ class CheckShadowing extends MiniPhase:
94
90
if tree.symbol.isAliasType then // if alias, the parent is the current symbol
95
91
nestedTypeTraverser(tree.symbol).traverse(tree.rhs)
96
92
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))
101
98
else
102
99
ctx
103
100
104
-
105
101
override def transformPackageDef (tree : tpd.PackageDef )(using Context ): tpd.Tree =
106
102
shadowingDataApply(sd => sd.outOfScope())
107
103
tree
@@ -115,13 +111,16 @@ class CheckShadowing extends MiniPhase:
115
111
tree
116
112
117
113
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
121
121
shadowingDataApply(sd => sd.computeTypeParamShadowsFor(tree.symbol)(using ctx))
122
122
tree
123
123
124
- // Helpers :
125
124
private def isValidTypeParamOwner (owner : Symbol )(using Context ): Boolean =
126
125
! owner.isConstructor && ! owner.is(Synthetic ) && ! owner.is(Exported )
127
126
@@ -310,4 +309,3 @@ object CheckShadowing:
310
309
case class ShadowResult (warnings : List [ShadowWarning ])
311
310
312
311
end CheckShadowing
313
-
0 commit comments