Skip to content

Commit ed8e2ba

Browse files
committed
Dealias more types in resultType
Since we now recognize more false dependencies, we have to dealias the new dependencies accordingly.
1 parent 89b6860 commit ed8e2ba

File tree

1 file changed

+31
-26
lines changed

1 file changed

+31
-26
lines changed

src/dotty/tools/dotc/core/Types.scala

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2209,9 +2209,11 @@ object Types {
22092209
if (dependencyStatus == FalseDeps) { // dealias all false dependencies
22102210
val dealiasMap = new TypeMap {
22112211
def apply(tp: Type) = tp match {
2212-
case tp @ TypeRef(MethodParam(`thisMethodType`, _), name) => // follow type alias to avoid dependency
2213-
val TypeAlias(alias) = tp.info
2214-
apply(alias)
2212+
case tp @ TypeRef(pre, name) =>
2213+
tp.info match {
2214+
case TypeAlias(alias) if depStatus(pre) == TrueDeps => apply(alias)
2215+
case _ => mapOver(tp)
2216+
}
22152217
case _ =>
22162218
mapOver(tp)
22172219
}
@@ -2222,10 +2224,31 @@ object Types {
22222224

22232225
var myDependencyStatus: DependencyStatus = Unknown
22242226

2225-
private def combine(x: DependencyStatus, y: DependencyStatus): DependencyStatus = {
2226-
val status = (x & StatusMask) max (y & StatusMask)
2227-
val provisional = (x | y) & Provisional
2228-
(if (status == TrueDeps) status else status | provisional).toByte
2227+
private def depStatus(tp: Type)(implicit ctx: Context): DependencyStatus = {
2228+
def combine(x: DependencyStatus, y: DependencyStatus) = {
2229+
val status = (x & StatusMask) max (y & StatusMask)
2230+
val provisional = (x | y) & Provisional
2231+
(if (status == TrueDeps) status else status | provisional).toByte
2232+
}
2233+
val depStatusAcc = new TypeAccumulator[DependencyStatus] {
2234+
def apply(status: DependencyStatus, tp: Type) =
2235+
if (status == TrueDeps) status
2236+
else
2237+
tp match {
2238+
case MethodParam(`thisMethodType`, _) => TrueDeps
2239+
case tp: TypeRef =>
2240+
val status1 = foldOver(status, tp)
2241+
tp.info match { // follow type alias to avoid dependency
2242+
case TypeAlias(alias) if status1 == TrueDeps && status != TrueDeps =>
2243+
combine(apply(status, alias), FalseDeps)
2244+
case _ =>
2245+
status1
2246+
}
2247+
case tp: TypeVar if !tp.isInstantiated => combine(status, Provisional)
2248+
case _ => foldOver(status, tp)
2249+
}
2250+
}
2251+
depStatusAcc(NoDeps, tp)
22292252
}
22302253

22312254
/** The dependency status of this method. Some examples:
@@ -2239,25 +2262,7 @@ object Types {
22392262
private def dependencyStatus(implicit ctx: Context): DependencyStatus = {
22402263
if (myDependencyStatus != Unknown) myDependencyStatus
22412264
else {
2242-
val isDepAcc = new TypeAccumulator[DependencyStatus] {
2243-
def apply(status: DependencyStatus, tp: Type) =
2244-
if (status == TrueDeps) status
2245-
else
2246-
tp match {
2247-
case MethodParam(`thisMethodType`, _) => TrueDeps
2248-
case tp: TypeRef =>
2249-
val status1 = foldOver(status, tp)
2250-
tp.info match { // follow type alias to avoid dependency
2251-
case TypeAlias(alias) if status1 == TrueDeps && status != TrueDeps =>
2252-
combine(apply(status, alias), FalseDeps)
2253-
case _ =>
2254-
status1
2255-
}
2256-
case tp: TypeVar if !tp.isInstantiated => combine(status, Provisional)
2257-
case _ => foldOver(status, tp)
2258-
}
2259-
}
2260-
val result = isDepAcc(NoDeps, resType)
2265+
val result = depStatus(resType)
22612266
if ((result & Provisional) == 0) myDependencyStatus = result
22622267
(result & StatusMask).toByte
22632268
}

0 commit comments

Comments
 (0)