@@ -1411,9 +1411,9 @@ evaluator::SideEffect ExpandChildTypeRefinementContextsRequest::evaluate(
1411
1411
return evaluator::SideEffect ();
1412
1412
}
1413
1413
1414
- AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation (
1415
- SourceLoc loc, const DeclContext *DC,
1416
- const TypeRefinementContext **MostRefined) {
1414
+ AvailabilityContext
1415
+ TypeChecker::availabilityAtLocation ( SourceLoc loc, const DeclContext *DC,
1416
+ const TypeRefinementContext **MostRefined) {
1417
1417
SourceFile *SF;
1418
1418
if (loc.isValid ())
1419
1419
SF = DC->getParentModule ()->getSourceFileContainingLocation (loc);
@@ -1436,7 +1436,7 @@ AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation(
1436
1436
// this will be a real problem.
1437
1437
1438
1438
// We can assume we are running on at least the minimum inlining target.
1439
- auto OverApproximateContext = AvailabilityRange::forInliningTarget (Context);
1439
+ auto baseAvailability = AvailabilityContext::getDefault (Context);
1440
1440
auto isInvalidLoc = [SF](SourceLoc loc) {
1441
1441
return SF ? loc.isInvalid () : true ;
1442
1442
};
@@ -1445,34 +1445,35 @@ AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation(
1445
1445
if (!D)
1446
1446
break ;
1447
1447
1448
+ baseAvailability.constrainWithDecl (D);
1448
1449
loc = D->getLoc ();
1450
+ DC = D->getDeclContext ();
1451
+ }
1449
1452
1450
- std::optional<AvailabilityRange> Info =
1451
- AvailabilityInference::annotatedAvailableRange (D) ;
1453
+ if (!SF || loc. isInvalid ())
1454
+ return baseAvailability ;
1452
1455
1453
- if (Info. has_value ()) {
1454
- OverApproximateContext. constrainWith (Info. value ());
1455
- }
1456
+ TypeRefinementContext *rootTRC = getOrBuildTypeRefinementContext (SF);
1457
+ if (!rootTRC)
1458
+ return baseAvailability;
1456
1459
1457
- DC = D->getDeclContext ();
1458
- }
1460
+ TypeRefinementContext *TRC = rootTRC->findMostRefinedSubContext (loc, Context);
1461
+ if (!TRC)
1462
+ return baseAvailability;
1459
1463
1460
- if (SF && loc.isValid ()) {
1461
- TypeRefinementContext *rootTRC = getOrBuildTypeRefinementContext (SF);
1462
- if (rootTRC) {
1463
- TypeRefinementContext *TRC =
1464
- rootTRC->findMostRefinedSubContext (loc, Context);
1465
- if (TRC) {
1466
- OverApproximateContext.constrainWith (
1467
- TRC->getPlatformAvailabilityRange ());
1468
- if (MostRefined) {
1469
- *MostRefined = TRC;
1470
- }
1471
- }
1472
- }
1464
+ if (MostRefined) {
1465
+ *MostRefined = TRC;
1473
1466
}
1474
1467
1475
- return OverApproximateContext;
1468
+ auto availability = TRC->getAvailabilityContext ();
1469
+ availability.constrainWithContext (baseAvailability, Context);
1470
+ return availability;
1471
+ }
1472
+
1473
+ AvailabilityRange TypeChecker::overApproximateAvailabilityAtLocation (
1474
+ SourceLoc loc, const DeclContext *DC,
1475
+ const TypeRefinementContext **MostRefined) {
1476
+ return availabilityAtLocation (loc, DC, MostRefined).getPlatformRange ();
1476
1477
}
1477
1478
1478
1479
bool TypeChecker::isDeclarationUnavailable (
0 commit comments