summaryrefslogblamecommitdiff
path: root/src/scalap/scala/tools/scalap/CodeWriter.scala
blob: 07aba0b632569c859a264546153439ab454f65d3 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                                                
                                                                 
                                                               


  
 

                    
 



                                  
 
                                            
















                                                              
                                              
                                                   
 
                            






                                                   
              



                            
              









                             
                                                  













                              
              






















                                                                      
                                                                         
 
                                                                          















                                                                     
              









                       
                                              



                                                     
/*     ___ ____ ___   __   ___   ___
**    / _// __// _ | / /  / _ | / _ \    Scala classfile decoder
**  __\ \/ /__/ __ |/ /__/ __ |/ ___/    (c) 2003-2013, LAMP/EPFL
** /____/\___/_/ |_/____/_/ |_/_/        http://scala-lang.org/
**
*/


package scala
package tools.scalap

import java.io._


class CodeWriter(writer: Writer) {

  private val nl = scala.compat.Platform.EOL
  private var step = "  "
  private var level = 0
  private var align = false
  private var space = false
  private var line = false

  def getWriter = writer

  def getIndentLevel = level

  def setIndentLevel(level: Int): CodeWriter = {
    this.level = level
    this
  }

  def getIndentWidth = if (step == null) -1 else step.length()

  def setIndentWidth(width: Int): CodeWriter =
    setIndentString(List.fill(width)(' ').mkString)

  def getIndentString = step

  def setIndentString(step: String): CodeWriter = {
    this.step = step
    this
  }

  def indent: CodeWriter = {
    level += 1
    this
  }

  def undent: CodeWriter = {
    level -= 1
    this
  }

  def newline: CodeWriter = {
    if (step == null)
      newspace
    else if (!line) {
      try {
        writer.write(nl)
      } catch {
        case e: Exception => sys.error("IO error")
      }
      line = align
      align = true
      space = false
      this
    } else
      this
  }

  def newspace: CodeWriter = {
    space = !align
    this
  }

  def *() = {}

  def println: CodeWriter = newline

  def println(value: Boolean): CodeWriter = print(value).newline

  def println(value: Byte): CodeWriter = print(value).newline

  def println(value: Short): CodeWriter = print(value).newline

  def println(value: Char): CodeWriter = print(value).newline

  def println(value: Int): CodeWriter = print(value).newline

  def println(value: Long): CodeWriter = print(value).newline

  def println(value: Float): CodeWriter = print(value).newline

  def println(value: Double): CodeWriter = print(value).newline

  def println(value: String): CodeWriter = print(value).newline

  def print(value: Boolean): CodeWriter = print(String.valueOf(value))

  def print(value: Byte): CodeWriter = print(String.valueOf(value.toInt))

  def print(value: Short): CodeWriter = print(String.valueOf(value.toInt))

  def print(value: Char): CodeWriter = print(String.valueOf(value))

  def print(value: Int): CodeWriter = print(String.valueOf(value))

  def print(value: Long): CodeWriter = print(String.valueOf(value))

  def print(value: Float): CodeWriter = print(String.valueOf(value))

  def print(value: Double): CodeWriter = print(String.valueOf(value))

  def print(value: String): CodeWriter = try {
    if (align) {
      var i = 0
      while (i < level) {
        writer.write(step)
        i += 1
      }
    }
    if (space)
      writer.write(" ")
    writer.write(value)
    align = false
    space = false
    line = false
    this
  } catch {
    case e: Exception => sys.error("IO error")
  }

  override def toString(): String = writer.toString()
}