summaryrefslogtreecommitdiff
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
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
-rw-r--r--CONTRIBUTING.md4
-rw-r--r--doc/LICENSE.md2
-rw-r--r--doc/License.rtf2
-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
-rw-r--r--test/files/run/t9546.scala13
-rw-r--r--test/files/run/t9546b.scala13
-rw-r--r--test/files/run/t9546c.scala13
-rw-r--r--test/files/run/t9546d.scala16
-rw-r--r--test/files/run/t9546e.scala15
13 files changed, 150 insertions, 70 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 18f07376bd..617734210f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,13 +4,13 @@ We follow the standard GitHub [fork & pull](https://help.github.com/articles/usi
You're always welcome to submit your PR straight away and start the discussion (without reading the rest of this wonderful doc, or the `READMEnot^H^H^H.md`). The goal of these notes is to make your experience contributing to Scala as smooth and pleasant as possible. We're happy to guide you through the process once you've submitted your PR.
## The Scala Community
-In 2014, you -- the Scala community -- matched the core team at EPFL in number of commits contributed to Scala 2.11, doubling the percentage of commits from outside EPFL/Typesafe since 2.10. Excellent work! (The split was roughly 25/25/50 for you/EPFL/Typesafe.)
+In 2014, you -- the Scala community -- matched the core team at EPFL in number of commits contributed to Scala 2.11, doubling the percentage of commits from outside EPFL/Lightbend since 2.10. Excellent work! (The split was roughly 25/25/50 for you/EPFL/Lightbend.)
We are super happy about this, and are eager to make your experience contributing to Scala productive and satisfying, so that we can keep up this growth. We can't do this alone (nor do we want to)!
This is why we're collecting these notes on how to contribute, and we hope you'll share your experience to improve the process for the next contributor! (Feel free to send a PR for this note, send your thoughts to scala-internals, or tweet about it to @adriaanm.)
-By the way, the team at Lightbend (formerly Typesafe) is: @adriaanm, @lrytz, @retronym, @SethTisue, and @szeiger.
+By the way, the team at Lightbend is: @adriaanm, @lrytz, @retronym, @SethTisue, and @szeiger.
## What kind of PR are you submitting?
diff --git a/doc/LICENSE.md b/doc/LICENSE.md
index ee61d11b8b..a07ba32e0b 100644
--- a/doc/LICENSE.md
+++ b/doc/LICENSE.md
@@ -4,7 +4,7 @@ Scala is licensed under the [BSD 3-Clause License](http://opensource.org/license
Copyright (c) 2002-2016 EPFL
-Copyright (c) 2011-2016 Lightbend, Inc. (formerly Typesafe, Inc.)
+Copyright (c) 2011-2016 Lightbend, Inc.
All rights reserved.
diff --git a/doc/License.rtf b/doc/License.rtf
index 407700f8dd..5c26d787a0 100644
--- a/doc/License.rtf
+++ b/doc/License.rtf
@@ -11,7 +11,7 @@
\fs40 \
\fs26 Copyright (c) 2002-2016 EPFL\
-Copyright (c) 2011-2016 Lightbend, Inc. (formerly Typesafe, Inc.)\
+Copyright (c) 2011-2016 Lightbend, Inc.\
All rights reserved.\
\
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\
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>
}
diff --git a/test/files/run/t9546.scala b/test/files/run/t9546.scala
new file mode 100644
index 0000000000..7016881084
--- /dev/null
+++ b/test/files/run/t9546.scala
@@ -0,0 +1,13 @@
+package foo {
+ case class Opt[A] private[foo](val get: A) extends AnyVal
+ object Opt {
+ def mkOpt = Opt("")
+ }
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ foo.Opt.mkOpt
+ }
+}
+
diff --git a/test/files/run/t9546b.scala b/test/files/run/t9546b.scala
new file mode 100644
index 0000000000..0b4d2d3fe5
--- /dev/null
+++ b/test/files/run/t9546b.scala
@@ -0,0 +1,13 @@
+package foo {
+ case class Opt[A](val get: A) extends AnyVal {
+ }
+ object Opt {
+ def mkOpt = Opt("")
+ }
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ foo.Opt.mkOpt
+ }
+}
diff --git a/test/files/run/t9546c.scala b/test/files/run/t9546c.scala
new file mode 100644
index 0000000000..ea6a5a36b4
--- /dev/null
+++ b/test/files/run/t9546c.scala
@@ -0,0 +1,13 @@
+package foo {
+ case class Opt[A] private[foo](val get: A)
+ object Opt {
+ def mkOpt = Opt("")
+ }
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ foo.Opt.mkOpt
+ }
+}
+
diff --git a/test/files/run/t9546d.scala b/test/files/run/t9546d.scala
new file mode 100644
index 0000000000..00bf37dc18
--- /dev/null
+++ b/test/files/run/t9546d.scala
@@ -0,0 +1,16 @@
+class X {
+ def test: Any = {
+ object Opt {
+ def mkOpt = Opt("")
+ }
+ case class Opt[A] private[X](val get: A)
+ Opt.mkOpt
+ }
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ new X().test
+ }
+}
+
diff --git a/test/files/run/t9546e.scala b/test/files/run/t9546e.scala
new file mode 100644
index 0000000000..b19d0871aa
--- /dev/null
+++ b/test/files/run/t9546e.scala
@@ -0,0 +1,15 @@
+case class A private (x: Int)
+case class B private (x: Int)(y: Int)
+
+class C {
+ def f = A(1)
+ def g = B(1)(2) // was: constructor B in class B cannot be accessed in class C
+}
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ new C().f
+ new C().g
+ }
+
+}