@@ -2331,7 +2331,7 @@ object Types {
2331
2331
def apply (tp : Type ) = tp match {
2332
2332
case tp @ TypeRef (pre, name) =>
2333
2333
tp.info match {
2334
- case TypeAlias (alias) if depStatus(pre) == TrueDeps => apply(alias)
2334
+ case TypeAlias (alias) if depStatus(NoDeps , pre) == TrueDeps => apply(alias)
2335
2335
case _ => mapOver(tp)
2336
2336
}
2337
2337
case _ =>
@@ -2343,8 +2343,9 @@ object Types {
2343
2343
else resType
2344
2344
2345
2345
var myDependencyStatus : DependencyStatus = Unknown
2346
+ var myParamDependencyStatus : DependencyStatus = Unknown
2346
2347
2347
- private def depStatus (tp : Type )(implicit ctx : Context ): DependencyStatus = {
2348
+ private def depStatus (initial : DependencyStatus , tp : Type )(implicit ctx : Context ): DependencyStatus = {
2348
2349
def combine (x : DependencyStatus , y : DependencyStatus ) = {
2349
2350
val status = (x & StatusMask ) max (y & StatusMask )
2350
2351
val provisional = (x | y) & Provisional
@@ -2368,7 +2369,7 @@ object Types {
2368
2369
case _ => foldOver(status, tp)
2369
2370
}
2370
2371
}
2371
- depStatusAcc(NoDeps , tp)
2372
+ depStatusAcc(initial , tp)
2372
2373
}
2373
2374
2374
2375
/** The dependency status of this method. Some examples:
@@ -2382,17 +2383,36 @@ object Types {
2382
2383
private def dependencyStatus (implicit ctx : Context ): DependencyStatus = {
2383
2384
if (myDependencyStatus != Unknown ) myDependencyStatus
2384
2385
else {
2385
- val result = depStatus(resType)
2386
+ val result = depStatus(NoDeps , resType)
2386
2387
if ((result & Provisional ) == 0 ) myDependencyStatus = result
2387
2388
(result & StatusMask ).toByte
2388
2389
}
2389
2390
}
2390
2391
2392
+ /** The parameter dependency status of this method. Analogous to `dependencyStatus`,
2393
+ * but tracking dependencies in same parameter list.
2394
+ */
2395
+ private def paramDependencyStatus (implicit ctx : Context ): DependencyStatus = {
2396
+ if (myParamDependencyStatus != Unknown ) myParamDependencyStatus
2397
+ else {
2398
+ val result =
2399
+ if (paramTypes.isEmpty) NoDeps
2400
+ else (NoDeps /: paramTypes.tail)(depStatus(_, _))
2401
+ if ((result & Provisional ) == 0 ) myParamDependencyStatus = result
2402
+ (result & StatusMask ).toByte
2403
+ }
2404
+ }
2405
+
2391
2406
/** Does result type contain references to parameters of this method type,
2392
2407
* which cannot be eliminated by de-aliasing?
2393
2408
*/
2394
2409
def isDependent (implicit ctx : Context ): Boolean = dependencyStatus == TrueDeps
2395
2410
2411
+ /** Does one of the parameter types contain references to earlier parameters
2412
+ * of this method type which cannot be eliminated by de-aliasing?
2413
+ */
2414
+ def isParamDependent (implicit ctx : Context ): Boolean = paramDependencyStatus == TrueDeps
2415
+
2396
2416
protected def computeSignature (implicit ctx : Context ): Signature =
2397
2417
resultSignature.prepend(paramTypes, isJava)
2398
2418
0 commit comments