diff options
author | Eugene Vigdorchik <eugenevigdorchik@epfl.ch> | 2010-09-21 13:20:54 +0000 |
---|---|---|
committer | Eugene Vigdorchik <eugenevigdorchik@epfl.ch> | 2010-09-21 13:20:54 +0000 |
commit | 567968ab8e93e8afcfbb7a7f5a709b80d8ca0827 (patch) | |
tree | ab1c53c7f622d0253ed4b835cc9b53f92c55e556 /src/compiler | |
parent | 6b957d04557b6c72dd77676e246f4541442f182d (diff) | |
download | scala-567968ab8e93e8afcfbb7a7f5a709b80d8ca0827.tar.gz scala-567968ab8e93e8afcfbb7a7f5a709b80d8ca0827.tar.bz2 scala-567968ab8e93e8afcfbb7a7f5a709b80d8ca0827.zip |
Scala IDE needs mutable files with changing con...
Scala IDE needs mutable files with changing content. review by odersky
Diffstat (limited to 'src/compiler')
4 files changed, 40 insertions, 27 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index 307745f8e5..4ac6aea923 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -9,7 +9,7 @@ package scala.tools.nsc package ast.parser import scala.collection.mutable.ListBuffer -import util.{ OffsetPosition, BatchSourceFile } +import util.{ OffsetPosition } import symtab.Flags import Tokens._ @@ -91,7 +91,7 @@ self => val syntaxErrors = new ListBuffer[(Int, String)] def incompleteInputError(msg: String) { - val offset = unit.source.asInstanceOf[BatchSourceFile].content.length - 1 + val offset = unit.source.content.length - 1 if (smartParsing) syntaxErrors += ((offset, msg)) else unit.incompleteInputError(o2p(offset), msg) } diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala index 445d869681..f798d3979b 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala @@ -1015,7 +1015,7 @@ trait Scanners { */ class UnitScanner(unit: CompilationUnit, patches: List[BracePatch]) extends Scanner { def this(unit: CompilationUnit) = this(unit, List()) - val buf = unit.source.asInstanceOf[BatchSourceFile].content + val buf = unit.source.content override val decodeUni: Boolean = !settings.nouescape.value def warning(off: Offset, msg: String) = unit.warning(unit.position(off), msg) diff --git a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala index 21394595a6..948cbfd9f9 100644 --- a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala +++ b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala @@ -951,7 +951,7 @@ trait JavaScanners { /** ... */ class JavaUnitScanner(unit: CompilationUnit) extends JavaScanner { - in = new JavaCharArrayReader(unit.source.asInstanceOf[BatchSourceFile].content, !settings.nouescape.value, syntaxError) + in = new JavaCharArrayReader(unit.source.content, !settings.nouescape.value, syntaxError) init def warning(pos: Int, msg: String) = unit.warning(pos, msg) def error (pos: Int, msg: String) = unit. error(pos, msg) diff --git a/src/compiler/scala/tools/nsc/util/SourceFile.scala b/src/compiler/scala/tools/nsc/util/SourceFile.scala index 8c1d308209..d925e2ceba 100644 --- a/src/compiler/scala/tools/nsc/util/SourceFile.scala +++ b/src/compiler/scala/tools/nsc/util/SourceFile.scala @@ -85,29 +85,9 @@ class ScriptSourceFile(underlying: BatchSourceFile, content: Array[Char], overri else new OffsetPosition(underlying, pos.point + start) } -/** a file whose contents do not change over time */ -class BatchSourceFile(val file : AbstractFile, val content: Array[Char]) extends SourceFile { - - def this(_file: AbstractFile) = this(_file, _file.toCharArray) - def this(sourceName: String, cs: Seq[Char]) = this(new VirtualFile(sourceName), cs.toArray) - def this(file: AbstractFile, cs: Seq[Char]) = this(file, cs.toArray) - - override def equals(that : Any) = that match { - case that : BatchSourceFile => file.path == that.file.path && start == that.start - case _ => false - } - override def hashCode = file.path.## + start.## - val length = content.length - def start = 0 - def isSelfContained = true - - override def identifier(pos: Position, compiler: Global) = - if (pos.isDefined && pos.source == this && pos.point != -1) { - def isOK(c: Char) = isIdentifierPart(c) || isOperatorPart(c) - Some(new String(content drop pos.point takeWhile isOK)) - } else { - super.identifier(pos, compiler) - } +trait LineOffsetMapper { + def content : Array[Char] + def length : Int def isLineBreak(idx: Int) = if (idx >= length) false else { @@ -143,3 +123,36 @@ class BatchSourceFile(val file : AbstractFile, val content: Array[Char]) extends lastLine } } + +/** a file whose contents do not change over time */ +class BatchSourceFile(val file : AbstractFile, val content: Array[Char]) extends SourceFile with LineOffsetMapper { + + def this(_file: AbstractFile) = this(_file, _file.toCharArray) + def this(sourceName: String, cs: Seq[Char]) = this(new VirtualFile(sourceName), cs.toArray) + def this(file: AbstractFile, cs: Seq[Char]) = this(file, cs.toArray) + + override def equals(that : Any) = that match { + case that : BatchSourceFile => file.path == that.file.path && start == that.start + case _ => false + } + override def hashCode = file.path.## + start.## + val length = content.length + def start = 0 + def isSelfContained = true +} + +/** a file whose contents do change over time */ +class MutableSourceFile(val file : AbstractFile, var content: Array[Char]) extends SourceFile with LineOffsetMapper { + def this(_file: AbstractFile) = this(_file, _file.toCharArray) + def this(sourceName: String, cs: Seq[Char]) = this(new VirtualFile(sourceName), cs.toArray) + def this(file: AbstractFile, cs: Seq[Char]) = this(file, cs.toArray) + + override def equals(that : Any) = that match { + case that : MutableSourceFile => file.path == that.file.path && start == that.start + case _ => false + } + override def hashCode = file.path.## + start.## + def length = content.length + def start = 0 + def isSelfContained = true +} |