@@ -201,8 +201,8 @@ trait Printers
201201 this += " Block(" ++= stats += " , " += expr += " )"
202202 case If (cond, thenp, elsep) =>
203203 this += " If(" += cond += " , " += thenp += " , " += elsep += " )"
204- case Lambda (meth, tpt) =>
205- this += " Lambda (" += meth += " , " += tpt += " )"
204+ case Closure (meth, tpt) =>
205+ this += " Closure (" += meth += " , " += tpt += " )"
206206 case Match (selector, cases) =>
207207 this += " Match(" += selector += " , " ++= cases += " )"
208208 case ImpliedMatch (cases) =>
@@ -406,6 +406,7 @@ trait Printers
406406
407407 private implicit class TypeOps (buff : Buffer ) {
408408 def += (x : TypeOrBounds ): Buffer = { visitType(x); buff }
409+ def += (x : Option [TypeOrBounds ]): Buffer = { visitOption(x, visitType); buff }
409410 def ++= (x : List [TypeOrBounds ]): Buffer = { visitList(x, visitType); buff }
410411 }
411412
@@ -740,17 +741,6 @@ trait Printers
740741 printTree(body)
741742 }
742743
743- case IsDefDef (ddef @ DefDef (name, targs, argss, _, rhsOpt)) if name.startsWith(" $anonfun" ) =>
744- // Decompile lambda definition
745- assert(targs.isEmpty)
746- val args :: Nil = argss
747- val Some (rhs) = rhsOpt
748- inParens {
749- printArgsDefs(args)
750- this += " => "
751- printTree(rhs)
752- }
753-
754744 case IsDefDef (ddef @ DefDef (name, targs, argss, tpt, rhs)) =>
755745 printDefAnnotations(ddef)
756746
@@ -901,6 +891,13 @@ trait Printers
901891 this += " = "
902892 printTree(rhs)
903893
894+ case Lambda (params, body) => // must come before `Block`
895+ inParens {
896+ printArgsDefs(params)
897+ this += " => "
898+ printTree(body)
899+ }
900+
904901 case Block (stats0, expr) =>
905902 val stats = stats0.filter {
906903 case IsValDef (tree) => ! tree.symbol.flags.is(Flags .Object )
@@ -911,10 +908,6 @@ trait Printers
911908 case Inlined (_, bindings, expansion) =>
912909 printFlatBlock(bindings, expansion)
913910
914- case Lambda (meth, tpt) =>
915- // Printed in by it's DefDef
916- this
917-
918911 case If (cond, thenp, elsep) =>
919912 this += highlightKeyword(" if " )
920913 inParens(printTree(cond))
@@ -982,6 +975,8 @@ trait Printers
982975 def flatBlock (stats : List [Statement ], expr : Term ): (List [Statement ], Term ) = {
983976 val flatStats = List .newBuilder[Statement ]
984977 def extractFlatStats (stat : Statement ): Unit = stat match {
978+ case Lambda (_, _) => // must come before `Block`
979+ flatStats += stat
985980 case Block (stats1, expr1) =>
986981 val it = stats1.iterator
987982 while (it.hasNext)
@@ -996,6 +991,8 @@ trait Printers
996991 case stat => flatStats += stat
997992 }
998993 def extractFlatExpr (term : Term ): Term = term match {
994+ case Lambda (_, _) => // must come before `Block`
995+ term
999996 case Block (stats1, expr1) =>
1000997 val it = stats1.iterator
1001998 while (it.hasNext)
@@ -1017,23 +1014,16 @@ trait Printers
10171014
10181015 def printFlatBlock (stats : List [Statement ], expr : Term )(implicit elideThis : Option [Symbol ]): Buffer = {
10191016 val (stats1, expr1) = flatBlock(stats, expr)
1020- // Remove Lambda nodes, lambdas are printed by their definition
10211017 val stats2 = stats1.filter {
1022- case Lambda (_, _ ) => false
1018+ case IsTypeDef (tree ) => ! tree.symbol.annots.exists(_.symbol.owner.fullName == " scala.internal.Quoted$.quoteTypeTag " )
10231019 case _ => true
10241020 }
1025- val (stats3, expr3) = expr1 match {
1026- case Lambda (_, _) =>
1027- val init :+ last = stats2
1028- (init, last)
1029- case _ => (stats2, expr1)
1030- }
1031- if (stats3.isEmpty) {
1032- printTree(expr3)
1021+ if (stats2.isEmpty) {
1022+ printTree(expr1)
10331023 } else {
10341024 this += " {"
10351025 indented {
1036- printStats(stats3, expr3 )
1026+ printStats(stats2, expr1 )
10371027 }
10381028 this += lineBreak() += " }"
10391029 }
@@ -1043,6 +1033,7 @@ trait Printers
10431033 def printSeparator (next : Tree ): Unit = {
10441034 // Avoid accidental application of opening `{` on next line with a double break
10451035 def rec (next : Tree ): Unit = next match {
1036+ case Lambda (_, _) => this += lineBreak()
10461037 case Block (stats, _) if stats.nonEmpty => this += doubleLineBreak()
10471038 case Inlined (_, bindings, _) if bindings.nonEmpty => this += doubleLineBreak()
10481039 case Select (qual, _) => rec(qual)
0 commit comments