summaryrefslogblamecommitdiff
path: root/src/repl/scala/tools/nsc/interpreter/ReplReporter.scala
blob: b01d242d445f9a0c2457e52375f936fe248292ce (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
                            
                                








                        
                                                             
 

                                                              
                                                                                                                   

                                                                                 















                                                                                                     







                                                                  









                                                                                     
                                                                      







                                                                          

   



                                                              



                                               

                                  
                                         
   
 
                                                                              
 

                                                                                                           
 
/* NSC -- new Scala compiler
 * Copyright 2002-2013 LAMP/EPFL
 * @author Paul Phillips
 */

package scala.tools.nsc
package interpreter

import reporters._
import IMain._

import scala.reflect.internal.util.{OffsetPosition, Position}

/** Like ReplGlobal, a layer for ensuring extra functionality.
 */
class ReplReporter(intp: IMain) extends ConsoleReporter(intp.settings, Console.in, new ReplStrippingWriter(intp)) {
  def printUntruncatedMessage(msg: String) = withoutTruncating(printMessage(msg))

  /** Whether very long lines can be truncated.  This exists so important
   *  debugging information (like printing the classpath) is not rendered
   *  invisible due to the max message length.
   */
  private var _truncationOK: Boolean = !intp.settings.verbose
  def truncationOK = _truncationOK
  def withoutTruncating[T](body: => T): T = {
    val saved = _truncationOK
    _truncationOK = false
    try body
    finally _truncationOK = saved
  }

  override def warning(pos: Position, msg: String): Unit = withoutTruncating(super.warning(pos, msg))
  override def error(pos: Position, msg: String): Unit   = withoutTruncating(super.error(pos, msg))

  import scala.io.AnsiColor.{ RED, YELLOW, RESET }

  def severityColor(severity: Severity): String = severity match {
    case ERROR   => RED
    case WARNING => YELLOW
    case INFO    => RESET
  }

  private val promptLength = replProps.promptText.lines.toList.last.length
  private val indentation  = " " * promptLength

  // colorized console labels
  override protected def clabel(severity: Severity): String = {
    val label0 = super.clabel(severity)
    if (replProps.colorOk) s"${severityColor(severity)}${label0}${RESET}" else label0
  }

  // shift indentation for source text entered at prompt
  override def print(pos: Position, msg: String, severity: Severity) {
    val adjusted =
      if (pos.source.file.name == "<console>")
        new OffsetPosition(pos.source, pos.offset.getOrElse(0)) {
          override def lineContent = s"${indentation}${super.lineContent}"
          override def lineCaret   = s"${indentation}${super.lineCaret}"
        }
      else pos
    super.print(adjusted, msg, severity)
  }

  override def printMessage(msg: String) {
    // Avoiding deadlock if the compiler starts logging before
    // the lazy val is complete.
    if (intp.isInitializeComplete) {
      if (intp.totalSilence) {
        if (isReplTrace)
          super.printMessage("[silent] " + msg)
      }
      else super.printMessage(msg)
    }
    else Console.println("[init] " + msg)
  }

  override def displayPrompt() = if (!intp.totalSilence) super.displayPrompt()

  override def rerunWithDetails(setting: reflect.internal.settings.MutableSettings#Setting, name: String) =
    s"; for details, enable `:setting $name' or `:replay $name'"
}