aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/core')
-rw-r--r--src/dotty/tools/dotc/core/Substituters.scala2
-rw-r--r--src/dotty/tools/dotc/core/SymDenotations.scala2
-rw-r--r--src/dotty/tools/dotc/core/Types.scala23
-rw-r--r--src/dotty/tools/dotc/core/pickling/UnPickler.scala2
4 files changed, 22 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/core/Substituters.scala b/src/dotty/tools/dotc/core/Substituters.scala
index 74388f436..e05f76cd9 100644
--- a/src/dotty/tools/dotc/core/Substituters.scala
+++ b/src/dotty/tools/dotc/core/Substituters.scala
@@ -145,7 +145,7 @@ trait Substituters { this: Context =>
var fs = from
var ts = to
while (fs.nonEmpty) {
- if (fs.head eq sym) return ThisType(ts.head.asClass)
+ if (fs.head eq sym) return ts.head.asClass.thisType
fs = fs.tail
ts = ts.tail
}
diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala
index a3828552d..cb457bd73 100644
--- a/src/dotty/tools/dotc/core/SymDenotations.scala
+++ b/src/dotty/tools/dotc/core/SymDenotations.scala
@@ -1011,7 +1011,7 @@ object SymDenotations {
if ((pre eq NoPrefix) || ctx.erasedTypes) pre select sourceModule
else TermRef.withSig(pre, name.sourceModuleName, Signature.NotAMethod)
}
- else ThisType(classSymbol)
+ else ThisType.raw(classSymbol)
private[this] var myTypeRef: TypeRef = null
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index a6ba7d9a0..787c7c4e9 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -1535,16 +1535,31 @@ object Types {
// --- Other SingletonTypes: ThisType/SuperType/ConstantType ---------------------------
/** The type cls.this */
- abstract case class ThisType(cls: ClassSymbol) extends CachedProxyType with SingletonType {
- override def underlying(implicit ctx: Context) = cls.classInfo.selfType
- override def computeHash = doHash(cls)
+ abstract case class ThisType(private var myCls: ClassSymbol) extends CachedProxyType with SingletonType {
+ def cls(implicit ctx: Context): ClassSymbol =
+ try myCls.denot.symbol.asClass
+ catch {
+ case ex: StaleSymbol =>
+ def prevDenot(implicit ctx: Context) = myCls.denot
+ val prev = prevDenot(ctx.fresh.setPeriod(Period(myCls.defRunId, ctx.phaseId)))
+ myCls = prev.owner.info.member(prev.name).symbol.asClass
+ cls
+ }
+ override def underlying(implicit ctx: Context) =
+ try cls.classInfo.selfType
+ catch {
+ case ex: StaleSymbol =>
+ println(i"stale symbol when deref ${cls.id}")
+ throw ex
+ }
+ override def computeHash = doHash(myCls)
}
final class CachedThisType(cls: ClassSymbol) extends ThisType(cls)
// TODO: consider hash before constructing types?
object ThisType {
- def apply(cls: ClassSymbol)(implicit ctx: Context) =
+ def raw(cls: ClassSymbol)(implicit ctx: Context) =
unique(new CachedThisType(cls))
}
diff --git a/src/dotty/tools/dotc/core/pickling/UnPickler.scala b/src/dotty/tools/dotc/core/pickling/UnPickler.scala
index 2e21358e4..e82002c9f 100644
--- a/src/dotty/tools/dotc/core/pickling/UnPickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/UnPickler.scala
@@ -613,7 +613,7 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot:
case THIStpe =>
val cls = readSymbolRef().asClass
if (isRefinementClass(cls)) RefinedThis(refinementTypes(cls))
- else ThisType(cls)
+ else cls.thisType
case SINGLEtpe =>
val pre = readTypeRef()
val sym = readDisambiguatedSymbolRef(_.info.isParameterless)