aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Types.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-01-27 15:35:12 +0100
committerMartin Odersky <odersky@gmail.com>2014-01-27 16:02:21 +0100
commitc476171d838c55bbfe36856e73a470e826748acc (patch)
treeb2f93b5f14c23f779391c68860cb45e47f33d74d /src/dotty/tools/dotc/core/Types.scala
parentfe85a5aa18e071922d11f1dd1694fe478b9d4fad (diff)
downloaddotty-c476171d838c55bbfe36856e73a470e826748acc.tar.gz
dotty-c476171d838c55bbfe36856e73a470e826748acc.tar.bz2
dotty-c476171d838c55bbfe36856e73a470e826748acc.zip
Cache result of narrow on Methods.
narrow is exercised a lot after the improvement to normalize. So it's important to cache it in order not to bust `uniques` with NoprefixTermRefs.
Diffstat (limited to 'src/dotty/tools/dotc/core/Types.scala')
-rw-r--r--src/dotty/tools/dotc/core/Types.scala11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index 38ed09ebd..4f740d2e5 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -965,6 +965,15 @@ object Types {
def map(tm: TypeMap): ProtoType
}
+ /** Implementations of this trait cache the resukts of `narrow`. */
+ trait NarrowCached extends Type {
+ private var myNarrow: TermRef = null
+ override def narrow(implicit ctx: Context): TermRef = {
+ if (myNarrow eq null) myNarrow = super.narrow
+ myNarrow
+ }
+ }
+
// --- NamedTypes ------------------------------------------------------------------
/** A NamedType of the form Prefix # name */
@@ -1408,7 +1417,7 @@ object Types {
abstract case class MethodType(paramNames: List[TermName], paramTypes: List[Type])
(resultTypeExp: MethodType => Type)
- extends CachedGroundType with BindingType with TermType with MethodOrPoly { thisMethodType =>
+ extends CachedGroundType with BindingType with TermType with MethodOrPoly with NarrowCached { thisMethodType =>
override val resultType = resultTypeExp(this)
assert(resultType != NoType)