@@ -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,65 @@ 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
+ val resultExtractors = boundNames.map(name => resultExtractor(req, name))
674
+ code.print(resultExtractors.mkString(" " ))
675
+ }
676
+
677
+ private def resultExtractor (req : Request , varName : Name ): String = {
678
+ val prettyName = varName.decode
679
+ val varType = string2code(req.typeOf(varName))
680
+ val fullPath = req.fullPath(varName)
681
+
682
+ s """ + " $prettyName: $varType = " + {
683
+ | if ( $fullPath.asInstanceOf[AnyRef] != null) {
684
+ | (if ( $fullPath.toString().contains(' \\ n')) " \\ n" else "") +
685
+ | $fullPath.toString() + " \\ n"
686
+ | } else {
687
+ | "null \\ n"
688
+ | }
689
+ |} """ .stripMargin
687
690
}
691
+
692
+ protected def _boundNames : List [Name ]
693
+ protected def shouldShowResult (req : Request ): Boolean
694
+ }
695
+
696
+ private class ValHandler (statement : ValDef ) extends ValOrPatHandler (statement) {
697
+ override def _boundNames = List (statement.name)
698
+
699
+ override def shouldShowResult (req : Request ): Boolean =
700
+ ! statement.mods.is(Flags .AccessFlags ) &&
701
+ ! (isGeneratedVarName(statement.name.toString) &&
702
+ req.typeOf(statement.name.encode) == " Unit" )
703
+ }
704
+
705
+
706
+ private class PatHandler (statement : PatDef ) extends ValOrPatHandler (statement) {
707
+ override def _boundNames = statement.pats.flatMap(findVariableNames)
708
+
709
+ override def shouldShowResult (req : Request ): Boolean =
710
+ ! statement.mods.is(Flags .AccessFlags )
711
+
712
+ private def findVariableNames (tree : Tree ): List [Name ] = tree match {
713
+ case Ident (name) if name.toString != " _" => List (name)
714
+ case _ => VariableNameFinder (Nil , tree).reverse
715
+ }
716
+
717
+ private object VariableNameFinder extends UntypedDeepFolder [List [Name ]](
718
+ (acc : List [Name ], t : Tree ) => t match {
719
+ case _ : BackquotedIdent => acc
720
+ case Ident (name) if name.isVariableName && name.toString != " _" => name :: acc
721
+ case Bind (name, _) if name.isVariableName => name :: acc
722
+ case _ => acc
723
+ }
724
+ )
688
725
}
689
726
690
727
private class DefHandler (defDef : DefDef ) extends StatementHandler (defDef) {
@@ -836,7 +873,7 @@ class CompilingInterpreter(
836
873
val stringWriter = new StringWriter ()
837
874
val stream = new NewLinePrintWriter (stringWriter)
838
875
writer(stream)
839
- stream.close
876
+ stream.close()
840
877
stringWriter.toString
841
878
}
842
879
0 commit comments