summaryrefslogblamecommitdiff
path: root/examples/scala-js/javalanglib/src/main/scala/java/lang/StringBuilder.scala
blob: e8bd2b77dff66780da810ec7302b8c80b893b168 (plain) (tree)

















































































































































































                                                                                                                               
package java.lang

class StringBuilder(private var content: String) extends CharSequence
                                                    with Appendable
                                                    with java.io.Serializable {
  def this() = this("")
  def this(initialCapacity: Int) = this("")
  def this(csq: CharSequence) = this(csq.toString)

  def append(s: String): StringBuilder = {
    content += { if (s == null) "null" else s }
    this
  }

  def append(b: scala.Boolean): StringBuilder = append(b.toString())
  def append(c: scala.Char): StringBuilder = append(c.toString())

  def append(str: Array[scala.Char]): StringBuilder =
    append(str, 0, str.length)

  def append(str: Array[scala.Char], offset: Int, len: Int): StringBuilder = {
    var i = 0
    while (i < len) {
      content += str(i + offset)
      i += 1
    }
    this
  }

  def append(b: scala.Byte): StringBuilder = append(b.toString())
  def append(s: scala.Short): StringBuilder = append(s.toString())
  def append(i: scala.Int): StringBuilder = append(i.toString())
  def append(lng: scala.Long): StringBuilder = append(lng.toString())
  def append(f: scala.Float): StringBuilder = append(f.toString())
  def append(d: scala.Double): StringBuilder = append(d.toString())

  def append(obj: AnyRef): StringBuilder = {
    if (obj == null) append(null: String)
    else             append(obj.toString())
  }

  def append(csq: CharSequence): StringBuilder = append(csq: AnyRef)
  def append(csq: CharSequence, start: Int, end: Int): StringBuilder = {
    if (csq == null) append("null", start, end)
    else append(csq.subSequence(start, end).toString())
  }

  override def toString() = content

  def length() = content.length()

  def charAt(index: Int) = content.charAt(index)
  def codePointAt(index: Int) = content.codePointAt(index)

  def indexOf(str: String) = content.indexOf(str)
  def indexOf(str: String, fromIndex: Int) = content.indexOf(str, fromIndex)

  def lastIndexOf(str: String) = content.lastIndexOf(str)
  def lastIndexOf(str: String, fromIndex: Int) = content.lastIndexOf(str, fromIndex)

  def subSequence(start: Int, end: Int): CharSequence = substring(start, end)
  def substring(start: Int): String = content.substring(start)
  def substring(start: Int, end: Int): String = content.substring(start, end)

  def reverse(): StringBuilder = {
    val original = content
    var result = ""
    var i = 0
    while (i < original.length) {
      val c = original.charAt(i)
      if (Character.isHighSurrogate(c) && (i+1 < original.length)) {
        val c2 = original.charAt(i+1)
        if (Character.isLowSurrogate(c2)) {
          result = c.toString + c2.toString + result
          i += 2
        } else {
          result = c.toString + result
          i += 1
        }
      } else {
        result = c.toString + result
        i += 1
      }
    }
    content = result
    this
  }

  def deleteCharAt(index: Int): StringBuilder = {
    if (index < 0 || index >= content.length)
      throw new StringIndexOutOfBoundsException("String index out of range: " + index)
    content = content.substring(0, index) + content.substring(index+1)
    this
  }

  /**
   * @param start The beginning index, inclusive.
   * @param end The ending index, exclusive.
   * @param str String that will replace previous contents.
   * @return This StringBuilder.
   */
  def replace(start: Int, end: Int, str: String): StringBuilder = {
    val length = content.length
    if (start < 0 || start > end || start >= length)
      throw new StringIndexOutOfBoundsException(s"Illegal to replace substring at [$start - $end] in string of length $length")
    val realEnd = if (end > length) length else end // java api convention
    content = content.substring(0, start) + str + content.substring(realEnd)
    this
  }

  def setCharAt(index: Int, ch: scala.Char): Unit = {
    if (index < 0 || index >= content.length)
      throw new IndexOutOfBoundsException("String index out of range: " + index)
    content = content.substring(0, index) + ch + content.substring(index + 1)
  }

  def setLength(newLength: Int): Unit = {
    if (newLength < 0)
      throw new IndexOutOfBoundsException("String index out of range: " + newLength)

    val len = length()
    if (len == newLength) {
    } else if (len < newLength) {
      var index = len
      while (index < newLength) {
        append("\u0000")
        index += 1
      }
    } else {
      content = substring(0, newLength)
    }
  }

  def insert(index: Int, b: scala.Boolean): StringBuilder       = insert(index, b.toString)
  def insert(index: Int, b: scala.Byte): StringBuilder          = insert(index, b.toString)
  def insert(index: Int, s: scala.Short): StringBuilder         = insert(index, s.toString)
  def insert(index: Int, i: scala.Int): StringBuilder           = insert(index, i.toString)
  def insert(index: Int, l: scala.Long): StringBuilder          = insert(index, l.toString)
  def insert(index: Int, f: scala.Float): StringBuilder         = insert(index, f.toString)
  def insert(index: Int, d: scala.Double): StringBuilder        = insert(index, d.toString)
  def insert(index: Int, c: scala.Char): StringBuilder          = insert(index, c.toString)
  def insert(index: Int, csq: CharSequence): StringBuilder      = insert(index: Int, csq: AnyRef)
  def insert(index: Int, arr: Array[scala.Char]): StringBuilder = insert(index, arr, 0, arr.length)

  def insert(index: Int, ref: AnyRef): StringBuilder =
    if (ref == null)
      insert(index, null: String)
    else
      insert(index, ref.toString)

  def insert(index: Int, csq: CharSequence, start: Int, end: Int): StringBuilder =
    if (csq == null)
      insert(index, "null", start, end)
    else
      insert(index, csq.subSequence(start, end).toString)


  def insert(index: Int, arr: Array[scala.Char], offset: Int, len: Int): StringBuilder = {
    var str = ""
    var i = 0
    while (i < len) {
      str += arr(i + offset)
      i += 1
    }
    insert(index, str)
  }

  def insert(index: Int, str: String): StringBuilder = {
    val thisLength = length()
    if (index < 0 || index > thisLength)
      throw new StringIndexOutOfBoundsException(index)
    else if (index == thisLength)
      append(str)
    else
      content = content.substring(0, index) + Option(str).getOrElse("null") + content.substring(index)
    this
  }
}