diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2014-01-20 22:20:06 -0800 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2014-01-20 22:20:06 -0800 |
commit | 434c21c5f101ecc7435d9577a8ee8bd576f571c1 (patch) | |
tree | 57e9a08d982c465f6072cfd2141fc8185dd47a04 /src | |
parent | 8f6f4032b5c026fd9301cebe28dde5bb7c8e264c (diff) | |
parent | 3f3014cf0edd8ea182d234d5987838223231d9c9 (diff) | |
download | scala-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')
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 |