summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2013-08-28 09:48:11 -0700
committerSom Snytt <som.snytt@gmail.com>2013-09-05 01:41:43 -0700
commite8af579a4442b3cda9ea82ddc1ce7f9bd6899418 (patch)
tree05e70d16bb0b6eed6d555132d4906de0e75b3e66 /src
parenta24fc60deed8fbed062ecd6ff96e434349cca75d (diff)
downloadscala-e8af579a4442b3cda9ea82ddc1ce7f9bd6899418.tar.gz
scala-e8af579a4442b3cda9ea82ddc1ce7f9bd6899418.tar.bz2
scala-e8af579a4442b3cda9ea82ddc1ce7f9bd6899418.zip
SI-7791 Line number table reflects underlying file
Since positions ultimately know their ultimate positions in their ultimate source, use that line number, ultimately, when emitting line number table entries. It is possible, but possibly not useful, to emit both the actual (ultimate) line number and the nominal one. The `int`-valued line number of the `StackTraceElement` is "derived" from the attribute. In global, wrapping a `BatchSourceFile` as a `ScriptSource` happens in `compileSources` to facilitate testing. A `ScriptTest` facility is provided to facilitate testing the script facility. It is rather facile.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala33
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala3
-rw-r--r--src/partest-extras/scala/tools/partest/ScriptTest.scala21
-rw-r--r--src/reflect/scala/reflect/internal/util/SourceFile.scala5
4 files changed, 48 insertions, 14 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 3f2d759a6d..0e3b2993c7 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -352,9 +352,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
// Here comes another one...
override protected val enableTypeVarExperimentals = settings.Xexperimental.value
- def getSourceFile(f: AbstractFile): BatchSourceFile =
- if (settings.script.isSetByUser) ScriptSourceFile(f, reader read f)
- else new BatchSourceFile(f, reader read f)
+ def getSourceFile(f: AbstractFile): BatchSourceFile = new BatchSourceFile(f, reader read f)
def getSourceFile(name: String): SourceFile = {
val f = AbstractFile.getFile(name)
@@ -1490,20 +1488,23 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
}
}
- /** Compile list of source files */
- def compileSources(sources: List[SourceFile]) {
- // there is a problem already, e.g. a plugin was passed a bad option
- if (reporter.hasErrors)
- return
+ /** Compile list of source files,
+ * unless there is a problem already,
+ * such as a plugin was passed a bad option.
+ */
+ def compileSources(sources: List[SourceFile]) = if (!reporter.hasErrors) {
- // nothing to compile, but we should still report use of deprecated options
- if (sources.isEmpty) {
+ def checkDeprecations() = {
checkDeprecatedSettings(newCompilationUnit(""))
reportCompileErrors()
- return
}
- compileUnits(sources map (new CompilationUnit(_)), firstPhase)
+ val units = sources map scripted map (new CompilationUnit(_))
+
+ units match {
+ case Nil => checkDeprecations() // nothing to compile, report deprecated options
+ case _ => compileUnits(units, firstPhase)
+ }
}
def compileUnits(units: List[CompilationUnit], fromPhase: Phase): Unit =
@@ -1605,12 +1606,18 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
catch { case ex: IOException => globalError(ex.getMessage()) }
}
+ /** If this compilation is scripted, convert the source to a script source. */
+ private def scripted(s: SourceFile) = s match {
+ case b: BatchSourceFile if settings.script.isSetByUser => ScriptSourceFile(b)
+ case _ => s
+ }
+
/** Compile abstract file until `globalPhase`, but at least
* to phase "namer".
*/
def compileLate(file: AbstractFile) {
if (!compiledFiles(file.path))
- compileLate(new CompilationUnit(getSourceFile(file)))
+ compileLate(new CompilationUnit(scripted(getSourceFile(file))))
}
/** Compile abstract file until `globalPhase`, but at least to phase "namer".
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
index 3947db2dd4..edb1c55224 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
@@ -2316,7 +2316,8 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
lastLineNr = currentLineNr
val lineLab = new asm.Label
jmethod.visitLabel(lineLab)
- lnEntries ::= LineNumberEntry(currentLineNr, lineLab)
+ val actual = iPos inUltimateSource iPos.source
+ lnEntries ::= LineNumberEntry(actual.line, lineLab)
}
}
diff --git a/src/partest-extras/scala/tools/partest/ScriptTest.scala b/src/partest-extras/scala/tools/partest/ScriptTest.scala
new file mode 100644
index 0000000000..24a4121b54
--- /dev/null
+++ b/src/partest-extras/scala/tools/partest/ScriptTest.scala
@@ -0,0 +1,21 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ */
+
+package scala.tools.partest
+
+import scala.reflect.internal.util.ScalaClassLoader
+
+/** A `ScriptTest` is a `DirectTest` for which the code
+ * is the contents of a script file.
+ */
+abstract class ScriptTest extends DirectTest {
+ def testmain = "TestMain"
+ override def extraSettings = s"-usejavacp -Xscript $testmain"
+ def scriptPath = testPath changeExtension "script"
+ def code = scriptPath.toFile.slurp
+ def show() = {
+ compile()
+ ScalaClassLoader(getClass.getClassLoader).run(testmain, Seq.empty[String])
+ }
+}
diff --git a/src/reflect/scala/reflect/internal/util/SourceFile.scala b/src/reflect/scala/reflect/internal/util/SourceFile.scala
index ea4c9a9b68..6bb4cf3f0e 100644
--- a/src/reflect/scala/reflect/internal/util/SourceFile.scala
+++ b/src/reflect/scala/reflect/internal/util/SourceFile.scala
@@ -86,6 +86,11 @@ object ScriptSourceFile {
stripped
}
+
+ def apply(underlying: BatchSourceFile) = {
+ val headerLen = headerLength(underlying.content)
+ new ScriptSourceFile(underlying, underlying.content drop headerLen, headerLen)
+ }
}
class ScriptSourceFile(underlying: BatchSourceFile, content: Array[Char], override val start: Int) extends BatchSourceFile(underlying.file, content) {