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