@@ -147,44 +147,41 @@ class TreeChecker extends Phase with SymTransformer {
147147 // don't check value classes after typer, as the constraint about constructors doesn't hold after transform
148148 override def checkDerivedValueClass (clazz : Symbol , stats : List [Tree ])(implicit ctx : Context ) = ()
149149
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) {
152153 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 _ =>
171178 }
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
180183 }
181184
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-
188185 def assertDefined (tree : untpd.Tree )(implicit ctx : Context ) =
189186 if (
190187 tree.symbol.maybeOwner.isTerm &&
@@ -388,7 +385,7 @@ class TreeChecker extends Phase with SymTransformer {
388385
389386 override def typedDefDef (ddef : untpd.DefDef , sym : Symbol )(implicit ctx : Context ) =
390387 withDefinedSyms(ddef.tparams) {
391- withDefinedSymss (ddef.vparamss) {
388+ withDefinedSyms (ddef.vparamss.flatten ) {
392389 if (! sym.isClassConstructor && ! (sym.name eq nme.STATIC_CONSTRUCTOR ))
393390 assert(isValidJVMMethodName(sym.name.encode), s " ${sym.name.debugString} name is invalid on jvm " )
394391
0 commit comments