summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2016-03-14 11:45:27 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2016-03-14 11:45:27 -0700
commitcbba68fb6085f238097fbf1635046051bd7c6889 (patch)
treec2ad5795f1fc7935a543018854264d3f431df2cd /src
parent067a4d36a6d30d6431a520c9db8ec4714f1a8675 (diff)
parent1706a37eb84ec252aea77bccebad3e48448534ad (diff)
downloadscala-cbba68fb6085f238097fbf1635046051bd7c6889.tar.gz
scala-cbba68fb6085f238097fbf1635046051bd7c6889.tar.bz2
scala-cbba68fb6085f238097fbf1635046051bd7c6889.zip
Merge 2.11.x into 2.12.x
Resolved conflicts as in b0e05b67c7
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala85
-rw-r--r--src/library/scala/collection/mutable/ListMap.scala2
-rw-r--r--src/manual/scala/man1/scalac.scala51
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/Settings.scala2
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/Entity.scala2
5 files changed, 76 insertions, 66 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index 9261d6b851..da269168ec 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -1507,9 +1507,8 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
}
}
- private def transformCaseApply(tree: Tree, ifNot: => Unit) = {
+ private def isSimpleCaseApply(tree: Tree): Boolean = {
val sym = tree.symbol
-
def isClassTypeAccessible(tree: Tree): Boolean = tree match {
case TypeApply(fun, targs) =>
isClassTypeAccessible(fun)
@@ -1517,40 +1516,36 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
( // SI-4859 `CaseClass1().InnerCaseClass2()` must not be rewritten to `new InnerCaseClass2()`;
// {expr; Outer}.Inner() must not be rewritten to `new Outer.Inner()`.
treeInfo.isQualifierSafeToElide(module) &&
- // SI-5626 Classes in refinement types cannot be constructed with `new`. In this case,
- // the companion class is actually not a ClassSymbol, but a reference to an abstract type.
- module.symbol.companionClass.isClass
- )
+ // SI-5626 Classes in refinement types cannot be constructed with `new`. In this case,
+ // the companion class is actually not a ClassSymbol, but a reference to an abstract type.
+ module.symbol.companionClass.isClass
+ )
}
- val doTransform =
- sym.isSourceMethod &&
+ sym.isSourceMethod &&
sym.isCase &&
sym.name == nme.apply &&
isClassTypeAccessible(tree) &&
- !tree.tpe.resultType.typeSymbol.primaryConstructor.isLessAccessibleThan(tree.symbol)
-
- if (doTransform) {
- def loop(t: Tree): Unit = t match {
- case Ident(_) =>
- checkUndesiredProperties(t.symbol, t.pos)
- case Select(qual, _) =>
- checkUndesiredProperties(t.symbol, t.pos)
- loop(qual)
- case _ =>
- }
- tree foreach {
- case i@Ident(_) =>
- enterReference(i.pos, i.symbol) // SI-5390 need to `enterReference` for `a` in `a.B()`
- case _ =>
- }
- loop(tree)
- toConstructor(tree.pos, tree.tpe)
+ !tree.tpe.finalResultType.typeSymbol.primaryConstructor.isLessAccessibleThan(tree.symbol)
+ }
+
+ private def transformCaseApply(tree: Tree) = {
+ def loop(t: Tree): Unit = t match {
+ case Ident(_) =>
+ checkUndesiredProperties(t.symbol, t.pos)
+ case Select(qual, _) =>
+ checkUndesiredProperties(t.symbol, t.pos)
+ loop(qual)
+ case _ =>
}
- else {
- ifNot
- tree
+
+ tree foreach {
+ case i@Ident(_) =>
+ enterReference(i.pos, i.symbol) // SI-5390 need to `enterReference` for `a` in `a.B()`
+ case _ =>
}
+ loop(tree)
+ toConstructor(tree.pos, tree.tpe)
}
private def transformApply(tree: Apply): Tree = tree match {
@@ -1590,12 +1585,24 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
// term should have been eliminated by super accessors
assert(!(qual.symbol.isTrait && sym.isTerm && mix == tpnme.EMPTY), (qual.symbol, sym, mix))
- transformCaseApply(tree,
+ // Rewrite eligible calls to monomorphic case companion apply methods to the equivalent constructor call.
+ //
+ // Note: for generic case classes the rewrite needs to be handled at the enclosing `TypeApply` to transform
+ // `TypeApply(Select(C, apply), targs)` to `Select(New(C[targs]), <init>)`. In case such a `TypeApply`
+ // was deemed ineligible for transformation (e.g. the case constructor was private), the refchecks transform
+ // will recurse to this point with `Select(C, apply)`, which will have a type `[T](...)C[T]`.
+ //
+ // We don't need to perform the check on the Select node, and `!isHigherKinded will guard against this
+ // redundant (and previously buggy, SI-9546) consideration.
+ if (!tree.tpe.isHigherKinded && isSimpleCaseApply(tree)) {
+ transformCaseApply(tree)
+ } else {
qual match {
case Super(_, mix) => checkSuper(mix)
case _ =>
}
- )
+ tree
+ }
}
private def transformIf(tree: If): Tree = {
val If(cond, thenpart, elsepart) = tree
@@ -1720,7 +1727,10 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
case TypeApply(fn, args) =>
checkBounds(tree, NoPrefix, NoSymbol, fn.tpe.typeParams, args map (_.tpe))
- transformCaseApply(tree, ())
+ if (isSimpleCaseApply(tree))
+ transformCaseApply(tree)
+ else
+ tree
case x @ Apply(_, _) =>
transformApply(x)
@@ -1739,12 +1749,11 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
case Ident(name) =>
checkUndesiredProperties(sym, tree.pos)
- transformCaseApply(tree,
- if (name != nme.WILDCARD && name != tpnme.WILDCARD_STAR) {
- assert(sym != NoSymbol, "transformCaseApply: name = " + name.debugString + " tree = " + tree + " / " + tree.getClass) //debug
- enterReference(tree.pos, sym)
- }
- )
+ if (name != nme.WILDCARD && name != tpnme.WILDCARD_STAR) {
+ assert(sym != NoSymbol, "transformCaseApply: name = " + name.debugString + " tree = " + tree + " / " + tree.getClass) //debug
+ enterReference(tree.pos, sym)
+ }
+ tree
case x @ Select(_, _) =>
transformSelect(x)
diff --git a/src/library/scala/collection/mutable/ListMap.scala b/src/library/scala/collection/mutable/ListMap.scala
index 2ea5b1fa7c..e963af4a8a 100644
--- a/src/library/scala/collection/mutable/ListMap.scala
+++ b/src/library/scala/collection/mutable/ListMap.scala
@@ -15,7 +15,7 @@ package mutable
import generic._
import annotation.tailrec
-/** A simple mutable map backed by a list.
+/** A simple mutable map backed by a list, so it preserves insertion order.
*
* @tparam A the type of the keys contained in this list map.
* @tparam B the type of the values assigned to keys in this list map.
diff --git a/src/manual/scala/man1/scalac.scala b/src/manual/scala/man1/scalac.scala
index 811fb2d94e..6ffcccea25 100644
--- a/src/manual/scala/man1/scalac.scala
+++ b/src/manual/scala/man1/scalac.scala
@@ -5,10 +5,6 @@
package scala.man1
-/**
- * @author Stephane Micheloud
- * @version 1.0
- */
object scalac extends Command {
import _root_.scala.tools.docutil.ManPage._
@@ -77,7 +73,7 @@ object scalac extends Command {
SeqPara(
"Specify where to find user class files (on Unix-based systems " &
"a colon-separated list of paths, on Windows-based systems, a " &
- "semicolon-separate list of paths). This does not override the " &
+ "semicolon-separated list of paths). This does not override the " &
"built-in (" & Mono("\"boot\"") & ") search path.",
"The default class path is the current directory. Setting the " &
Mono("CLASSPATH") & " variable or using the " & Mono("-classpath") & " " &
@@ -153,7 +149,7 @@ object scalac extends Command {
"Specify location(s) of source files."),
Definition(
CmdOptionBound("target:", "{jvm-1.8}"),
- SeqPara(
+ SeqPara(
Mono("\"jvm-1.8\"") & " target JVM 1.8 (default)")),
Definition(
CmdOption("toolcp", Argument("path")),
@@ -193,7 +189,7 @@ object scalac extends Command {
Definition(
CmdOption("Xcheckinit"),
"Wrap field accessors to throw an exception on uninitialized access."),
- Definition(
+ Definition(
CmdOption("Xdev"),
"Enable warnings for developers working on the Scala compiler"),
Definition(
@@ -209,7 +205,7 @@ object scalac extends Command {
Definition(
CmdOption("Xfatal-warnings"),
"Fail the compilation if there are any warnings."),
- Definition(
+ Definition(
CmdOption("Xfull-lubs"),
"Retain pre 2.10 behavior of less aggressive truncation of least upper bounds."),
Definition(
@@ -221,25 +217,25 @@ object scalac extends Command {
Definition(
CmdOption("Xlint"),
"Enable recommended additional warnings."),
- Definition(
+ Definition(
CmdOption("Xlog-free-terms"),
"Print a message when reification creates a free term."),
- Definition(
+ Definition(
CmdOption("Xlog-free-types"),
"Print a message when reification resorts to generating a free type."),
- Definition(
+ Definition(
CmdOption("Xlog-implicit-conversions"),
"Print a message whenever an implicit conversion is inserted."),
Definition(
CmdOption("Xlog-implicits"),
"Show more detail on why some implicits are not applicable."),
- Definition(
+ Definition(
CmdOption("Xlog-reflective-calls"),
"Print a message when a reflective method call is generated."),
- Definition(
+ Definition(
CmdOptionBound("Xmacro-settings:", Argument("option")),
"Custom settings for macros."),
- Definition(
+ Definition(
CmdOption("Xmain-class", Argument("path")),
"Class for manifest's Main-Class entry (only useful with -d <jar>)."),
Definition(
@@ -251,7 +247,7 @@ object scalac extends Command {
Definition(
CmdOption("Xno-forwarders"),
"Do not generate static forwarders in mirror classes."),
- Definition(
+ Definition(
CmdOption("Xno-patmat-analysis"),
"Don't perform exhaustivity/unreachability analysis. Also, ignore " & MItalic("@switch") & " annotation."),
Definition(
@@ -309,16 +305,21 @@ object scalac extends Command {
Definition(
CmdOptionBound("Xsource:", Argument("version")),
"Treat compiler input as Scala source for the specified version, see SI-8126."),
- Definition(
+ Definition(
CmdOption("Xsource-reader", Argument("classname")),
"Specify a custom method for reading source files."),
- Definition(
+ Definition(
CmdOption("Xstrict-inference"),
"Don't infer known-unsound types."),
Definition(
CmdOption("Xverify"),
"Verify generic signatures in generated bytecode (asm backend only)."),
Definition(
+ CmdOptionBound("Xxml:", "{coalescing}"),
+ SeqPara(
+ "Configure XML parsing.",
+ Mono("\"coalescing\"") & " convert PCData to Text and coalesce sibling nodes (default in 2.11).")),
+ Definition(
CmdOption("Y"),
"Print a synopsis of private options.")
)
@@ -332,34 +333,34 @@ object scalac extends Command {
Definition(
MItalic("namer"),
"resolve names, attach symbols to named trees"),
- Definition(
+ Definition(
MItalic("packageobjects"),
"load package objects"),
- Definition(
+ Definition(
MItalic("typer"),
"the meat and potatoes: type the trees"),
Definition(
MItalic("patmat"),
"translate match expressions"),
- Definition(
+ Definition(
MItalic("superaccessors"),
"add super accessors in traits and nested classes"),
- Definition(
+ Definition(
MItalic("extmethods"),
"add extension methods for inline classes"),
- Definition(
+ Definition(
MItalic("pickler"),
"serialize symbol tables"),
Definition(
MItalic("refchecks"),
"reference/override checking, translate nested objects"),
- Definition(
+ Definition(
MItalic("selectiveanf"),
"ANF pre-transform for " & MItalic("@cps") & " (CPS plugin)"),
- Definition(
+ Definition(
MItalic("selectivecps"),
MItalic("@cps") & "-driven transform of selectiveanf assignments (CPS plugin)"),
- Definition(
+ Definition(
MItalic("uncurry"),
"uncurry, translate function values to anonymous classes"),
Definition(
diff --git a/src/scaladoc/scala/tools/nsc/doc/Settings.scala b/src/scaladoc/scala/tools/nsc/doc/Settings.scala
index de86acb6d6..59380dd782 100644
--- a/src/scaladoc/scala/tools/nsc/doc/Settings.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/Settings.scala
@@ -48,7 +48,7 @@ class Settings(error: String => Unit, val printMsg: String => Unit = println(_))
val docfooter = StringSetting (
"-doc-footer",
"footer",
- "A footer on every Scaladoc page, by default the EPFL/Typesafe copyright notice. Can be overridden with a custom footer.",
+ "A footer on every Scaladoc page, by default the EPFL/Lightbend copyright notice. Can be overridden with a custom footer.",
""
)
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Entity.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Entity.scala
index 6c8f989b8c..e45847da78 100644
--- a/src/scaladoc/scala/tools/nsc/doc/html/page/Entity.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/Entity.scala
@@ -404,7 +404,7 @@ trait EntityPage extends HtmlPage {
{
if (Set("epfl", "EPFL").contains(tpl.universe.settings.docfooter.value))
- <div id="footer">Scala programming documentation. Copyright (c) 2003-2016 <a href="http://www.epfl.ch" target="_top">EPFL</a>, with contributions from <a href="http://typesafe.com" target="_top">Typesafe</a>.</div>
+ <div id="footer">Scala programming documentation. Copyright (c) 2003-2016 <a href="http://www.epfl.ch" target="_top">EPFL</a>, with contributions from <a href="http://www.lightbend.com" target="_top">Lightbend</a>.</div>
else
<div id="footer"> { tpl.universe.settings.docfooter.value } </div>
}