@@ -2209,9 +2209,11 @@ object Types {
2209
2209
if (dependencyStatus == FalseDeps ) { // dealias all false dependencies
2210
2210
val dealiasMap = new TypeMap {
2211
2211
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
+ }
2215
2217
case _ =>
2216
2218
mapOver(tp)
2217
2219
}
@@ -2222,10 +2224,31 @@ object Types {
2222
2224
2223
2225
var myDependencyStatus : DependencyStatus = Unknown
2224
2226
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)
2229
2252
}
2230
2253
2231
2254
/** The dependency status of this method. Some examples:
@@ -2239,25 +2262,7 @@ object Types {
2239
2262
private def dependencyStatus (implicit ctx : Context ): DependencyStatus = {
2240
2263
if (myDependencyStatus != Unknown ) myDependencyStatus
2241
2264
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)
2261
2266
if ((result & Provisional ) == 0 ) myDependencyStatus = result
2262
2267
(result & StatusMask ).toByte
2263
2268
}
0 commit comments