summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/ant/templates/tool-unix.tmpl2
-rw-r--r--src/compiler/scala/tools/ant/templates/tool-windows.tmpl9
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala5
-rw-r--r--src/compiler/scala/tools/nsc/transform/UnCurry.scala4
-rw-r--r--src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala8
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Contexts.scala6
-rw-r--r--src/compiler/scala/tools/reflect/FormatInterpolator.scala3
-rw-r--r--src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala6
-rw-r--r--src/library/scala/collection/GenTraversableOnce.scala1
-rw-r--r--src/reflect/scala/reflect/api/Internals.scala8
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala7
-rw-r--r--src/reflect/scala/reflect/internal/ReificationSupport.scala19
-rw-r--r--src/reflect/scala/reflect/internal/StdNames.scala1
-rw-r--r--src/reflect/scala/reflect/internal/SymbolTable.scala1
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala4
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala2
-rw-r--r--src/reflect/scala/reflect/internal/Variances.scala9
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala2
18 files changed, 74 insertions, 23 deletions
diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
index 194d92367b..d6dc167dd8 100644
--- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
+++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
@@ -156,7 +156,7 @@ while [[ $# -gt 0 ]]; do
java_args=("${java_args[@@]}" "$1")
scala_args=("${scala_args[@@]}" "$1")
# respect user-supplied -Dscala.usejavacp
- case "$1" in -Dscala.usejavacp) OVERRIDE_USEJAVACP="" esac
+ case "$1" in -Dscala.usejavacp) OVERRIDE_USEJAVACP="";; esac
shift
;;
-J*)
diff --git a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl
index 8441f3af23..9a2deb4da6 100644
--- a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl
+++ b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl
@@ -25,6 +25,10 @@ shift
:notoolcp
+rem SI-8358, SI-8368 -- the default should really be false,
+rem but I don't want to flip the default during 2.11's RC cycle
+set _OVERRIDE_USEJAVACP="-Dscala.usejavacp=true"
+
rem We keep in _JAVA_PARAMS all -J-prefixed and -D-prefixed arguments
set _JAVA_PARAMS=
@@ -45,6 +49,9 @@ if "%_TEST_PARAM:~0,2%"=="-J" (
)
if "%_TEST_PARAM:~0,2%"=="-D" (
+ if "%_TEST_PARAM%"=="-Dscala.usejavacp" (
+ set _OVERRIDE_USEJAVACP=
+ )
rem test if this was double-quoted property "-Dprop=42"
for /F "delims== tokens=1-2" %%G in ("%_TEST_PARAM%") DO (
if not "%%G" == "%_TEST_PARAM%" (
@@ -126,7 +133,7 @@ if "%_TOOL_CLASSPATH%"=="" (
if not "%_LINE_TOOLCP%"=="" call :add_cpath "%_LINE_TOOLCP%"
-set _PROPS=-Dscala.home="!_SCALA_HOME!" -Denv.emacs="%EMACS%" -Dscala.usejavacp=true @properties@
+set _PROPS=-Dscala.home="!_SCALA_HOME!" -Denv.emacs="%EMACS%" %_OVERRIDE_USEJAVACP% @properties@
rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index c5d0c8506a..35eab94333 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -236,6 +236,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
override def inform(msg: String) = inform(NoPosition, msg)
override def globalError(msg: String) = globalError(NoPosition, msg)
override def warning(msg: String) = warning(NoPosition, msg)
+ override def deprecationWarning(pos: Position, msg: String) = currentUnit.deprecationWarning(pos, msg)
def globalError(pos: Position, msg: String) = reporter.error(pos, msg)
def warning(pos: Position, msg: String) = if (settings.fatalWarnings) globalError(pos, msg) else reporter.warning(pos, msg)
@@ -1236,7 +1237,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
}
private val unitbuf = new SyncedCompilationBuffer
-
+
val compiledFiles = new mutable.HashSet[String]
/** A map from compiled top-level symbols to their source files */
@@ -1491,7 +1492,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
made to the underlying structure.
*/
def units: Iterator[CompilationUnit] = unitbuf.iterator
-
+
def registerPickle(sym: Symbol): Unit = ()
/** does this run compile given class, module, or case factory? */
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
index 8a7d30235f..d77c6b54a9 100644
--- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala
+++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala
@@ -221,7 +221,9 @@ abstract class UnCurry extends InfoTransform
def mkMethod(owner: Symbol, name: TermName, additionalFlags: FlagSet = NoFlags): DefDef =
gen.mkMethodFromFunction(localTyper)(fun, owner, name, additionalFlags)
- if (inlineFunctionExpansion) {
+ val canUseDelamdafyMethod = (inConstructorFlag == 0) // Avoiding synthesizing code prone to SI-6666, SI-8363 by using old-style lambda translation
+
+ if (inlineFunctionExpansion || !canUseDelamdafyMethod) {
val parents = addSerializable(abstractFunctionForFunctionType(fun.tpe))
val anonClass = fun.symbol.owner newAnonymousFunctionClass(fun.pos, inConstructorFlag) addAnnotation SerialVersionUIDAnnotation
anonClass setInfo ClassInfoType(parents, newScope, anonClass)
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala
index 699e98f963..4cf8980689 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchTranslation.scala
@@ -81,14 +81,14 @@ trait MatchTranslation {
object SymbolAndTypeBound {
def unapply(tree: Tree): Option[(Symbol, Type)] = tree match {
- case SymbolBound(sym, SymbolAndTypeBound(_, tpe)) => Some(sym -> tpe)
- case TypeBound(tpe) => Some(binder -> tpe)
- case _ => None
+ case SymbolBound(sym, TypeBound(tpe)) => Some(sym -> tpe)
+ case TypeBound(tpe) => Some(binder -> tpe)
+ case _ => None
}
}
object TypeBound {
- def unapply(tree: Tree): Option[Type] = unbind(tree) match {
+ def unapply(tree: Tree): Option[Type] = tree match {
case Typed(Ident(_), _) if tree.tpe != null => Some(tree.tpe)
case _ => None
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
index 133e80788b..994a2a4f4f 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Contexts.scala
@@ -433,8 +433,10 @@ trait Contexts { self: Analyzer =>
case _ => false
}
val isImport = tree match {
- case _: Import => true
- case _ => false
+ // The guard is for SI-8403. It prevents adding imports again in the context created by
+ // `Namer#createInnerNamer`
+ case _: Import if tree != this.tree => true
+ case _ => false
}
val sameOwner = owner == this.owner
val prefixInChild =
diff --git a/src/compiler/scala/tools/reflect/FormatInterpolator.scala b/src/compiler/scala/tools/reflect/FormatInterpolator.scala
index 0258002850..e0f9bb6044 100644
--- a/src/compiler/scala/tools/reflect/FormatInterpolator.scala
+++ b/src/compiler/scala/tools/reflect/FormatInterpolator.scala
@@ -93,7 +93,8 @@ abstract class FormatInterpolator {
case '\n' => "\\n"
case '\f' => "\\f"
case '\r' => "\\r"
- case '\"' => "\\u0022" // $" in future
+ case '\"' => "${'\"'}" /* avoid lint warn */ +
+ " or a triple-quoted literal \"\"\"with embedded \" or \\u0022\"\"\"" // $" in future
case '\'' => "'"
case '\\' => """\\"""
case x => "\\u%04x" format x
diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala b/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala
index 850030e9ba..1b8b0686e8 100644
--- a/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala
+++ b/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala
@@ -199,6 +199,10 @@ trait Reifiers { self: Quasiquotes =>
reifyBuildCall(nme.SyntacticEmptyTypeTree)
case SyntacticImport(expr, selectors) =>
reifyBuildCall(nme.SyntacticImport, expr, selectors)
+ case SyntacticPartialFunction(cases) =>
+ reifyBuildCall(nme.SyntacticPartialFunction, cases)
+ case SyntacticMatch(scrutinee, cases) =>
+ reifyBuildCall(nme.SyntacticMatch, scrutinee, cases)
case Q(tree) if fillListHole.isDefinedAt(tree) =>
mirrorBuildCall(nme.SyntacticBlock, fillListHole(tree))
case Q(other) =>
@@ -211,8 +215,6 @@ trait Reifiers { self: Quasiquotes =>
reifyBuildCall(nme.SyntacticBlock, Nil)
case Try(block, catches, finalizer) =>
reifyBuildCall(nme.SyntacticTry, block, catches, finalizer)
- case Match(selector, cases) =>
- reifyBuildCall(nme.SyntacticMatch, selector, cases)
case CaseDef(pat, guard, body) if fillListHole.isDefinedAt(body) =>
mirrorCall(nme.CaseDef, reify(pat), reify(guard), mirrorBuildCall(nme.SyntacticBlock, fillListHole(body)))
// parser emits trees with scala package symbol to ensure
diff --git a/src/library/scala/collection/GenTraversableOnce.scala b/src/library/scala/collection/GenTraversableOnce.scala
index 01d179aeb6..0cd91409cf 100644
--- a/src/library/scala/collection/GenTraversableOnce.scala
+++ b/src/library/scala/collection/GenTraversableOnce.scala
@@ -506,7 +506,6 @@ trait GenTraversableOnce[+A] extends Any {
def toIndexedSeq: immutable.IndexedSeq[A]
/** Converts this $coll to a stream.
- * $willNotTerminateInf
* @return a stream containing all elements of this $coll.
*/
def toStream: Stream[A]
diff --git a/src/reflect/scala/reflect/api/Internals.scala b/src/reflect/scala/reflect/api/Internals.scala
index d2e742726d..9faba7efd7 100644
--- a/src/reflect/scala/reflect/api/Internals.scala
+++ b/src/reflect/scala/reflect/api/Internals.scala
@@ -762,9 +762,15 @@ trait Internals { self: Universe =>
def unapply(lst: List[List[Tree]]): Option[List[List[T]]]
}
+ val SyntacticPartialFunction: SyntacticPartialFunctionExtractor
+ trait SyntacticPartialFunctionExtractor {
+ def apply(cases: List[Tree]): Match
+ def unapply(tree: Match): Option[List[CaseDef]]
+ }
+
val SyntacticMatch: SyntacticMatchExtractor
trait SyntacticMatchExtractor {
- def apply(selector: Tree, cases: List[Tree]): Match
+ def apply(scrutinee: Tree, cases: List[Tree]): Match
def unapply(tree: Match): Option[(Tree, List[CaseDef])]
}
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index 558e1aa611..25d78f4e6f 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -410,7 +410,8 @@ trait Definitions extends api.StandardDefinitions {
else if (isScalaRepeatedParamType(tp)) elementExtract(RepeatedParamClass, tp) orElse tp
else tp
)
- def repeatedToSingle(tp: Type): Type = elementExtract(RepeatedParamClass, tp) orElse tp
+ def repeatedToSingle(tp: Type): Type = elementExtract(RepeatedParamClass, tp) orElse elementExtract(JavaRepeatedParamClass, tp) orElse tp
+ // We don't need to deal with JavaRepeatedParamClass here, as `repeatedToSeq` is only called in the patmat translation for Scala sources.
def repeatedToSeq(tp: Type): Type = elementTransform(RepeatedParamClass, tp)(seqType) orElse tp
def seqToRepeated(tp: Type): Type = elementTransform(SeqClass, tp)(scalaRepeatedType) orElse tp
def isReferenceArray(tp: Type) = elementTest(ArrayClass, tp)(_ <:< AnyRefTpe)
@@ -501,7 +502,9 @@ trait Definitions extends api.StandardDefinitions {
lazy val StringContextClass = requiredClass[scala.StringContext]
- lazy val QuasiquoteClass = if (ApiUniverseClass != NoSymbol) getMember(ApiUniverseClass, tpnme.Quasiquote) else NoSymbol
+ // SI-8392 a reflection universe on classpath may not have
+ // quasiquotes, if e.g. crosstyping with -Xsource on
+ lazy val QuasiquoteClass = if (ApiUniverseClass != NoSymbol) getMemberIfDefined(ApiUniverseClass, tpnme.Quasiquote) else NoSymbol
lazy val QuasiquoteClass_api = if (QuasiquoteClass != NoSymbol) getMember(QuasiquoteClass, tpnme.api) else NoSymbol
lazy val QuasiquoteClass_api_apply = if (QuasiquoteClass_api != NoSymbol) getMember(QuasiquoteClass_api, nme.apply) else NoSymbol
lazy val QuasiquoteClass_api_unapply = if (QuasiquoteClass_api != NoSymbol) getMember(QuasiquoteClass_api, nme.unapply) else NoSymbol
diff --git a/src/reflect/scala/reflect/internal/ReificationSupport.scala b/src/reflect/scala/reflect/internal/ReificationSupport.scala
index dfe1811ff0..9a130337b4 100644
--- a/src/reflect/scala/reflect/internal/ReificationSupport.scala
+++ b/src/reflect/scala/reflect/internal/ReificationSupport.scala
@@ -850,9 +850,24 @@ trait ReificationSupport { self: SymbolTable =>
case tree => throw new IllegalArgumentException("$tree is not valid representation of pattern match case")
}
+ object SyntacticPartialFunction extends SyntacticPartialFunctionExtractor {
+ def apply(cases: List[Tree]): Match = Match(EmptyTree, mkCases(cases))
+ def unapply(tree: Match): Option[List[CaseDef]] = tree match {
+ case Match(EmptyTree, cases) => Some(cases)
+ case _ => None
+ }
+ }
+
object SyntacticMatch extends SyntacticMatchExtractor {
- def apply(selector: Tree, cases: List[Tree]) = Match(selector, mkCases(cases))
- def unapply(tree: Match): Option[(Tree, List[CaseDef])] = Match.unapply(tree)
+ def apply(scrutinee: Tree, cases: List[Tree]) = {
+ require(scrutinee.nonEmpty, "match's scrutinee may not be empty")
+ Match(scrutinee, mkCases(cases))
+ }
+
+ def unapply(tree: Match): Option[(Tree, List[CaseDef])] = tree match {
+ case Match(scrutinee, cases) if scrutinee.nonEmpty => Some((scrutinee, cases))
+ case _ => None
+ }
}
object SyntacticTry extends SyntacticTryExtractor {
diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala
index 640e0606c7..10959ff41f 100644
--- a/src/reflect/scala/reflect/internal/StdNames.scala
+++ b/src/reflect/scala/reflect/internal/StdNames.scala
@@ -630,6 +630,7 @@ trait StdNames {
val SyntacticNew: NameType = "SyntacticNew"
val SyntacticObjectDef: NameType = "SyntacticObjectDef"
val SyntacticPackageObjectDef: NameType = "SyntacticPackageObjectDef"
+ val SyntacticPartialFunction: NameType = "SyntacticPartialFunction"
val SyntacticPatDef: NameType = "SyntacticPatDef"
val SyntacticSelectType: NameType = "SyntacticSelectType"
val SyntacticSelectTerm: NameType = "SyntacticSelectTerm"
diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala
index e50c65c9ca..c76dedbff4 100644
--- a/src/reflect/scala/reflect/internal/SymbolTable.scala
+++ b/src/reflect/scala/reflect/internal/SymbolTable.scala
@@ -51,6 +51,7 @@ abstract class SymbolTable extends macros.Universe
val gen = new InternalTreeGen { val global: SymbolTable.this.type = SymbolTable.this }
def log(msg: => AnyRef): Unit
+ def deprecationWarning(pos: Position, msg: String): Unit = warning(msg)
def warning(msg: String): Unit = Console.err.println(msg)
def inform(msg: String): Unit = Console.err.println(msg)
def globalError(msg: String): Unit = abort(msg)
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 595d638c28..2ce54d2259 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -2343,7 +2343,11 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
def localName: TermName = name.localName
/** The setter of this value or getter definition, or NoSymbol if none exists */
+ @deprecated("Use `setterIn` instead", "2.11.0")
final def setter(base: Symbol, hasExpandedName: Boolean = needsExpandedSetterName): Symbol =
+ setterIn(base, hasExpandedName)
+
+ final def setterIn(base: Symbol, hasExpandedName: Boolean = needsExpandedSetterName): Symbol =
base.info decl setterNameInBase(base, hasExpandedName) filter (_.hasAccessorFlag)
def needsExpandedSetterName = (
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index e9e5a89aa7..eb56f4ba81 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -2271,7 +2271,7 @@ trait Types
case _ => args.mkString("(", ", ", ")")
}
private def customToString = sym match {
- case RepeatedParamClass => args.head + "*"
+ case RepeatedParamClass | JavaRepeatedParamClass => args.head + "*"
case ByNameParamClass => "=> " + args.head
case _ =>
if (isFunctionTypeDirect(this)) {
diff --git a/src/reflect/scala/reflect/internal/Variances.scala b/src/reflect/scala/reflect/internal/Variances.scala
index 3bcfed7d34..cfe2ad8b87 100644
--- a/src/reflect/scala/reflect/internal/Variances.scala
+++ b/src/reflect/scala/reflect/internal/Variances.scala
@@ -75,7 +75,14 @@ trait Variances {
def nextVariance(sym: Symbol, v: Variance): Variance = (
if (shouldFlip(sym, tvar)) v.flip
else if (isLocalOnly(sym)) Bivariant
- else if (sym.isAliasType) Invariant
+ else if (sym.isAliasType) (
+ // Unsound pre-2.11 behavior preserved under -Xsource:2.10
+ if (settings.isScala211 || sym.isOverridingSymbol) Invariant
+ else {
+ deprecationWarning(sym.pos, s"Construct depends on unsound variance analysis and will not compile in scala 2.11 and beyond")
+ Bivariant
+ }
+ )
else v
)
def loop(sym: Symbol, v: Variance): Variance = (
diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
index 212f94c531..e5c64c6f45 100644
--- a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
+++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
@@ -37,7 +37,7 @@ trait ScaladocAnalyzer extends Analyzer {
comment.defineVariables(sym)
val typer1 = newTyper(context.makeNewScope(docDef, context.owner))
for (useCase <- comment.useCases) {
- typer1.silent(_ => typer1 defineUseCases useCase) match {
+ typer1.silent(_.asInstanceOf[ScaladocTyper].defineUseCases(useCase)) match {
case SilentTypeError(err) =>
unit.warning(useCase.pos, err.errMsg)
case _ =>