@@ -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