@@ -149,34 +149,42 @@ class TreeChecker extends Phase with SymTransformer {
149
149
150
150
def withDefinedSym [T ](tree : untpd.Tree )(op : => T )(implicit ctx : Context ): T = tree match {
151
151
case tree : untpd.DefTree =>
152
- val sym = tree.symbol
153
- assert(isValidJVMName(sym.name.encode), s " ${sym.name.debugString} name is invalid on jvm " )
154
- everDefinedSyms.get(sym) match {
155
- case Some (t) =>
156
- if (t ne tree)
157
- ctx.warning(i " symbol ${sym.fullName} is defined at least twice in different parts of AST " )
158
- // should become an error
159
- case None =>
160
- everDefinedSyms(sym) = tree
161
- }
162
- assert(! nowDefinedSyms.contains(sym), i " doubly defined symbol: ${sym.fullName} in $tree" )
163
-
164
- if (ctx.settings.YcheckMods .value) {
165
- tree match {
166
- case t : untpd.MemberDef =>
167
- if (t.name ne sym.name) ctx.warning(s " symbol ${sym.fullName} name doesn't correspond to AST: ${t}" )
168
- // todo: compare trees inside annotations
169
- case _ =>
170
- }
152
+ preWithDefinedSym(tree)
153
+ postWithDefinedSym(tree)(op)
154
+ case _ => op
155
+ }
156
+
157
+ private def preWithDefinedSym [T ](tree : untpd.DefTree )(implicit ctx : Context ): Unit = {
158
+ val sym = tree.symbol
159
+ assert(isValidJVMName(sym.name.encode), s " ${sym.name.debugString} name is invalid on jvm " )
160
+ everDefinedSyms.get(sym) match {
161
+ case Some (t) =>
162
+ if (t ne tree)
163
+ ctx.warning(i " symbol ${sym.fullName} is defined at least twice in different parts of AST " )
164
+ // should become an error
165
+ case None =>
166
+ everDefinedSyms(sym) = tree
167
+ }
168
+ assert(! nowDefinedSyms.contains(sym), i " doubly defined symbol: ${sym.fullName} in $tree" )
169
+
170
+ if (ctx.settings.YcheckMods .value) {
171
+ tree match {
172
+ case t : untpd.MemberDef =>
173
+ if (t.name ne sym.name) ctx.warning(s " symbol ${sym.fullName} name doesn't correspond to AST: ${t}" )
174
+ // todo: compare trees inside annotations
175
+ case _ =>
171
176
}
177
+ }
178
+ }
172
179
173
- nowDefinedSyms += tree.symbol
174
- // ctx.echo(i"defined: ${tree.symbol}")
175
- val res = op
176
- nowDefinedSyms -= tree.symbol
177
- // ctx.echo(i"undefined: ${tree.symbol}")
178
- res
179
- case _ => op
180
+ private def postWithDefinedSym [T ](tree : untpd.DefTree )(op : => T )(implicit ctx : Context ): T = {
181
+ val sym = tree.symbol
182
+ nowDefinedSyms += sym
183
+ // ctx.echo(i"defined: ${tree.symbol}")
184
+ val res = op
185
+ nowDefinedSyms -= sym
186
+ // ctx.echo(i"undefined: ${tree.symbol}")
187
+ res
180
188
}
181
189
182
190
def withDefinedSyms [T ](trees : List [untpd.Tree ])(op : => T )(implicit ctx : Context ) =
@@ -411,8 +419,21 @@ class TreeChecker extends Phase with SymTransformer {
411
419
}
412
420
}
413
421
414
- override def typedBlock (tree : untpd.Block , pt : Type )(implicit ctx : Context ) =
415
- withDefinedSyms(tree.stats) { super .typedBlock(tree, pt) }
422
+ override def typedBlock (tree : untpd.Block , pt : Type )(implicit ctx : Context ) = {
423
+ var locally = List .empty[Symbol ]
424
+ for (stat <- tree.stats) {
425
+ stat match {
426
+ case stat : untpd.DefTree =>
427
+ preWithDefinedSym(stat)
428
+ locally = stat.symbol :: locally
429
+ nowDefinedSyms += stat.symbol
430
+ case _ =>
431
+ }
432
+ }
433
+ val res = super .typedBlock(tree, pt)
434
+ nowDefinedSyms --= locally
435
+ res
436
+ }
416
437
417
438
override def typedInlined (tree : untpd.Inlined , pt : Type )(implicit ctx : Context ) =
418
439
withDefinedSyms(tree.bindings) { super .typedInlined(tree, pt) }
0 commit comments