diff options
author | Som Snytt <som.snytt@gmail.com> | 2016-09-15 12:58:21 -0700 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2017-03-11 23:38:08 -0800 |
commit | bd280077d04a3ac84ca48f549faaa8915d46ef2e (patch) | |
tree | a7c8b244ef84b44df201c88b4233d17bcec306d1 /src/reflect/scala/reflect/internal/TreeGen.scala | |
parent | 1b415c904bece230a706c0d19462345fc87abf67 (diff) | |
download | scala-bd280077d04a3ac84ca48f549faaa8915d46ef2e.tar.gz scala-bd280077d04a3ac84ca48f549faaa8915d46ef2e.tar.bz2 scala-bd280077d04a3ac84ca48f549faaa8915d46ef2e.zip |
SI-9158 No warn for comprehension patvars
Midstream assignments should not cause unused warnings.
Currently the encoding doesn't pass them along, but
passes the value from which they were destructured.
For for-comprehensions only, the patvar transform
tags the binds so that they are not warned if they
turn up in a valdef and are unused.
Extractors are invoked multiple times if the patvar is
used later, as noted on the ticket.
In a yield, the valdef is emitted only if the patvar
is referenced (possibly saving the extra extraction),
so there is no warning there currently.
Diffstat (limited to 'src/reflect/scala/reflect/internal/TreeGen.scala')
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeGen.scala | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/reflect/scala/reflect/internal/TreeGen.scala b/src/reflect/scala/reflect/internal/TreeGen.scala index 4fecaf70df..373758d0a5 100644 --- a/src/reflect/scala/reflect/internal/TreeGen.scala +++ b/src/reflect/scala/reflect/internal/TreeGen.scala @@ -797,7 +797,7 @@ abstract class TreeGen { /** Create tree for for-comprehension generator <val pat0 <- rhs0> */ def mkGenerator(pos: Position, pat: Tree, valeq: Boolean, rhs: Tree)(implicit fresh: FreshNameCreator): Tree = { - val pat1 = patvarTransformer.transform(pat) + val pat1 = patvarTransformerForFor.transform(pat) if (valeq) ValEq(pat1, rhs).setPos(pos) else ValFrom(pat1, mkCheckIfRefutable(pat1, rhs)).setPos(pos) } @@ -894,11 +894,15 @@ abstract class TreeGen { * x becomes x @ _ * x: T becomes x @ (_: T) */ - object patvarTransformer extends Transformer { + class PatvarTransformer(forFor: Boolean) extends Transformer { override def transform(tree: Tree): Tree = tree match { - case Ident(name) if (treeInfo.isVarPattern(tree) && name != nme.WILDCARD) => - atPos(tree.pos)(Bind(name, atPos(tree.pos.focus) (Ident(nme.WILDCARD)))) - case Typed(id @ Ident(name), tpt) if (treeInfo.isVarPattern(id) && name != nme.WILDCARD) => + case Ident(name) if treeInfo.isVarPattern(tree) && name != nme.WILDCARD => + atPos(tree.pos) { + val b = Bind(name, atPos(tree.pos.focus) (Ident(nme.WILDCARD))) + if (forFor) b updateAttachment AtBoundIdentifierAttachment + else b + } + case Typed(id @ Ident(name), tpt) if treeInfo.isVarPattern(id) && name != nme.WILDCARD => atPos(tree.pos.withPoint(id.pos.point)) { Bind(name, atPos(tree.pos.withStart(tree.pos.point)) { Typed(Ident(nme.WILDCARD), tpt) @@ -918,6 +922,9 @@ abstract class TreeGen { tree } } + object patvarTransformer extends PatvarTransformer(forFor = false) + /** Tag pat vars in for comprehensions. */ + object patvarTransformerForFor extends PatvarTransformer(forFor = true) // annotate the expression with @unchecked def mkUnchecked(expr: Tree): Tree = atPos(expr.pos) { |