scala.tools.nsc.scratchpad.Mixer.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scala-compiler Show documentation
Show all versions of scala-compiler Show documentation
Compiler for the Scala Programming Language
package scala.tools.nsc.scratchpad
import java.io.{FileInputStream, InputStreamReader, IOException}
import scala.runtime.ScalaRunTime.stringOf
import java.lang.reflect.InvocationTargetException
import scala.reflect.runtime.ReflectionUtils._
import scala.collection.mutable.ArrayBuffer
@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
class Mixer {
protected val stdSeparator = "//> "
protected val ctdSeparator = "//| "
protected val sepColumn = 50
protected val tabInc = 8
type Comments = Seq[(Int, Array[Char])]
def parseComments(comments: Array[Char]): Iterator[(Int, Array[Char])] = new Iterator[(Int, Array[Char])] {
var idx = 0
def hasNext = idx < comments.length
def next() = {
val nextSpace = comments indexOf (' ', idx)
var nextNL = comments indexOf ('\n', nextSpace + 1)
if (nextNL < 0) nextNL = comments.length
val result =
(new String(comments.slice(idx, nextSpace)).toInt, comments.slice(nextSpace + 1, nextNL))
idx = nextNL + 1
result
}
}
def mix(source: Array[Char], comments: Array[Char]): Array[Char] = {
val mixed = new ArrayBuffer[Char]
var written = 0
def align() = {
var idx = mixed.lastIndexOf('\n') + 1
var col = 0
while (idx < mixed.length) {
col =
if (mixed(idx) == '\t') (col / tabInc) * tabInc + tabInc
else col + 1
idx += 1
}
if (col > sepColumn) {
mixed += '\n'
col = 0
}
while (col < sepColumn) {
mixed += ' '
col += 1
}
}
for ((offset, cs) <- parseComments(comments)) {
val sep =
if (written < offset) {
for (i <- written until offset) mixed += source(i)
written = offset
stdSeparator
} else {
mixed += '\n'
ctdSeparator
}
align()
mixed ++= sep ++= cs
}
mixed ++= source.view(written, source.length)
mixed.toArray
}
}
object Mixer extends Mixer {
def contents(name: String): Array[Char] = {
val page = new Array[Char](2 << 14)
val buf = new ArrayBuffer[Char]
val in = new FileInputStream(name)
val rdr = new InputStreamReader(in)
var nread = 0
do {
nread = rdr.read(page, 0, page.length)
buf ++= (if (nread == page.length) page else page.take(nread))
} while (nread >= 0)
buf.toArray
}
def main(args: Array[String]) {
val mixer = new Mixer
try {
require(args.length == 2, "required arguments: file1 file2")
val source = contents(args(0))
val comments = contents(args(1))
val mixed = mixer.mix(source, comments)
println(mixed.mkString)
} catch {
case ex: IOException =>
println("error: "+ ex.getMessage)
}
}
}