Skip to content

Commit 79cbafc

Browse files
committed
Fix internal definition of Unapply
Remove old workaround for `Unapply`. Users may see an extra `Typed` in the trees of patterns Fixes #12221
1 parent 3d8b6a1 commit 79cbafc

File tree

4 files changed

+15
-20
lines changed

4 files changed

+15
-20
lines changed

compiler/src/scala/quoted/runtime/impl/QuotesImpl.scala

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -333,13 +333,11 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
333333

334334
object TermTypeTest extends TypeTest[Tree, Term]:
335335
def unapply(x: Tree): Option[Term & x.type] = x match
336-
case _ if UnapplyTypeTest.unapply(x).isDefined => None
337-
case _: tpd.PatternTree => None
338-
case x: (tpd.Tree & x.type) if x.isTerm => Some(x)
336+
case x: tpd.PatternTree => None
339337
case x: (tpd.SeqLiteral & x.type) => Some(x)
340338
case x: (tpd.Inlined & x.type) => Some(x)
341339
case x: (tpd.NamedArg & x.type) => Some(x)
342-
case _ => None
340+
case _ => if x.isTerm then Some(x) else None
343341
end TermTypeTest
344342

345343
object Term extends TermModule:
@@ -1424,14 +1422,12 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
14241422
end extension
14251423
end BindMethods
14261424

1427-
type Unapply = tpd.UnApply | tpd.Typed // tpd.Typed containing a tpd.UnApply as expression
1425+
type Unapply = tpd.UnApply
14281426

14291427
object UnapplyTypeTest extends TypeTest[Tree, Unapply]:
1430-
def unapply(x: Tree): Option[Unapply & x.type] =
1431-
x match // keep in sync with UnapplyMethodsImpl.selfUnApply
1432-
case x: (tpd.UnApply & x.type) => Some(x)
1433-
case x: (tpd.Typed & x.type) if x.expr.isInstanceOf[tpd.UnApply] => Some(x)
1434-
case _ => None
1428+
def unapply(x: Tree): Option[Unapply & x.type] = x match
1429+
case x: (tpd.UnApply & x.type) => Some(x)
1430+
case _ => None
14351431
end UnapplyTypeTest
14361432

14371433
object Unapply extends UnapplyModule:
@@ -1443,14 +1439,10 @@ class QuotesImpl private (using val ctx: Context) extends Quotes, QuoteUnpickler
14431439

14441440
given UnapplyMethods: UnapplyMethods with
14451441
extension (self: Unapply)
1446-
def fun: Term = selfUnApply(self).fun
1447-
def implicits: List[Term] = selfUnApply(self).implicits
1448-
def patterns: List[Tree] = effectivePatterns(selfUnApply(self).patterns)
1449-
end extension
1450-
private def selfUnApply(self: Unapply): tpd.UnApply =
1451-
self match // keep in sync with UnapplyTypeTest
1452-
case self: tpd.UnApply => self
1453-
case self: tpd.Typed => self.expr.asInstanceOf[tpd.UnApply]
1442+
def fun: Term = self.fun
1443+
def implicits: List[Term] = self.implicits
1444+
def patterns: List[Tree] = effectivePatterns(self.patterns)
1445+
end extension
14541446
private def effectivePatterns(patterns: List[Tree]): List[Tree] =
14551447
patterns match
14561448
case patterns0 :+ dotc.ast.Trees.SeqLiteral(elems, _) => patterns0 ::: elems

compiler/src/scala/quoted/runtime/impl/printers/SourceCode.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,9 @@ object SourceCode {
530530
case Closure(meth, _) =>
531531
printTree(meth)
532532

533+
case _:Unapply | _:Alternatives | _:Bind =>
534+
printPattern(tree)
535+
533536
case _ =>
534537
throw new MatchError(tree.show(using Printer.TreeStructure))
535538

library/src/scala/quoted/Quotes.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4359,7 +4359,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
43594359
case New(tpt) =>
43604360
New.copy(tree)(transformTypeTree(tpt)(owner))
43614361
case Typed(expr, tpt) =>
4362-
Typed.copy(tree)(transformTerm(expr)(owner), transformTypeTree(tpt)(owner))
4362+
Typed.copy(tree)(/*FIXME #12222: transformTerm(expr)(owner)*/transformTree(expr)(owner).asInstanceOf[Term], transformTypeTree(tpt)(owner))
43634363
case tree: NamedArg =>
43644364
NamedArg.copy(tree)(tree.name, transformTerm(tree.value)(owner))
43654365
case Assign(lhs, rhs) =>

tests/run-staging/i5161.check

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
run : Some(2)
22
show : scala.Tuple2.apply[scala.Option[scala.Int], scala.Option[scala.Int]](scala.Some.apply[scala.Int](1), scala.Some.apply[scala.Int](1)) match {
3-
case scala.Tuple2(scala.Some(x), scala.Some(y)) =>
3+
case scala.Tuple2((scala.Some(x): scala.Some[scala.Int]), (scala.Some(y): scala.Some[scala.Int])) =>
44
scala.Some.apply[scala.Int](x.+(y))
55
case _ =>
66
scala.None

0 commit comments

Comments
 (0)