summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-01-20 22:20:06 -0800
committerEugene Burmako <xeno.by@gmail.com>2014-01-20 22:20:06 -0800
commit434c21c5f101ecc7435d9577a8ee8bd576f571c1 (patch)
tree57e9a08d982c465f6072cfd2141fc8185dd47a04 /src
parent8f6f4032b5c026fd9301cebe28dde5bb7c8e264c (diff)
parent3f3014cf0edd8ea182d234d5987838223231d9c9 (diff)
downloadscala-434c21c5f101ecc7435d9577a8ee8bd576f571c1.tar.gz
scala-434c21c5f101ecc7435d9577a8ee8bd576f571c1.tar.bz2
scala-434c21c5f101ecc7435d9577a8ee8bd576f571c1.zip
Merge pull request #3385 from xeno-by/ticket/8158
fixes some typos and types
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/reflect/quasiquotes/Quasiquotes.scala4
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala13
-rw-r--r--src/reflect/scala/reflect/internal/Types.scala2
-rw-r--r--src/reflect/scala/reflect/internal/tpe/TypeToStrings.scala30
-rw-r--r--src/reflect/scala/reflect/runtime/JavaUniverseForce.scala3
-rw-r--r--src/reflect/scala/reflect/runtime/SynchronizedTypes.scala9
6 files changed, 43 insertions, 18 deletions
diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Quasiquotes.scala b/src/compiler/scala/tools/reflect/quasiquotes/Quasiquotes.scala
index 7d777ef7d5..3e703924e8 100644
--- a/src/compiler/scala/tools/reflect/quasiquotes/Quasiquotes.scala
+++ b/src/compiler/scala/tools/reflect/quasiquotes/Quasiquotes.scala
@@ -11,7 +11,7 @@ abstract class Quasiquotes extends Parsers
val global: c.universe.type = c.universe
import c.universe._
- def debug(msg: String): Unit =
+ def debug(msg: => String): Unit =
if (settings.Yquasiquotedebug.value) println(msg)
lazy val (universe: Tree, args, parts, parse, reify, method) = c.macroApplication match {
@@ -48,7 +48,7 @@ abstract class Quasiquotes extends Parsers
val tree = parse(code)
debug(s"parsed:\n${showRaw(tree)}\n$tree\n")
val reified = reify(tree)
- val sreified =
+ def sreified =
reified
.toString
.replace("scala.reflect.runtime.`package`.universe.build.", "")
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index c2689fe7e9..f49ddaf6ca 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -2519,6 +2519,10 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
if (settings.debug.value) parentsString(tp.parents)
else briefParentsString(tp.parents)
)
+ def isStructuralThisType = (
+ // prevents disasters like SI-8158
+ owner.isInitialized && owner.isStructuralRefinement && tp == owner.tpe
+ )
if (isType) typeParamsString(tp) + (
if (isClass) " extends " + parents
else if (isAliasType) " = " + tp.resultType
@@ -2529,10 +2533,11 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
)
else if (isModule) "" // avoid "object X of type X.type"
else tp match {
- case PolyType(tparams, res) => typeParamsString(tp) + infoString(res)
- case NullaryMethodType(res) => infoString(res)
- case MethodType(params, res) => valueParamsString(tp) + infoString(res)
- case _ => ": " + tp
+ case PolyType(tparams, res) => typeParamsString(tp) + infoString(res)
+ case NullaryMethodType(res) => infoString(res)
+ case MethodType(params, res) => valueParamsString(tp) + infoString(res)
+ case _ if isStructuralThisType => ": " + owner.name
+ case _ => ": " + tp
}
}
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala
index d0c322ca6b..92beffb761 100644
--- a/src/reflect/scala/reflect/internal/Types.scala
+++ b/src/reflect/scala/reflect/internal/Types.scala
@@ -1456,7 +1456,7 @@ trait Types
override def safeToString = scalaNotation(_.toString)
- /** Bounds notation used in Scala sytanx.
+ /** Bounds notation used in Scala syntax.
* For example +This <: scala.collection.generic.Sorted[K,This].
*/
private[internal] def scalaNotation(typeString: Type => String): String = {
diff --git a/src/reflect/scala/reflect/internal/tpe/TypeToStrings.scala b/src/reflect/scala/reflect/internal/tpe/TypeToStrings.scala
index ebc4394d25..a062fc8209 100644
--- a/src/reflect/scala/reflect/internal/tpe/TypeToStrings.scala
+++ b/src/reflect/scala/reflect/internal/tpe/TypeToStrings.scala
@@ -3,19 +3,29 @@ package reflect
package internal
package tpe
+import scala.collection.mutable.HashSet
+
private[internal] trait TypeToStrings {
self: SymbolTable =>
/** The maximum number of recursions allowed in toString
*/
- final val maxTostringRecursions = 50
+ final val maxToStringRecursions = 50
+
+ private var _toStringRecursions = 0
+ def toStringRecursions = _toStringRecursions
+ def toStringRecursions_=(value: Int) = _toStringRecursions = value
- private var _tostringRecursions = 0
- def tostringRecursions = _tostringRecursions
- def tostringRecursions_=(value: Int) = _tostringRecursions = value
+ private var _toStringSubjects = HashSet[Type]()
+ def toStringSubjects = _toStringSubjects
protected def typeToString(tpe: Type): String =
- if (tostringRecursions >= maxTostringRecursions) {
+ // if (toStringSubjects contains tpe) {
+ // // handles self-referential anonymous classes and who knows what else
+ // "..."
+ // }
+ // else
+ if (toStringRecursions >= maxToStringRecursions) {
devWarning("Exceeded recursion depth attempting to print " + util.shortClassOfInstance(tpe))
if (settings.debug)
(new Throwable).printStackTrace
@@ -24,9 +34,15 @@ private[internal] trait TypeToStrings {
}
else
try {
- tostringRecursions += 1
+ toStringRecursions += 1
+ // TODO: study performance impact of this cache
+ // to quote Jason:
+ // I'm a little uneasy with the performance impact of the fail-safe. We end up calling Type#toString
+ // when we generate error messages, including, importantly, errors issued during silent mode that are never issued.
+ // toStringSubjects += tpe
tpe.safeToString
} finally {
- tostringRecursions -= 1
+ // toStringSubjects -= tpe
+ toStringRecursions -= 1
}
}
diff --git a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
index 6b3985d434..9224749864 100644
--- a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
+++ b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala
@@ -41,7 +41,8 @@ trait JavaUniverseForce { self: runtime.JavaUniverse =>
// inaccessible: this._lubResults
// inaccessible: this._glbResults
// inaccessible: this._indent
- // inaccessible: this._tostringRecursions
+ // inaccessible: this._toStringRecursions
+ // inaccessible: this._toStringSubjects
// inaccessible: this.atomicIds
// inaccessible: this.atomicExistentialIds
// inaccessible: this._recursionTable
diff --git a/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala b/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala
index de78e527a7..83d471f91e 100644
--- a/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala
+++ b/src/reflect/scala/reflect/runtime/SynchronizedTypes.scala
@@ -81,9 +81,12 @@ private[reflect] trait SynchronizedTypes extends internal.Types { self: SymbolTa
override def indent = _indent.get
override def indent_=(value: String) = _indent.set(value)
- private lazy val _tostringRecursions = mkThreadLocalStorage(0)
- override def tostringRecursions = _tostringRecursions.get
- override def tostringRecursions_=(value: Int) = _tostringRecursions.set(value)
+ private lazy val _toStringRecursions = mkThreadLocalStorage(0)
+ override def toStringRecursions = _toStringRecursions.get
+ override def toStringRecursions_=(value: Int) = _toStringRecursions.set(value)
+
+ private lazy val _toStringSubjects = mkThreadLocalStorage(new mutable.HashSet[Type])
+ override def toStringSubjects = _toStringSubjects.get
/* The idea of caches is as follows.
* When in reflexive mode, a cache is either null, or one sentinal