@@ -222,7 +222,7 @@ class CompilingInterpreter(
222
222
if (delayOutput)
223
223
previousOutput ++= resultStrings.map(clean)
224
224
else if (printResults || ! succeeded)
225
- resultStrings.map (x => out.print(clean(x)))
225
+ resultStrings.foreach (x => out.print(clean(x)))
226
226
if (succeeded) {
227
227
prevRequests += req
228
228
Interpreter .Success
@@ -328,6 +328,7 @@ class CompilingInterpreter(
328
328
private def chooseHandler (stat : Tree ): StatementHandler = stat match {
329
329
case stat : DefDef => new DefHandler (stat)
330
330
case stat : ValDef => new ValHandler (stat)
331
+ case stat : PatDef => new PatHandler (stat)
331
332
case stat @ Assign (Ident (_), _) => new AssignHandler (stat)
332
333
case stat : ModuleDef => new ModuleHandler (stat)
333
334
case stat : TypeDef if stat.isClassDef => new ClassHandler (stat)
@@ -662,29 +663,71 @@ class CompilingInterpreter(
662
663
663
664
private class GenericHandler (statement : Tree ) extends StatementHandler (statement)
664
665
665
- private class ValHandler (statement : ValDef ) extends StatementHandler (statement) {
666
- override val boundNames = List (statement.name)
666
+ private abstract class ValOrPatHandler (statement : Tree )
667
+ extends StatementHandler (statement) {
668
+ override val boundNames : List [Name ] = _boundNames
667
669
override def valAndVarNames = boundNames
668
670
669
671
override def resultExtractionCode (req : Request , code : PrintWriter ): Unit = {
670
- val vname = statement.name
671
- if (! statement.mods.is(Flags .AccessFlags ) &&
672
- ! (isGeneratedVarName(vname.toString) &&
673
- req.typeOf(vname.encode) == " Unit" )) {
674
- val prettyName = vname.decode
675
- code.print(" + \" " + prettyName + " : " +
676
- string2code(req.typeOf(vname)) +
677
- " = \" + " +
678
- " (if(" +
679
- req.fullPath(vname) +
680
- " .asInstanceOf[AnyRef] != null) " +
681
- " ((if(" +
682
- req.fullPath(vname) +
683
- " .toString().contains('\\ n')) " +
684
- " \"\\ n\" else \"\" ) + " +
685
- req.fullPath(vname) + " .toString() + \"\\ n\" ) else \" null\\ n\" ) " )
686
- }
672
+ if (! shouldShowResult(req)) return
673
+
674
+ val resultExtractors =
675
+ for (varName <- boundNames)
676
+ yield resultExtractionCode(req, varName)
677
+ code.print(resultExtractors.mkString(" " ))
678
+ }
679
+
680
+ private def resultExtractionCode (req : Request , varName : Name ): String = {
681
+ def if_ (condition : String )(thenBranch : String )(elseBranch : String ): String =
682
+ s " (if ( $condition) { $thenBranch} else { $elseBranch}) "
683
+
684
+ val prettyName = varName.decode
685
+ val varType = string2code(req.typeOf(varName))
686
+ val fullPath = req.fullPath(varName)
687
+
688
+ s """ + " $prettyName: $varType = " + """ +
689
+ if_(s " $fullPath.asInstanceOf[AnyRef] != null " ) {
690
+ if_(s " $fullPath.toString().contains(' \\ n') " ) { " \"\\ n\" " }
691
+ /* else */ { " \"\" " } +
692
+ s """ + $fullPath.toString() + " \\ n" """
693
+ } /* else */ {
694
+ " \" null\\ n\" "
695
+ }
687
696
}
697
+
698
+ protected def _boundNames : List [Name ]
699
+ protected def shouldShowResult (req : Request ): Boolean
700
+ }
701
+
702
+ private class ValHandler (statement : ValDef ) extends ValOrPatHandler (statement) {
703
+ override def _boundNames = List (statement.name)
704
+
705
+ override def shouldShowResult (req : Request ): Boolean =
706
+ ! statement.mods.is(Flags .AccessFlags ) &&
707
+ ! (isGeneratedVarName(statement.name.toString) &&
708
+ req.typeOf(statement.name.encode) == " Unit" )
709
+ }
710
+
711
+
712
+ private class PatHandler (statement : PatDef ) extends ValOrPatHandler (statement) {
713
+ override def _boundNames = statement.pats.flatMap(findVariableNames)
714
+
715
+ override def shouldShowResult (req : Request ): Boolean =
716
+ ! statement.mods.is(Flags .AccessFlags )
717
+
718
+ private def findVariableNames (tree : Tree ): List [Name ] = tree match {
719
+ case Ident (name) if name.toString != " _" => List (name)
720
+ case _ => VariableNameFinder (Nil , tree).reverse
721
+ }
722
+
723
+ private object VariableNameFinder extends UntypedDeepFolder [List [Name ]](
724
+ (acc : List [Name ], t : Tree ) => t match {
725
+ case _ : BackquotedIdent => acc
726
+ case Ident (name) if name.isVariableName && name.toString != " _" => name :: acc
727
+ case Bind (name, _) if name.isVariableName => name :: acc
728
+ case _ => acc
729
+ }
730
+ )
688
731
}
689
732
690
733
private class DefHandler (defDef : DefDef ) extends StatementHandler (defDef) {
@@ -836,7 +879,7 @@ class CompilingInterpreter(
836
879
val stringWriter = new StringWriter ()
837
880
val stream = new NewLinePrintWriter (stringWriter)
838
881
writer(stream)
839
- stream.close
882
+ stream.close()
840
883
stringWriter.toString
841
884
}
842
885
0 commit comments