@@ -147,44 +147,41 @@ class TreeChecker extends Phase with SymTransformer {
147
147
// don't check value classes after typer, as the constraint about constructors doesn't hold after transform
148
148
override def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(implicit ctx : Context ) = ()
149
149
150
- def withDefinedSym [T ](tree : untpd.Tree )(op : => T )(implicit ctx : Context ): T = tree match {
151
- case tree : untpd.DefTree =>
150
+ def withDefinedSyms [T ](trees : List [untpd.Tree ])(op : => T )(implicit ctx : Context ) = {
151
+ var locally = List .empty[Symbol ]
152
+ for (tree <- trees) {
152
153
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
- }
154
+ tree match {
155
+ case tree : untpd.DefTree =>
156
+ assert(isValidJVMName(sym.name.encode), s " ${sym.name.debugString} name is invalid on jvm " )
157
+ everDefinedSyms.get(sym) match {
158
+ case Some (t) =>
159
+ if (t ne tree)
160
+ ctx.warning(i " symbol ${sym.fullName} is defined at least twice in different parts of AST " )
161
+ // should become an error
162
+ case None =>
163
+ everDefinedSyms(sym) = tree
164
+ }
165
+ assert(! nowDefinedSyms.contains(sym), i " doubly defined symbol: ${sym.fullName} in $tree" )
166
+
167
+ if (ctx.settings.YcheckMods .value) {
168
+ tree match {
169
+ case t : untpd.MemberDef =>
170
+ if (t.name ne sym.name) ctx.warning(s " symbol ${sym.fullName} name doesn't correspond to AST: ${t}" )
171
+ // todo: compare trees inside annotations
172
+ case _ =>
173
+ }
174
+ }
175
+ locally = sym :: locally
176
+ nowDefinedSyms += sym
177
+ case _ =>
171
178
}
172
-
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
179
+ }
180
+ val res = op
181
+ nowDefinedSyms --= locally
182
+ res
180
183
}
181
184
182
- def withDefinedSyms [T ](trees : List [untpd.Tree ])(op : => T )(implicit ctx : Context ) =
183
- trees.foldRightBN(op)(withDefinedSym(_)(_))
184
-
185
- def withDefinedSymss [T ](vparamss : List [List [untpd.ValDef ]])(op : => T )(implicit ctx : Context ): T =
186
- vparamss.foldRightBN(op)(withDefinedSyms(_)(_))
187
-
188
185
def assertDefined (tree : untpd.Tree )(implicit ctx : Context ) =
189
186
if (
190
187
tree.symbol.maybeOwner.isTerm &&
@@ -388,7 +385,7 @@ class TreeChecker extends Phase with SymTransformer {
388
385
389
386
override def typedDefDef (ddef : untpd.DefDef , sym : Symbol )(implicit ctx : Context ) =
390
387
withDefinedSyms(ddef.tparams) {
391
- withDefinedSymss (ddef.vparamss) {
388
+ withDefinedSyms (ddef.vparamss.flatten ) {
392
389
if (! sym.isClassConstructor && ! (sym.name eq nme.STATIC_CONSTRUCTOR ))
393
390
assert(isValidJVMMethodName(sym.name.encode), s " ${sym.name.debugString} name is invalid on jvm " )
394
391
0 commit comments