summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala3
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala6
-rw-r--r--src/library/scala/collection/immutable/Stream.scala21
-rw-r--r--src/partest-extras/scala/tools/partest/ReplTest.scala37
-rw-r--r--src/reflect/scala/reflect/runtime/JavaMirrors.scala9
-rw-r--r--src/repl/scala/tools/nsc/interpreter/ILoop.scala23
6 files changed, 70 insertions, 29 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 1c9dbad4dd..b233acf271 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -1551,7 +1551,8 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
if (reporter.hasErrors) {
for ((sym, file) <- symSource.iterator) {
- sym.reset(new loaders.SourcefileLoader(file))
+ if (file != null)
+ sym.reset(new loaders.SourcefileLoader(file))
if (sym.isTerm)
sym.moduleClass reset loaders.moduleClassLoader
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 758425aad5..d01e4f84ba 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -151,7 +151,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
for(ar <- argResultsBuff)
paramTp = paramTp.subst(ar.subst.from, ar.subst.to)
- val res = if (paramFailed || (paramTp.isError && {paramFailed = true; true})) SearchFailure else inferImplicit(fun, paramTp, context.reportErrors, isView = false, context)
+ val res = if (paramFailed || (paramTp.isErroneous && {paramFailed = true; true})) SearchFailure else inferImplicit(fun, paramTp, context.reportErrors, isView = false, context)
argResultsBuff += res
if (res.isSuccess) {
@@ -1039,11 +1039,11 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
// to non-continuation types.
if (tree.tpe <:< AnyTpe) pt.dealias match {
case TypeRef(_, UnitClass, _) => // (12)
- if (settings.warnValueDiscard)
+ if (!isPastTyper && settings.warnValueDiscard)
context.warning(tree.pos, "discarded non-Unit value")
return typedPos(tree.pos, mode, pt)(Block(List(tree), Literal(Constant(()))))
case TypeRef(_, sym, _) if isNumericValueClass(sym) && isNumericSubType(tree.tpe, pt) =>
- if (settings.warnNumericWiden)
+ if (!isPastTyper && settings.warnNumericWiden)
context.warning(tree.pos, "implicit numeric widening")
return typedPos(tree.pos, mode, pt)(Select(tree, "to" + sym.name))
case _ =>
diff --git a/src/library/scala/collection/immutable/Stream.scala b/src/library/scala/collection/immutable/Stream.scala
index 9ed5162061..f303e79bb3 100644
--- a/src/library/scala/collection/immutable/Stream.scala
+++ b/src/library/scala/collection/immutable/Stream.scala
@@ -743,16 +743,18 @@ self =>
b append end
return b
}
- if ((cursor ne scout) && scout.tailDefined) {
+ if (cursor ne scout) {
cursor = scout
- scout = scout.tail
- // Use 2x 1x iterator trick for cycle detection; slow iterator can add strings
- while ((cursor ne scout) && scout.tailDefined) {
- b append sep append cursor.head
- n += 1
- cursor = cursor.tail
+ if (scout.tailDefined) {
scout = scout.tail
- if (scout.tailDefined) scout = scout.tail
+ // Use 2x 1x iterator trick for cycle detection; slow iterator can add strings
+ while ((cursor ne scout) && scout.tailDefined) {
+ b append sep append cursor.head
+ n += 1
+ cursor = cursor.tail
+ scout = scout.tail
+ if (scout.tailDefined) scout = scout.tail
+ }
}
}
if (!scout.tailDefined) { // Not a cycle, scout hit an end
@@ -761,6 +763,9 @@ self =>
n += 1
cursor = cursor.tail
}
+ if (cursor.nonEmpty) {
+ b append sep append cursor.head
+ }
}
else {
// Cycle.
diff --git a/src/partest-extras/scala/tools/partest/ReplTest.scala b/src/partest-extras/scala/tools/partest/ReplTest.scala
index a728e8bdef..5b65d6ab9b 100644
--- a/src/partest-extras/scala/tools/partest/ReplTest.scala
+++ b/src/partest-extras/scala/tools/partest/ReplTest.scala
@@ -8,6 +8,7 @@ package scala.tools.partest
import scala.tools.nsc.Settings
import scala.tools.nsc.interpreter.ILoop
import java.lang.reflect.{ Method => JMethod, Field => JField }
+import scala.util.matching.Regex.Match
/** A class for testing repl code.
* It filters the line of output that mentions a version number.
@@ -22,6 +23,9 @@ abstract class ReplTest extends DirectTest {
s.Xnojline.value = true
transformSettings(s)
}
+ /** True for SessionTest to preserve session text. */
+ def inSession: Boolean = false
+ /** True to preserve welcome text. */
def welcoming: Boolean = false
lazy val welcome = "(Welcome to Scala) version .*".r
def normalize(s: String) = s match {
@@ -36,7 +40,7 @@ abstract class ReplTest extends DirectTest {
val s = settings
log("eval(): settings = " + s)
//ILoop.runForTranscript(code, s).lines drop 1 // not always first line
- val lines = ILoop.runForTranscript(code, s).lines
+ val lines = ILoop.runForTranscript(code, s, inSession = inSession).lines
if (welcoming) lines map normalize
else lines filter unwelcoming
}
@@ -57,13 +61,30 @@ abstract class SessionTest extends ReplTest {
/** Session transcript, as a triple-quoted, multiline, marginalized string. */
def session: String
- /** Expected output, as an iterator. */
- def expected = session.stripMargin.lines
+ /** Expected output, as an iterator, optionally marginally stripped. */
+ def expected = if (stripMargins) session.stripMargin.lines else session.lines
+
+ /** Override with false if we should not strip margins because of leading continuation lines. */
+ def stripMargins: Boolean = true
+
+ /** Analogous to stripMargins, don't mangle continuation lines on echo. */
+ override def inSession: Boolean = true
/** Code is the command list culled from the session (or the expected session output).
- * Would be nicer if code were lazy lines.
+ * Would be nicer if code were lazy lines so you could generate arbitrarily long text.
+ * Retain user input: prompt lines and continuations, without the prefix; or pasted text plus ctl-D.
*/
- override final def code = expected filter (_ startsWith prompt) map (_ drop prompt.length) mkString "\n"
+ import SessionTest._
+ override final def code = input findAllMatchIn (expected mkString ("", "\n", "\n")) map {
+ case input(null, null, prompted) =>
+ def continued(m: Match): Option[String] = m match {
+ case margin(text) => Some(text)
+ case _ => None
+ }
+ margin.replaceSomeIn(prompted, continued)
+ case input(cmd, pasted, null) =>
+ cmd + pasted + "\u0004"
+ } mkString
final def prompt = "scala> "
@@ -75,3 +96,9 @@ abstract class SessionTest extends ReplTest {
if (evaled != wanted) Console print nest.FileManager.compareContents(wanted, evaled, "expected", "actual")
}
}
+object SessionTest {
+ // \R for line break is Java 8, \v for vertical space might suffice
+ val input = """(?m)^scala> (:pa.*\u000A)// Entering paste mode.*\u000A\u000A((?:.*\u000A)*)\u000A// Exiting paste mode.*\u000A|^scala> (.*\u000A(?:\s*\| .*\u000A)*)""".r
+
+ val margin = """(?m)^\s*\| (.*)$""".r
+}
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
index 1c751fb93b..3b497227e7 100644
--- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala
+++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala
@@ -428,9 +428,12 @@ private[scala] trait JavaMirrors extends internal.SymbolTable with api.JavaUnive
var i = 0
while (i < args1.length) {
val arg = args(i)
- if (i >= paramCount) args1(i) = arg // don't transform varargs
- else if (isByName(i)) args1(i) = () => arg // don't transform by-name value class params
- else if (isDerivedValueClass(i)) args1(i) = paramUnboxers(i).invoke(arg)
+ args1(i) = (
+ if (i >= paramCount) arg // don't transform varargs
+ else if (isByName(i)) () => arg // don't transform by-name value class params
+ else if (isDerivedValueClass(i)) paramUnboxers(i).invoke(arg) // do get the underlying value
+ else arg // don't molest anything else
+ )
i += 1
}
jinvoke(args1)
diff --git a/src/repl/scala/tools/nsc/interpreter/ILoop.scala b/src/repl/scala/tools/nsc/interpreter/ILoop.scala
index 4d71e0e09e..4221126caa 100644
--- a/src/repl/scala/tools/nsc/interpreter/ILoop.scala
+++ b/src/repl/scala/tools/nsc/interpreter/ILoop.scala
@@ -937,25 +937,30 @@ object ILoop {
// Designed primarily for use by test code: take a String with a
// bunch of code, and prints out a transcript of what it would look
// like if you'd just typed it into the repl.
- def runForTranscript(code: String, settings: Settings): String = {
+ def runForTranscript(code: String, settings: Settings, inSession: Boolean = false): String = {
import java.io.{ BufferedReader, StringReader, OutputStreamWriter }
stringFromStream { ostream =>
Console.withOut(ostream) {
val output = new JPrintWriter(new OutputStreamWriter(ostream), true) {
- override def write(str: String) = {
- // completely skip continuation lines
- if (str forall (ch => ch.isWhitespace || ch == '|')) ()
+ // skip margin prefix for continuation lines, unless preserving session text for test
+ override def write(str: String) =
+ if (!inSession && (str forall (ch => ch.isWhitespace || ch == '|'))) () // repl.paste.ContinueString
else super.write(str)
- }
}
val input = new BufferedReader(new StringReader(code.trim + "\n")) {
override def readLine(): String = {
- val s = super.readLine()
- // helping out by printing the line being interpreted.
- if (s != null)
+ mark(1) // default buffer is 8k
+ val c = read()
+ if (c == -1 || c == 4) {
+ null
+ } else {
+ reset()
+ val s = super.readLine()
+ // helping out by printing the line being interpreted.
output.println(s)
- s
+ s
+ }
}
}
val repl = new ILoop(input, output)