summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Vigdorchik <eugenevigdorchik@epfl.ch>2010-09-21 13:20:54 +0000
committerEugene Vigdorchik <eugenevigdorchik@epfl.ch>2010-09-21 13:20:54 +0000
commit567968ab8e93e8afcfbb7a7f5a709b80d8ca0827 (patch)
treeab1c53c7f622d0253ed4b835cc9b53f92c55e556
parent6b957d04557b6c72dd77676e246f4541442f182d (diff)
downloadscala-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
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala4
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Scanners.scala2
-rw-r--r--src/compiler/scala/tools/nsc/javac/JavaScanners.scala2
-rw-r--r--src/compiler/scala/tools/nsc/util/SourceFile.scala59
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
+}