summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scala/tools/nsc/CompilationUnits.scala2
-rwxr-xr-xsources/scala/tools/nsc/Global.scala9
-rw-r--r--sources/scala/tools/nsc/Interpreter.scala4
-rwxr-xr-xsources/scala/tools/nsc/Main.scala3
-rw-r--r--sources/scala/tools/nsc/ant/NSC.scala5
-rwxr-xr-xsources/scala/tools/nsc/ast/TreeGen.scala2
-rw-r--r--sources/scala/tools/nsc/ast/Trees.scala2
-rw-r--r--sources/scala/tools/nsc/ast/parser/MarkupParsers.scala2
-rwxr-xr-xsources/scala/tools/nsc/ast/parser/Parsers.scala2
-rwxr-xr-xsources/scala/tools/nsc/ast/parser/Scanners.scala10
-rw-r--r--sources/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala2
-rw-r--r--sources/scala/tools/nsc/backend/icode/BasicBlocks.scala2
-rw-r--r--sources/scala/tools/nsc/backend/icode/Opcodes.scala2
-rw-r--r--sources/scala/tools/nsc/backend/icode/Printers.scala2
-rw-r--r--sources/scala/tools/nsc/backend/jvm/GenJVM.scala2
-rw-r--r--sources/scala/tools/nsc/matching/Autom2.scala2
-rw-r--r--sources/scala/tools/nsc/matching/CodeFactory.scala2
-rw-r--r--sources/scala/tools/nsc/matching/LeftTracers.scala2
-rw-r--r--sources/scala/tools/nsc/matching/PatternMatchers.scala4
-rw-r--r--sources/scala/tools/nsc/matching/PatternNodeCreator.scala2
-rw-r--r--sources/scala/tools/nsc/matching/PatternNodes.scala2
-rw-r--r--sources/scala/tools/nsc/matching/RightTracers.scala2
-rw-r--r--sources/scala/tools/nsc/matching/WordAutoms.scala2
-rw-r--r--sources/scala/tools/nsc/reporters/AbstractReporter.scala56
-rw-r--r--sources/scala/tools/nsc/reporters/ConsoleReporter.scala135
-rw-r--r--sources/scala/tools/nsc/reporters/Reporter.scala38
-rw-r--r--sources/scala/tools/nsc/reporters/ReporterTimer.scala27
-rwxr-xr-xsources/scala/tools/nsc/symtab/Definitions.scala2
-rwxr-xr-xsources/scala/tools/nsc/symtab/SymbolLoaders.scala3
-rwxr-xr-xsources/scala/tools/nsc/symtab/Symbols.scala3
-rwxr-xr-xsources/scala/tools/nsc/symtab/Types.scala2
-rwxr-xr-xsources/scala/tools/nsc/symtab/classfile/ClassfileParser.scala5
-rwxr-xr-xsources/scala/tools/nsc/symtab/classfile/MetaParser.scala2
-rwxr-xr-xsources/scala/tools/nsc/symtab/classfile/SymblfileParser.scala3
-rwxr-xr-xsources/scala/tools/nsc/symtab/classfile/UnPickler.scala3
-rwxr-xr-xsources/scala/tools/nsc/transform/Erasure.scala2
-rwxr-xr-xsources/scala/tools/nsc/transform/Mixin.scala2
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Contexts.scala2
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Namers.scala2
-rw-r--r--sources/scala/tools/nsc/typechecker/TreeCheckers.scala4
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Typers.scala2
-rw-r--r--sources/scala/tools/nsc/util/CharArrayReader.scala7
-rwxr-xr-xsources/scala/tools/nsc/util/Position.scala68
-rw-r--r--sources/scala/tools/nsc/util/SourceFile.scala117
44 files changed, 504 insertions, 50 deletions
diff --git a/sources/scala/tools/nsc/CompilationUnits.scala b/sources/scala/tools/nsc/CompilationUnits.scala
index f211bab1c1..e0793a6d9c 100644
--- a/sources/scala/tools/nsc/CompilationUnits.scala
+++ b/sources/scala/tools/nsc/CompilationUnits.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc;
-import scala.tools.util.{SourceFile, Position};
+import scala.tools.nsc.util.{SourceFile, Position};
import scala.tools.nsc.util.FreshNameCreator;
[_trait_] abstract class CompilationUnits: Global {
diff --git a/sources/scala/tools/nsc/Global.scala b/sources/scala/tools/nsc/Global.scala
index b24d784d63..702a194ae0 100755
--- a/sources/scala/tools/nsc/Global.scala
+++ b/sources/scala/tools/nsc/Global.scala
@@ -7,7 +7,10 @@ package scala.tools.nsc;
import java.io._;
import java.nio.charset._;
-import scala.tools.util._;
+import scala.tools.util.{SourceReader,ClassPath,AbstractFile};
+import scala.tools.nsc.util.{Position,SourceFile};
+import scala.tools.nsc.reporters._;
+
import scala.collection.mutable.{HashSet,HashMap}
import symtab._;
@@ -263,10 +266,10 @@ class Global(val settings: Settings, val reporter: Reporter) extends SymbolTable
lambdaLift,
flatten,
constructors,
- mixin,
+ mixin /*,
genicode,
genJVM,
- sampleTransform);
+ sampleTransform */);
private var curRun: Run = NoRun;
override def currentRun: Run = curRun;
diff --git a/sources/scala/tools/nsc/Interpreter.scala b/sources/scala/tools/nsc/Interpreter.scala
index a2dfe17b25..847cdade6a 100644
--- a/sources/scala/tools/nsc/Interpreter.scala
+++ b/sources/scala/tools/nsc/Interpreter.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc;
-import scala.tools.util.Reporter;
+import scala.tools.nsc.reporters.Reporter;
abstract class Interpreter {
import scala.collection.mutable.ListBuffer;
@@ -22,7 +22,7 @@ abstract class Interpreter {
}
def interpret(line: String, reporter: Reporter): unit = {
- import scala.tools.util.SourceFile;
+ import scala.tools.nsc.util.SourceFile;
// convert input to a compilation unit, using SourceFile;
// and parse it, using syntaxAnalyzer, to get input ASTs
diff --git a/sources/scala/tools/nsc/Main.scala b/sources/scala/tools/nsc/Main.scala
index 76f43dea27..395b489046 100755
--- a/sources/scala/tools/nsc/Main.scala
+++ b/sources/scala/tools/nsc/Main.scala
@@ -6,7 +6,8 @@
package scala.tools.nsc;
import java.io._;
-import scala.tools.util.{Position, Reporter, ConsoleReporter}
+import scala.tools.nsc.util.{Position};
+import scala.tools.nsc.reporters.{Reporter, ConsoleReporter};
/** The main class for NSC, a compiler for the programming
* language Scala.
diff --git a/sources/scala/tools/nsc/ant/NSC.scala b/sources/scala/tools/nsc/ant/NSC.scala
index 16bb5203d8..1125bb500c 100644
--- a/sources/scala/tools/nsc/ant/NSC.scala
+++ b/sources/scala/tools/nsc/ant/NSC.scala
@@ -24,8 +24,8 @@ import org.apache.tools.ant.util.SourceFileScanner;
import org.apache.tools.ant.types.Reference;
import org.apache.tools.ant.types.EnumeratedAttribute;
-import scala.tools.util.ConsoleReporter;
-import scala.tools.util.Reporter;
+import scala.tools.nsc.reporters.{Reporter,ConsoleReporter};
+
package scala.tools.nsc.ant {
@@ -607,6 +607,7 @@ package scala.tools.nsc.ant {
}
catch {
case exception @ FatalError(msg) => {
+ exception.printStackTrace();
if (settings.debug.value) exception.printStackTrace();
error("Compile failed because of an internal compiler error ("
+ msg + "); see the error output for details.");
diff --git a/sources/scala/tools/nsc/ast/TreeGen.scala b/sources/scala/tools/nsc/ast/TreeGen.scala
index d5f465dcf3..8d2f30bd4d 100755
--- a/sources/scala/tools/nsc/ast/TreeGen.scala
+++ b/sources/scala/tools/nsc/ast/TreeGen.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.ast;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import symtab.Flags._;
abstract class TreeGen {
diff --git a/sources/scala/tools/nsc/ast/Trees.scala b/sources/scala/tools/nsc/ast/Trees.scala
index 05cd95a144..1736d9d446 100644
--- a/sources/scala/tools/nsc/ast/Trees.scala
+++ b/sources/scala/tools/nsc/ast/Trees.scala
@@ -7,7 +7,7 @@ package scala.tools.nsc.ast;
import java.io.StringWriter;
import java.io.PrintWriter;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import symtab.Flags._;
[_trait_] abstract class Trees: Global {
diff --git a/sources/scala/tools/nsc/ast/parser/MarkupParsers.scala b/sources/scala/tools/nsc/ast/parser/MarkupParsers.scala
index fe43e39398..be25e8eefe 100644
--- a/sources/scala/tools/nsc/ast/parser/MarkupParsers.scala
+++ b/sources/scala/tools/nsc/ast/parser/MarkupParsers.scala
@@ -16,7 +16,7 @@ import scala.Iterator;
import scala.collection.immutable.ListMap ;
import scala.collection.mutable;
//import scala.tools.scalac.util.NewArray;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import scala.xml.{Text,TextBuffer};
diff --git a/sources/scala/tools/nsc/ast/parser/Parsers.scala b/sources/scala/tools/nsc/ast/parser/Parsers.scala
index a4fbaf995b..08eac39340 100755
--- a/sources/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/sources/scala/tools/nsc/ast/parser/Parsers.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.ast.parser;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import util.ListBuffer;
import symtab.Flags;
import Tokens._;
diff --git a/sources/scala/tools/nsc/ast/parser/Scanners.scala b/sources/scala/tools/nsc/ast/parser/Scanners.scala
index e90f0b8817..bef2fc8716 100755
--- a/sources/scala/tools/nsc/ast/parser/Scanners.scala
+++ b/sources/scala/tools/nsc/ast/parser/Scanners.scala
@@ -6,7 +6,7 @@
package scala.tools.nsc.ast.parser;
import Tokens._;
-import scala.tools.util.{Position, SourceFile}
+import scala.tools.nsc.util.{Position, SourceFile}
import SourceFile.{LF, FF, CR, SU}
import scala.tools.nsc.util.CharArrayReader;
@@ -105,7 +105,7 @@ import scala.tools.nsc.util.CharArrayReader;
LARROW | SUBTYPE | VIEWBOUND | SUPERTYPE | HASH | AT |
RPAREN | RBRACKET | RBRACE =>
case _ =>
- if (token == EOF || Position.line(pos) > Position.line(prevpos)) {
+ if (token == EOF || ((new Position(unit.source, prevpos)).line < (new Position(unit.source, pos)).line)) {
next.copyFrom(this);
this.token = SEMI;
this.pos = prevpos;
@@ -145,14 +145,14 @@ import scala.tools.nsc.util.CharArrayReader;
*/
private def fetchToken(): unit = {
if (token == EOF) return;
- lastpos = Position.encode(in.cline, in.ccol);
+ lastpos = in.cpos; // Position.encode(in.cline, in.ccol);
//var index = bp;
while (true) {
in.ch match {
case ' ' | '\t' | CR | LF | FF =>
in.next;
case _ =>
- pos = Position.encode(in.cline, in.ccol);
+ pos = in.cpos; // Position.encode(in.cline, in.ccol);
in.ch match {
case '\u21D2' =>
in.next; token = ARROW;
@@ -512,7 +512,7 @@ import scala.tools.nsc.util.CharArrayReader;
case '\'' => putChar('\'')
case '\\' => putChar('\\')
case _ =>
- syntaxError(Position.encode(in.cline, in.ccol - 1),
+ syntaxError(in.cpos - 1, // Position.encode(in.cline, in.ccol - 1),
"invalid escape character");
putChar(in.ch);
}
diff --git a/sources/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala b/sources/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
index afe1f3996e..dce7f1603c 100644
--- a/sources/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
+++ b/sources/scala/tools/nsc/ast/parser/SymbolicXMLBuilder.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.ast.parser;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import scala.Iterator;
import scala.collection.immutable.{ Map, ListMap };
import scala.collection.mutable;
diff --git a/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala b/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala
index a77d195ca0..abee64d851 100644
--- a/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala
+++ b/sources/scala/tools/nsc/backend/icode/BasicBlocks.scala
@@ -9,7 +9,7 @@ package scala.tools.nsc.backend.icode;
import scala.tools.nsc.ast._;
import scala.collection.mutable.Map;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
trait BasicBlocks: ICodes {
import opcodes._;
diff --git a/sources/scala/tools/nsc/backend/icode/Opcodes.scala b/sources/scala/tools/nsc/backend/icode/Opcodes.scala
index 3f2fb45b17..b9f462a49d 100644
--- a/sources/scala/tools/nsc/backend/icode/Opcodes.scala
+++ b/sources/scala/tools/nsc/backend/icode/Opcodes.scala
@@ -9,7 +9,7 @@
package scala.tools.nsc.backend.icode;
import scala.tools.nsc.ast._;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
/*
A pattern match
diff --git a/sources/scala/tools/nsc/backend/icode/Printers.scala b/sources/scala/tools/nsc/backend/icode/Printers.scala
index 2ec3e00fd8..13afc83da8 100644
--- a/sources/scala/tools/nsc/backend/icode/Printers.scala
+++ b/sources/scala/tools/nsc/backend/icode/Printers.scala
@@ -9,7 +9,7 @@ package scala.tools.nsc.backend.icode;
import java.io.PrintWriter;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import scala.tools.nsc.symtab.Flags;
abstract class Printers {
diff --git a/sources/scala/tools/nsc/backend/jvm/GenJVM.scala b/sources/scala/tools/nsc/backend/jvm/GenJVM.scala
index f84b77ae61..7cd3b875bf 100644
--- a/sources/scala/tools/nsc/backend/jvm/GenJVM.scala
+++ b/sources/scala/tools/nsc/backend/jvm/GenJVM.scala
@@ -11,7 +11,7 @@ import java.io.File;
import scala.collection.mutable.{Map, HashMap};
import scala.tools.nsc.symtab._;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import ch.epfl.lamp.fjbg._;
diff --git a/sources/scala/tools/nsc/matching/Autom2.scala b/sources/scala/tools/nsc/matching/Autom2.scala
index a280dabe1f..b99db700b4 100644
--- a/sources/scala/tools/nsc/matching/Autom2.scala
+++ b/sources/scala/tools/nsc/matching/Autom2.scala
@@ -2,7 +2,7 @@ package scala.tools.nsc.matching ;
//import java.util._ ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
trait Autom2: TransMatcher {
diff --git a/sources/scala/tools/nsc/matching/CodeFactory.scala b/sources/scala/tools/nsc/matching/CodeFactory.scala
index 387aa6fd14..dbdd99ac09 100644
--- a/sources/scala/tools/nsc/matching/CodeFactory.scala
+++ b/sources/scala/tools/nsc/matching/CodeFactory.scala
@@ -3,7 +3,7 @@
*/
package scala.tools.nsc.matching ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
[_trait_] abstract class CodeFactory: TransMatcher {
diff --git a/sources/scala/tools/nsc/matching/LeftTracers.scala b/sources/scala/tools/nsc/matching/LeftTracers.scala
index 4ab525f70f..b58e11b4cb 100644
--- a/sources/scala/tools/nsc/matching/LeftTracers.scala
+++ b/sources/scala/tools/nsc/matching/LeftTracers.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.matching;
import java.util._ ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
trait LeftTracers: TransMatcher {
diff --git a/sources/scala/tools/nsc/matching/PatternMatchers.scala b/sources/scala/tools/nsc/matching/PatternMatchers.scala
index 30ac08a966..f5732e9f92 100644
--- a/sources/scala/tools/nsc/matching/PatternMatchers.scala
+++ b/sources/scala/tools/nsc/matching/PatternMatchers.scala
@@ -6,7 +6,7 @@
package scala.tools.nsc.matching ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
trait PatternMatchers: (TransMatcher with PatternNodes) extends AnyRef with PatternNodeCreator {
@@ -68,7 +68,7 @@ trait PatternMatchers: (TransMatcher with PatternNodes) extends AnyRef with Patt
this.root.and = pHeader(selector.pos,
selector.tpe.widen,
Ident(root.symbol).setType(root.tpe));
- this.resultVar = owner.newVariable(Flags.MUTABLE,
+ this.resultVar = owner.newVariable(Position.NOPOS, // Flags.MUTABLE,
//"result").setType( resultType );
"result").setInfo( resultType );
//Console.println("resultType = "+resultType);
diff --git a/sources/scala/tools/nsc/matching/PatternNodeCreator.scala b/sources/scala/tools/nsc/matching/PatternNodeCreator.scala
index a955cacf3a..79ba780469 100644
--- a/sources/scala/tools/nsc/matching/PatternNodeCreator.scala
+++ b/sources/scala/tools/nsc/matching/PatternNodeCreator.scala
@@ -1,6 +1,6 @@
package scala.tools.nsc.matching;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
/** PatternNode factory.
* we inherit the globals from PatternTool.
diff --git a/sources/scala/tools/nsc/matching/PatternNodes.scala b/sources/scala/tools/nsc/matching/PatternNodes.scala
index 382760eb38..612826e115 100644
--- a/sources/scala/tools/nsc/matching/PatternNodes.scala
+++ b/sources/scala/tools/nsc/matching/PatternNodes.scala
@@ -8,7 +8,7 @@
package scala.tools.nsc.matching ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
trait PatternNodes: TransMatcher {
diff --git a/sources/scala/tools/nsc/matching/RightTracers.scala b/sources/scala/tools/nsc/matching/RightTracers.scala
index a916d07929..81dd8d6ac3 100644
--- a/sources/scala/tools/nsc/matching/RightTracers.scala
+++ b/sources/scala/tools/nsc/matching/RightTracers.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.matching;
import java.util._ ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import scala.tools.nsc.symtab.Flags;
trait RightTracers: TransMatcher {
diff --git a/sources/scala/tools/nsc/matching/WordAutoms.scala b/sources/scala/tools/nsc/matching/WordAutoms.scala
index 1d02f0126e..de17fc6445 100644
--- a/sources/scala/tools/nsc/matching/WordAutoms.scala
+++ b/sources/scala/tools/nsc/matching/WordAutoms.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.matching;
import java.util._ ;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
trait WordAutoms: TransMatcher {
diff --git a/sources/scala/tools/nsc/reporters/AbstractReporter.scala b/sources/scala/tools/nsc/reporters/AbstractReporter.scala
new file mode 100644
index 0000000000..b85fde78ca
--- /dev/null
+++ b/sources/scala/tools/nsc/reporters/AbstractReporter.scala
@@ -0,0 +1,56 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
+** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
+** /_____/\____/\___/\____/____/ **
+\* */
+
+// $Id$
+
+package scala.tools.nsc.reporters;
+import java.util.HashSet;
+import scala.tools.nsc.util.Position;
+
+/**
+ * This abstract class implements most aspects of a Reporter, only how
+ * things are displayed has to be implemented in subclasses.
+ */
+abstract class AbstractReporter extends Reporter {
+ private val positions = new HashSet();
+
+ def displayInfo (pos : Position, msg : String) : Unit;
+ def displayWarning(pos : Position, msg : String) : Unit;
+ def displayError (pos : Position, msg : String) : Unit;
+ def displayPrompt : Unit;
+
+ // XXX: while is pos ignored?
+ def info(pos : Position, msg : String, force : Boolean) : Unit =
+ if (force || verbose) displayInfo(pos, msg);
+
+ def warning(pos : Position, msg : String) : Unit = {
+ val hidden = testAndLog(pos);
+ if (nowarn) return;
+ if (!hidden || prompt) displayWarning(pos, msg);
+ if (!hidden) warningsx = warningsx + 1;
+ if (prompt) displayPrompt;
+ }
+ def error(pos : Position, msg : String) : Unit = {
+ val hidden = testAndLog(pos);
+ if (!hidden || prompt) displayError(pos, msg);
+ if (!hidden) errorsx = errorsx + 1;
+ if (prompt) displayPrompt;
+ }
+
+ //########################################################################
+ // Private Methods
+
+ /** Logs a position and returns true if it was already logged. */
+ private def testAndLog(pos : Position) : Boolean = {
+ if (pos == null) return false;
+ if (pos.column == 0) return false;
+ if (positions.contains(pos)) return true;
+ positions.add(pos);
+ return false;
+ }
+
+ //########################################################################
+}
diff --git a/sources/scala/tools/nsc/reporters/ConsoleReporter.scala b/sources/scala/tools/nsc/reporters/ConsoleReporter.scala
new file mode 100644
index 0000000000..8582c868bf
--- /dev/null
+++ b/sources/scala/tools/nsc/reporters/ConsoleReporter.scala
@@ -0,0 +1,135 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
+** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
+** /_____/\____/\___/\____/____/ **
+\* */
+
+// $Id$
+
+package scala.tools.nsc.reporters;
+import scala.tools.nsc.util.Position;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * This class implements a Reporter that displays messages on a text
+ * console.
+ */
+class ConsoleReporter(_reader : BufferedReader, _writer : PrintWriter) extends AbstractReporter {
+
+ //########################################################################
+ // Private Fields
+
+ /** The reader to ask for failures on demand */
+ private val reader = _reader;
+ /** The writer to print messages */
+ private val writer = _writer;
+
+
+ //########################################################################
+ // Public Fields
+
+ /** Whether a short file name should be displayed before errors */
+ var shortname : Boolean = false;
+
+ //########################################################################
+ // Public Constructors
+ def this() = this(
+ new BufferedReader(new InputStreamReader(System.in)),
+ new PrintWriter(System.err, true));
+
+ //########################################################################
+ // Public Methods - Count
+
+ /** Returns the number of errors issued totally as a string */
+ def getErrorCountString = getCountString(errorsx, "error");
+
+ /** Returns the number of warnings issued totally as a string */
+ def getWarningCountString = getCountString(warningsx, "warning");
+
+ /** Returns a string meaning "n elements". */
+ def getCountString(n : Int, elements : String) : String =
+ n match {
+ case 0 => "no " + elements + "s";
+ case 1 => "one " + elements;
+ case 2 => "two " + elements + "s";
+ case 3 => "three " + elements + "s";
+ case 4 => "four " + elements + "s";
+ "" + n + " " + elements + "s";
+ }
+
+
+ //########################################################################
+ // Public Methods - Print
+
+ /** Prints the message. */
+ def printMessage(msg : String) = writer.println(msg);
+
+ /** Prints the message with the given position indication. */
+ def printMessage(pos : Position, msg : String) : Unit = {
+ if (pos != null) {
+ val buf = new StringBuffer(msg);
+ buf.insert(0, " ");
+ if (pos.line != Position.NOLINE)
+ buf.insert(0, ":" + pos.line);
+ val file = pos.source.file;
+ buf.insert(0, if (shortname) file.getName() else file.getPath());
+ printMessage(buf.toString());
+ printSourceLine(pos);
+ } else printMessage(msg);
+ }
+
+ def printWarning(pos : Position, msg : String) = printMessage(pos, "warning: " + msg);
+ def printError (pos : Position, msg : String) = printMessage(pos, "error: " + msg);
+
+ def printSourceLine(pos : Position) = if (pos != null && pos.offset != Position.NOPOS) {
+ printMessage(pos.lineContent);
+ printColumnMarker(pos);
+ }
+ /** Prints the column marker of the given position. */
+ def printColumnMarker(pos : Position) = if (pos != null) {
+ val buffer = new StringBuffer(pos.column);
+ var i = 1;
+ while (i < pos.column) {
+ buffer.append(' ');
+ i = i + 1;
+ }
+ if (pos.column > 0) buffer.append('^');
+ printMessage(buffer.toString());
+ }
+
+ /** Prints the number of errors and warnings if their are non-zero. */
+ def printSummary() = {
+ if (warningsx > 0) printMessage(getWarningCountString + " found");
+ if ( errorsx > 0) printMessage(getErrorCountString + " found");
+ }
+
+ //########################################################################
+ // Public Methods - Display
+ def displayInfo (pos : Position, msg : String) : Unit = printMessage(pos, msg);
+ def displayWarning(pos : Position, msg : String) : Unit = printWarning(pos, msg);
+ def displayError (pos : Position, msg : String) : Unit = printError (pos, msg);
+
+ def displayPrompt : Unit = try {
+ var continue = true;
+ while (continue) {
+ writer.print("r)esume, a)bort: ");
+ writer.flush();
+ var line = reader.readLine();
+ if (line != null) {
+ line = line.toLowerCase();
+ if ("abort".startsWith(line))
+ throw new Error("user abort");
+ if ("resume".startsWith(line)) continue = false;
+ }
+ }
+ } catch {
+ case ex: IOException => {
+ ex.printStackTrace();
+ throw new Error("input read error");
+ }
+ }
+}
diff --git a/sources/scala/tools/nsc/reporters/Reporter.scala b/sources/scala/tools/nsc/reporters/Reporter.scala
new file mode 100644
index 0000000000..3687ea3b66
--- /dev/null
+++ b/sources/scala/tools/nsc/reporters/Reporter.scala
@@ -0,0 +1,38 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
+** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
+** /_____/\____/\___/\____/____/ **
+\* */
+
+// $Id$
+
+package scala.tools.nsc.reporters;
+import scala.tools.nsc.util.Position;
+
+
+/**
+ * This interface provides methods to issue information, warning and
+ * error messages.
+ */
+abstract class Reporter {
+ var verbose : Boolean = false;
+ var nowarn : Boolean = false;
+ var prompt : Boolean = false;
+
+ def prompt(v : Boolean) : Unit = this.prompt = v;
+
+ def warnings() = warningsx;
+ def errors() = errorsx;
+
+ protected var warningsx : Int = 0;
+ protected var errorsx : Int = 0;
+ def resetCounters() : Unit = {
+ warningsx = 0;
+ errorsx = 0;
+ }
+
+ def info(pos : Position, msg : String, force : Boolean) : Unit;
+ def warning(pos : Position, msg : String ) : Unit;
+ def error(pos : Position, msg : String ) : Unit;
+
+}
diff --git a/sources/scala/tools/nsc/reporters/ReporterTimer.scala b/sources/scala/tools/nsc/reporters/ReporterTimer.scala
new file mode 100644
index 0000000000..5c0cfd4092
--- /dev/null
+++ b/sources/scala/tools/nsc/reporters/ReporterTimer.scala
@@ -0,0 +1,27 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
+** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
+** /_____/\____/\___/\____/____/ **
+\* */
+
+// $Id$
+
+package scala.tools.nsc.reporters;
+import scala.tools.util.AbstractTimer;
+
+/**
+ * This class implements a timer that uses a Reporter to issue
+ * timings.
+ */
+class ReporterTimer(_reporter : Reporter) extends AbstractTimer {
+ //########################################################################
+ // Private Fields
+ private val reporter = _reporter;
+ //########################################################################
+ // Public Methods
+
+ def issue(msg : String, duration : Long) =
+ reporter.info(null, "[" + msg + " in " + duration + "ms]", false);
+
+ //########################################################################
+}
diff --git a/sources/scala/tools/nsc/symtab/Definitions.scala b/sources/scala/tools/nsc/symtab/Definitions.scala
index 6e6cf21cb1..b2485a9d53 100755
--- a/sources/scala/tools/nsc/symtab/Definitions.scala
+++ b/sources/scala/tools/nsc/symtab/Definitions.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.symtab;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import collection.mutable.HashMap;
import Flags._;
diff --git a/sources/scala/tools/nsc/symtab/SymbolLoaders.scala b/sources/scala/tools/nsc/symtab/SymbolLoaders.scala
index 91914cf73e..045c311d58 100755
--- a/sources/scala/tools/nsc/symtab/SymbolLoaders.scala
+++ b/sources/scala/tools/nsc/symtab/SymbolLoaders.scala
@@ -6,7 +6,8 @@
package scala.tools.nsc.symtab;
import java.io.IOException;
-import scala.tools.util.{AbstractFile, Position}
+import scala.tools.nsc.util.Position;
+import scala.tools.util.{AbstractFile};
import scala.tools.nsc.util.NameTransformer;
import scala.collection.mutable.HashMap;
import classfile.{ClassfileParser, SymblfileParser};
diff --git a/sources/scala/tools/nsc/symtab/Symbols.scala b/sources/scala/tools/nsc/symtab/Symbols.scala
index 1400a3a79b..41c7cd12e8 100755
--- a/sources/scala/tools/nsc/symtab/Symbols.scala
+++ b/sources/scala/tools/nsc/symtab/Symbols.scala
@@ -5,7 +5,8 @@
// $Id$
package scala.tools.nsc.symtab;
-import scala.tools.util.{AbstractFile, Position}
+import scala.tools.util.AbstractFile;
+import scala.tools.nsc.util.Position;
import Flags._;
[_trait_] abstract class Symbols: SymbolTable {
diff --git a/sources/scala/tools/nsc/symtab/Types.scala b/sources/scala/tools/nsc/symtab/Types.scala
index bff269e8f2..eba1ef7161 100755
--- a/sources/scala/tools/nsc/symtab/Types.scala
+++ b/sources/scala/tools/nsc/symtab/Types.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.symtab;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import nsc.util.{ListBuffer, HashSet};
import Flags._;
diff --git a/sources/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/sources/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 0173338df8..d1c7ae62ab 100755
--- a/sources/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/sources/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -14,7 +14,10 @@
*/
package scala.tools.nsc.symtab.classfile;
-import scala.tools.util._;
+import scala.tools.nsc.util.Position;
+import scala.tools.util.AbstractFile;
+import scala.tools.util.AbstractFileReader;
+
import java.io.IOException;
abstract class ClassfileParser {
diff --git a/sources/scala/tools/nsc/symtab/classfile/MetaParser.scala b/sources/scala/tools/nsc/symtab/classfile/MetaParser.scala
index e125e9326a..eca5da7091 100755
--- a/sources/scala/tools/nsc/symtab/classfile/MetaParser.scala
+++ b/sources/scala/tools/nsc/symtab/classfile/MetaParser.scala
@@ -7,7 +7,7 @@ package scala.tools.nsc.symtab.classfile;
import java.util.{StringTokenizer, NoSuchElementException}
import util.ListBuffer;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
abstract class MetaParser{
diff --git a/sources/scala/tools/nsc/symtab/classfile/SymblfileParser.scala b/sources/scala/tools/nsc/symtab/classfile/SymblfileParser.scala
index fd6834260f..cb7e401b1c 100755
--- a/sources/scala/tools/nsc/symtab/classfile/SymblfileParser.scala
+++ b/sources/scala/tools/nsc/symtab/classfile/SymblfileParser.scala
@@ -5,7 +5,8 @@
// $Id$
package scala.tools.nsc.symtab.classfile;
-import scala.tools.util._;
+import scala.tools.util.{AbstractFile, AbstractFileReader};
+
import java.io.IOException;
abstract class SymblfileParser {
diff --git a/sources/scala/tools/nsc/symtab/classfile/UnPickler.scala b/sources/scala/tools/nsc/symtab/classfile/UnPickler.scala
index 7c3f231397..0716920b13 100755
--- a/sources/scala/tools/nsc/symtab/classfile/UnPickler.scala
+++ b/sources/scala/tools/nsc/symtab/classfile/UnPickler.scala
@@ -5,7 +5,8 @@
// $Id$
package scala.tools.nsc.symtab.classfile;
-import scala.tools.util.{Position, UTF8Codec};
+import scala.tools.nsc.util.Position;
+import scala.tools.util.UTF8Codec;
import java.lang.{Float, Double};
import Flags._;
import PickleFormat._;
diff --git a/sources/scala/tools/nsc/transform/Erasure.scala b/sources/scala/tools/nsc/transform/Erasure.scala
index 5107dc30a2..ad6f02f183 100755
--- a/sources/scala/tools/nsc/transform/Erasure.scala
+++ b/sources/scala/tools/nsc/transform/Erasure.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.transform;
import collection.mutable.HashMap;
import symtab._;
import Flags._;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import util.ListBuffer;
abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
diff --git a/sources/scala/tools/nsc/transform/Mixin.scala b/sources/scala/tools/nsc/transform/Mixin.scala
index 30df09f8b7..f532cad7fe 100755
--- a/sources/scala/tools/nsc/transform/Mixin.scala
+++ b/sources/scala/tools/nsc/transform/Mixin.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.transform;
import symtab._;
import Flags._;
import util.{ListBuffer}
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
abstract class Mixin extends InfoTransform {
import global._;
diff --git a/sources/scala/tools/nsc/typechecker/Contexts.scala b/sources/scala/tools/nsc/typechecker/Contexts.scala
index 7490fc00c6..a43a45d1f3 100755
--- a/sources/scala/tools/nsc/typechecker/Contexts.scala
+++ b/sources/scala/tools/nsc/typechecker/Contexts.scala
@@ -6,7 +6,7 @@
package scala.tools.nsc.typechecker;
import symtab.Flags._;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
[_trait_] abstract class Contexts: Analyzer {
import global._;
diff --git a/sources/scala/tools/nsc/typechecker/Namers.scala b/sources/scala/tools/nsc/typechecker/Namers.scala
index 8c6f91e51b..639b2215cf 100755
--- a/sources/scala/tools/nsc/typechecker/Namers.scala
+++ b/sources/scala/tools/nsc/typechecker/Namers.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.typechecker;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import symtab.Flags;
import symtab.Flags._;
diff --git a/sources/scala/tools/nsc/typechecker/TreeCheckers.scala b/sources/scala/tools/nsc/typechecker/TreeCheckers.scala
index 84882c26c1..cc5d7aa62e 100644
--- a/sources/scala/tools/nsc/typechecker/TreeCheckers.scala
+++ b/sources/scala/tools/nsc/typechecker/TreeCheckers.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.typechecker;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import symtab.Flags._;
abstract class TreeCheckers extends Analyzer {
@@ -20,7 +20,7 @@ abstract class TreeCheckers extends Analyzer {
}
def check(unit: CompilationUnit): unit = {
- val curPrompt = reporter.prompt();
+ val curPrompt = reporter.prompt;
reporter.prompt(true);
val context = startContext.make(unit);
context.checking = true;
diff --git a/sources/scala/tools/nsc/typechecker/Typers.scala b/sources/scala/tools/nsc/typechecker/Typers.scala
index 241cfb6264..a5ff44a106 100755
--- a/sources/scala/tools/nsc/typechecker/Typers.scala
+++ b/sources/scala/tools/nsc/typechecker/Typers.scala
@@ -8,7 +8,7 @@ package scala.tools.nsc.typechecker;
import nsc.util.ListBuffer;
import symtab.Flags._;
-import scala.tools.util.Position;
+import scala.tools.nsc.util.Position;
import collection.mutable.HashMap;
/** Methods to create symbols and to enter them into scopes. */
diff --git a/sources/scala/tools/nsc/util/CharArrayReader.scala b/sources/scala/tools/nsc/util/CharArrayReader.scala
index 743b738c18..31cc77ce0b 100644
--- a/sources/scala/tools/nsc/util/CharArrayReader.scala
+++ b/sources/scala/tools/nsc/util/CharArrayReader.scala
@@ -5,7 +5,7 @@
// $Id$
package scala.tools.nsc.util;
-import scala.tools.util.SourceFile.{LF, FF, CR, SU}
+import scala.tools.nsc.util.SourceFile.{LF, FF, CR, SU}
class CharArrayReader(buf: Array[char], start: int, startline: int, startcol: int,
decodeUni: boolean, error: String => unit) {
@@ -21,8 +21,9 @@ class CharArrayReader(buf: Array[char], start: int, startline: int, startcol: in
*/
var ch: char = _;
var bp = start;
- var cline: int = _;
- var ccol: int = _;
+ private var cline: int = _;
+ private var ccol: int = _;
+ def cpos = bp;
var isUnicode: boolean = _;
private var nextline = startline;
private var nextcol = startcol;
diff --git a/sources/scala/tools/nsc/util/Position.scala b/sources/scala/tools/nsc/util/Position.scala
new file mode 100755
index 0000000000..a905ba2a1c
--- /dev/null
+++ b/sources/scala/tools/nsc/util/Position.scala
@@ -0,0 +1,68 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2003-2004, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+** $Id$
+\* */
+
+package scala.tools.nsc.util;
+
+/** This position uses offset in character buffer rather than line column relationship.
+ * @author Sean McDirmid
+ */
+object Position {
+ val NOPOS = -1;
+ val FIRSTPOS = 0;
+ val NOLINE = 0;
+ val FIRSTLINE = 1;
+
+
+ def line(offset : Int) = offset;
+}
+
+
+class Position(_source : SourceFile,_offset: Int) {
+ import Position._;
+
+ val offset = _offset;
+ val source = _source;
+ val tabInc = 8;
+
+
+ def this(sourceName : String) = this(new SourceFile(sourceName, new Array[Char](0)), NOPOS);
+ def this(sourceName : String, _offset : Int) = this(new SourceFile(sourceName, new Array[Char](0)), _offset);
+
+ def hasOffset = offset != NOPOS;
+
+ def line: Int = if (hasOffset) source.offsetToLine(offset) + FIRSTLINE else NOLINE;
+ // for display purposes only.
+ def column: Int = if (hasOffset) {
+ var column = 1;
+ var coffset = source.lineToOffset(source.offsetToLine(offset));
+ var continue = true;
+ while (continue) {
+ if (coffset == offset) continue = false;
+ else if (source.content(coffset) == '\t') column = ((column - 1) / tabInc * tabInc) + tabInc + 1;
+ else column = column + 1;
+ coffset = coffset + 1;
+ }
+ column;
+ } else 0;
+
+
+ def lineContent: String = if (hasOffset) source.lineToString(line - FIRSTLINE) else "NO_LINE";
+
+ /** Returns a string representation of the encoded position. */
+ override def toString(): String = {
+ val sb = new StringBuffer();
+ sb.append(source.file.getPath());
+ if (hasOffset) {
+ sb.append(line);
+ sb.append(':');
+ sb.append(column);
+ }
+ sb.toString();
+ }
+}
diff --git a/sources/scala/tools/nsc/util/SourceFile.scala b/sources/scala/tools/nsc/util/SourceFile.scala
new file mode 100644
index 0000000000..28844d2734
--- /dev/null
+++ b/sources/scala/tools/nsc/util/SourceFile.scala
@@ -0,0 +1,117 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2003-2004, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+** $Id$
+\* */
+
+package scala.tools.nsc.util;
+import scala.tools.util.AbstractFile;
+import scala.tools.util.CharArrayFile;
+
+/** Uses positions that are offsets rather than line/column pairs.
+ *
+ * @author Sean McDirmid
+ */
+object SourceFile {
+ val LF : Char = 0x0A;
+ val FF : Char = 0x0C;
+ val CR : Char = 0x0D;
+ val SU : Char = 0x1A;
+ def isLineBreak(c : Char) = c == LF || c == FF || c == CR || c == SU;
+}
+
+
+class SourceFile(_file : AbstractFile, _content : Array[Char]) {
+ import SourceFile._;
+
+
+ val file = _file;
+ val content = normalize(_content);
+
+ def getContent() = content;
+
+ def getFile() = file;
+
+ def this(sourceName: String, content : Array[Char]) =
+ this(new CharArrayFile(sourceName, content), content);
+
+ def isLineBreak(idx : Int) = SourceFile.isLineBreak(content(idx));
+
+
+ def position(offset : Int) = new Position(this, offset);
+ def position(line : Int, column : Int) = new Position(this, lineToOffset(line) + column);
+
+ // constants
+
+ // NOTE: all indexes are based on zero!!!!
+ override def toString(): String = file.getName() + ":" + content.length;
+
+
+ object line {
+ var index = 0;
+ var offset = 0;
+
+ private def reset: Unit = {
+ index = 0; offset = 0;
+ }
+
+ def find(toFind : Int, isIndex : Boolean) : Int = {
+ if (!isIndex && toFind == Position.NOPOS ) return Position.NOLINE - 1; // 1 will be added
+ if ( isIndex && toFind == Position.NOLINE) return Position.NOPOS;
+
+ if (!isIndex && (toFind >= content.length)) throw new Error(toFind + " not valid offset in " + file.getName() + ":" + content.length);
+
+ if ( isIndex && toFind < index) reset;
+ if (!isIndex && toFind < offset) reset;
+ try {
+ var seek = 0;
+ var continue = true;
+ while (continue) {
+ if (false) {;}
+ else if ( isIndex && seek == 0 && toFind == index ) continue = false;
+ else if (!isIndex && toFind == offset + seek ) continue = false;
+ else if (!isIndex && (toFind < (offset + seek))) throw new Error("HOW??? toFind=" + toFind + " offset=" + offset + " seek=" + seek);
+ else if (isLineBreak(offset + seek)) {
+ index = index + 1;
+ offset = offset + seek + 1;
+ seek = 0;
+ } else seek = seek + 1;
+ }
+ if (isIndex) offset else index;
+ } catch {
+ case ex: ArrayIndexOutOfBoundsException =>
+ System.err.println("XXX: toFind=" + toFind + " isIndex=" + isIndex + " length=" + content.length);
+ throw ex;
+ }
+ }
+ }
+ def offsetToLine(offset : Int) : Int = line.find(offset, false);
+ def lineToOffset(index : Int) : Int = line.find(index , true);
+
+ def lineToString(index : Int) = {
+ var offset = lineToOffset(index);
+ val buf = new StringBuffer();
+ while (!isLineBreak(offset) && offset < content.length) {
+ buf.append(content(offset));
+ offset = offset + 1;
+ }
+ buf.toString();
+ }
+
+
+ private def normalize(input : Array[char]): Array[char] =
+ if (input.length > 0 && input(input.length - 1) == SU) input;
+ else {
+ val content = new Array[char](input.length + 1);
+ System.arraycopy(input, 0, content, 0, input.length);
+ content(input.length) = SU;
+ content;
+ }
+
+
+
+
+}