diff options
Diffstat (limited to 'src/dotty/tools/dotc')
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index c4f07fb8c..5ddcb62c8 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -1940,7 +1940,13 @@ object Types { } else resType - private[this] var myDependencyStatus: DependencyStatus = Unknown + var myDependencyStatus: DependencyStatus = Unknown + + private def combine(x: DependencyStatus, y: DependencyStatus): DependencyStatus = { + val status = (x & StatusMask) max (y & StatusMask) + val provisional = (x | y) & Provisional + (if (status == TrueDeps) status else status | provisional).toByte + } /** The dependency status of this method. Some examples: * @@ -1951,26 +1957,27 @@ object Types { * // dependency can be eliminated by dealiasing. */ private def dependencyStatus(implicit ctx: Context): DependencyStatus = { - if (myDependencyStatus == Unknown) { + if (myDependencyStatus != Unknown) myDependencyStatus + else { val isDepAcc = new TypeAccumulator[DependencyStatus] { def apply(x: DependencyStatus, tp: Type) = if (x == TrueDeps) x - else x max { + else tp match { case MethodParam(`thisMethodType`, _) => TrueDeps case tp @ TypeRef(MethodParam(`thisMethodType`, _), name) => tp.info match { // follow type alias to avoid dependency - case TypeAlias(alias) => apply(x, alias) max FalseDeps + case TypeAlias(alias) => combine(apply(x, alias), FalseDeps) case _ => TrueDeps } - case _ => - foldOver(x, tp) + case tp: TypeVar if !tp.isInstantiated => combine(x, Provisional) + case _ => foldOver(x, tp) } - } } - myDependencyStatus = isDepAcc(NoDeps, resType) + val result = isDepAcc(NoDeps, resType) + if ((result & Provisional) == 0) myDependencyStatus = result + (result & StatusMask).toByte } - myDependencyStatus } /** Does result type contain references to parameters of this method type, @@ -2062,6 +2069,8 @@ object Types { private final val NoDeps: DependencyStatus = 1 // no dependent parameters found private final val FalseDeps: DependencyStatus = 2 // all dependent parameters are prefixes of non-depended alias types private final val TrueDeps: DependencyStatus = 3 // some truly dependent parameters exist + private final val StatusMask: DependencyStatus = 3 // the bits indicating actual dependency status + private final val Provisional: DependencyStatus = 4 // set if dependency status can still change due to type variable instantiations } object JavaMethodType extends MethodTypeCompanion { |