summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-01-19 23:00:09 +0300
committerEugene Burmako <xeno.by@gmail.com>2014-01-20 09:48:12 +0300
commit936d60a2621088ba463a44c2f2d6450986022169 (patch)
tree4137839890784150dfc2f18c308ed1ae33a10a42 /src/reflect
parent6a6b485fe98890f73a03753e3981be5fa580ed02 (diff)
downloadscala-936d60a2621088ba463a44c2f2d6450986022169.tar.gz
scala-936d60a2621088ba463a44c2f2d6450986022169.tar.bz2
scala-936d60a2621088ba463a44c2f2d6450986022169.zip
SI-8158 compiler hangs printing out fancy types
Apparently, even though the compiler has safeguards against infinite type printouts, having a depth counter, we didn’t account for the cases when printouts are both self-referential and self-multiplying. For one, SI-8158 provides an example of such a type, which is a structural type that refers to itself twice in return types of its methods. At first, printing such a type would go deeper and deeper, but then it will hit the depth limit and start multiply indefinitely. This commit fixes this particular problem by recognizing self-references as this.type’s and printing them out as such. The subsequent commit will introduce a more general facility.
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index c2689fe7e9..54e5b2781e 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 => ": this.type"
+ case _ => ": " + tp
}
}