Skip to content

Commit 8cb2f10

Browse files
authored
Merge pull request #77014 from tshortli/context-free-availability
2 parents e767d7e + 7819dd7 commit 8cb2f10

19 files changed

+56
-76
lines changed

include/swift/AST/Availability.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -342,17 +342,16 @@ class AvailabilityInference {
342342
/// to ToDecl.
343343
static void
344344
applyInferredAvailableAttrs(Decl *ToDecl,
345-
ArrayRef<const Decl *> InferredFromDecls,
346-
ASTContext &Context);
345+
ArrayRef<const Decl *> InferredFromDecls);
347346

348347
static AvailabilityRange inferForType(Type t);
349348

350349
/// Returns the context where a declaration is available
351350
/// We assume a declaration without an annotation is always available.
352-
static AvailabilityRange availableRange(const Decl *D, ASTContext &C);
351+
static AvailabilityRange availableRange(const Decl *D);
353352

354353
/// Returns true is the declaration is `@_spi_available`.
355-
static bool isAvailableAsSPI(const Decl *D, ASTContext &C);
354+
static bool isAvailableAsSPI(const Decl *D);
356355

357356
/// Returns the availability context for a declaration with the given
358357
/// @available attribute.
@@ -363,14 +362,13 @@ class AvailabilityInference {
363362

364363
/// Returns the attribute that should be used to determine the availability
365364
/// range of the given declaration, or nullptr if there is none.
366-
static const AvailableAttr *attrForAnnotatedAvailableRange(const Decl *D,
367-
ASTContext &Ctx);
365+
static const AvailableAttr *attrForAnnotatedAvailableRange(const Decl *D);
368366

369367
/// Returns the context for which the declaration
370368
/// is annotated as available, or None if the declaration
371369
/// has no availability annotation.
372370
static std::optional<AvailabilityRange>
373-
annotatedAvailableRange(const Decl *D, ASTContext &C);
371+
annotatedAvailableRange(const Decl *D);
374372

375373
static AvailabilityRange
376374
annotatedAvailableRangeForAttr(const SpecializeAttr *attr, ASTContext &ctx);

lib/AST/Availability.cpp

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ static AvailableAttr *createAvailableAttr(PlatformKind Platform,
135135
}
136136

137137
void AvailabilityInference::applyInferredAvailableAttrs(
138-
Decl *ToDecl, ArrayRef<const Decl *> InferredFromDecls,
139-
ASTContext &Context) {
138+
Decl *ToDecl, ArrayRef<const Decl *> InferredFromDecls) {
139+
auto &Context = ToDecl->getASTContext();
140140

141141
// Let the new AvailabilityAttr inherit the message and rename.
142142
// The first encountered message / rename will win; this matches the
@@ -370,8 +370,8 @@ bool AvailabilityInference::updateBeforePlatformForFallback(
370370
}
371371

372372
const AvailableAttr *
373-
AvailabilityInference::attrForAnnotatedAvailableRange(const Decl *D,
374-
ASTContext &Ctx) {
373+
AvailabilityInference::attrForAnnotatedAvailableRange(const Decl *D) {
374+
ASTContext &Ctx = D->getASTContext();
375375
const AvailableAttr *bestAvailAttr = nullptr;
376376

377377
D = abstractSyntaxDeclForAvailableAttribute(D);
@@ -395,8 +395,7 @@ AvailabilityInference::attrForAnnotatedAvailableRange(const Decl *D,
395395
std::optional<AvailableAttrDeclPair>
396396
SemanticAvailableRangeAttrRequest::evaluate(Evaluator &evaluator,
397397
const Decl *decl) const {
398-
if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange(
399-
decl, decl->getASTContext()))
398+
if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange(decl))
400399
return std::make_pair(attr, decl);
401400

402401
if (auto *parent =
@@ -414,16 +413,16 @@ Decl::getSemanticAvailableRangeAttr() const {
414413
}
415414

416415
std::optional<AvailabilityRange>
417-
AvailabilityInference::annotatedAvailableRange(const Decl *D, ASTContext &Ctx) {
418-
auto bestAvailAttr = attrForAnnotatedAvailableRange(D, Ctx);
416+
AvailabilityInference::annotatedAvailableRange(const Decl *D) {
417+
auto bestAvailAttr = attrForAnnotatedAvailableRange(D);
419418
if (!bestAvailAttr)
420419
return std::nullopt;
421420

422-
return availableRange(bestAvailAttr, Ctx);
421+
return availableRange(bestAvailAttr, D->getASTContext());
423422
}
424423

425424
bool Decl::isAvailableAsSPI() const {
426-
return AvailabilityInference::isAvailableAsSPI(this, getASTContext());
425+
return AvailabilityInference::isAvailableAsSPI(this);
427426
}
428427

429428
std::optional<AvailableAttrDeclPair>
@@ -540,9 +539,8 @@ AvailabilityRange AvailabilityInference::annotatedAvailableRangeForAttr(
540539
return AvailabilityRange::alwaysAvailable();
541540
}
542541

543-
static const AvailableAttr *attrForAvailableRange(const Decl *D,
544-
ASTContext &Ctx) {
545-
if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange(D, Ctx))
542+
static const AvailableAttr *attrForAvailableRange(const Decl *D) {
543+
if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange(D))
546544
return attr;
547545

548546
// Unlike other declarations, extensions can be used without referring to them
@@ -555,25 +553,23 @@ static const AvailableAttr *attrForAvailableRange(const Decl *D,
555553

556554
DeclContext *DC = D->getDeclContext();
557555
if (auto *ED = dyn_cast<ExtensionDecl>(DC)) {
558-
if (auto attr =
559-
AvailabilityInference::attrForAnnotatedAvailableRange(ED, Ctx))
556+
if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange(ED))
560557
return attr;
561558
}
562559

563560
return nullptr;
564561
}
565562

566-
AvailabilityRange AvailabilityInference::availableRange(const Decl *D,
567-
ASTContext &Ctx) {
568-
if (auto attr = attrForAvailableRange(D, Ctx))
569-
return availableRange(attr, Ctx);
563+
AvailabilityRange AvailabilityInference::availableRange(const Decl *D) {
564+
if (auto attr = attrForAvailableRange(D))
565+
return availableRange(attr, D->getASTContext());
570566

571567
// Treat unannotated declarations as always available.
572568
return AvailabilityRange::alwaysAvailable();
573569
}
574570

575-
bool AvailabilityInference::isAvailableAsSPI(const Decl *D, ASTContext &Ctx) {
576-
if (auto attr = attrForAvailableRange(D, Ctx))
571+
bool AvailabilityInference::isAvailableAsSPI(const Decl *D) {
572+
if (auto attr = attrForAvailableRange(D))
577573
return attr->IsSPI;
578574

579575
return false;
@@ -598,15 +594,12 @@ namespace {
598594
/// Infers the availability required to access a type.
599595
class AvailabilityInferenceTypeWalker : public TypeWalker {
600596
public:
601-
ASTContext &AC;
602597
AvailabilityRange AvailabilityInfo = AvailabilityRange::alwaysAvailable();
603598

604-
AvailabilityInferenceTypeWalker(ASTContext &AC) : AC(AC) {}
605-
606599
Action walkToTypePre(Type ty) override {
607600
if (auto *nominalDecl = ty->getAnyNominal()) {
608601
AvailabilityInfo.intersectWith(
609-
AvailabilityInference::availableRange(nominalDecl, AC));
602+
AvailabilityInference::availableRange(nominalDecl));
610603
}
611604

612605
return Action::Continue;
@@ -615,7 +608,7 @@ class AvailabilityInferenceTypeWalker : public TypeWalker {
615608
} // end anonymous namespace
616609

617610
AvailabilityRange AvailabilityInference::inferForType(Type t) {
618-
AvailabilityInferenceTypeWalker walker(t->getASTContext());
611+
AvailabilityInferenceTypeWalker walker;
619612
t.walk(walker);
620613
return walker.AvailabilityInfo;
621614
}

lib/AST/Decl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,8 +1254,7 @@ AvailabilityRange Decl::getAvailabilityForLinkage() const {
12541254
if (auto backDeployVersion = getBackDeployedBeforeOSVersion(ctx))
12551255
return AvailabilityRange{VersionRange::allGTE(*backDeployVersion)};
12561256

1257-
auto containingContext =
1258-
AvailabilityInference::annotatedAvailableRange(this, getASTContext());
1257+
auto containingContext = AvailabilityInference::annotatedAvailableRange(this);
12591258
if (containingContext.has_value()) {
12601259
// If this entity comes from the concurrency module, adjust its
12611260
// availability for linkage purposes up to Swift 5.5, so that we use

lib/AST/DeclContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1540,7 +1540,7 @@ bool DeclContext::isAlwaysAvailableConformanceContext() const {
15401540
auto &ctx = getASTContext();
15411541

15421542
AvailabilityRange conformanceAvailability{
1543-
AvailabilityInference::availableRange(ext, ctx)};
1543+
AvailabilityInference::availableRange(ext)};
15441544

15451545
auto deploymentTarget = AvailabilityRange::forDeploymentTarget(ctx);
15461546

lib/AST/TypeRefinementContext.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,10 +364,8 @@ TypeRefinementContext::getExplicitAvailabilityRange() const {
364364

365365
case Reason::Decl: {
366366
auto decl = Node.getAsDecl();
367-
auto &ctx = decl->getASTContext();
368-
if (auto attr =
369-
AvailabilityInference::attrForAnnotatedAvailableRange(decl, ctx))
370-
return AvailabilityInference::availableRange(attr, ctx);
367+
if (auto attr = AvailabilityInference::attrForAnnotatedAvailableRange(decl))
368+
return AvailabilityInference::availableRange(attr, decl->getASTContext());
371369

372370
return std::nullopt;
373371
}

lib/ClangImporter/ImportDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ static void inferProtocolMemberAvailability(ClangImporter::Implementation &impl,
575575

576576
const Decl *innermostDecl = dc->getInnermostDeclarationDeclContext();
577577
AvailabilityRange containingDeclRange =
578-
AvailabilityInference::availableRange(innermostDecl, C);
578+
AvailabilityInference::availableRange(innermostDecl);
579579

580580
requiredRange.intersectWith(containingDeclRange);
581581

@@ -6811,7 +6811,7 @@ bool SwiftDeclConverter::existingConstructorIsWorse(
68116811
// other?
68126812
llvm::VersionTuple introduced = findLatestIntroduction(objcMethod);
68136813
AvailabilityRange existingAvailability =
6814-
AvailabilityInference::availableRange(existingCtor, Impl.SwiftContext);
6814+
AvailabilityInference::availableRange(existingCtor);
68156815
assert(!existingAvailability.isKnownUnreachable());
68166816

68176817
if (existingAvailability.isAlwaysAvailable()) {
@@ -9119,7 +9119,7 @@ ClangImporter::Implementation::importMirroredDecl(const clang::NamedDecl *decl,
91199119
if (proto->getAttrs().hasAttribute<AvailableAttr>()) {
91209120
if (!result->getAttrs().hasAttribute<AvailableAttr>()) {
91219121
AvailabilityRange protoRange =
9122-
AvailabilityInference::availableRange(proto, SwiftContext);
9122+
AvailabilityInference::availableRange(proto);
91239123
applyAvailableAttribute(result, protoRange, SwiftContext);
91249124
}
91259125
} else {

lib/SILGen/SILGenConcurrency.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ static bool isCheckExpectedExecutorIntrinsicAvailable(SILGenModule &SGM) {
710710
if (!C.LangOpts.DisableAvailabilityChecking) {
711711
auto deploymentAvailability = AvailabilityRange::forDeploymentTarget(C);
712712
auto declAvailability =
713-
AvailabilityInference::availableRange(checkExecutor, C);
713+
AvailabilityInference::availableRange(checkExecutor);
714714
return deploymentAvailability.isContainedIn(declAvailability);
715715
}
716716

lib/Sema/AssociatedTypeInference.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,15 @@ static void recordTypeWitness(NormalProtocolConformance *conformance,
336336
// Only constrain the availability of the typealias by the availability of
337337
// the associated type if the associated type is less available than its
338338
// protocol. This is required for source compatibility.
339-
auto protoAvailability = AvailabilityInference::availableRange(proto, ctx);
339+
auto protoAvailability = AvailabilityInference::availableRange(proto);
340340
auto assocTypeAvailability =
341-
AvailabilityInference::availableRange(assocType, ctx);
341+
AvailabilityInference::availableRange(assocType);
342342
if (protoAvailability.isSupersetOf(assocTypeAvailability)) {
343343
availabilitySources.push_back(assocType);
344344
}
345345

346-
AvailabilityInference::applyInferredAvailableAttrs(
347-
aliasDecl, availabilitySources, ctx);
346+
AvailabilityInference::applyInferredAvailableAttrs(aliasDecl,
347+
availabilitySources);
348348

349349
if (nominal == dc) {
350350
nominal->addMember(aliasDecl);

lib/Sema/CodeSynthesis.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,8 +626,7 @@ configureInheritedDesignatedInitAttributes(ClassDecl *classDecl,
626626
if (auto *parentDecl = classDecl->getInnermostDeclWithAvailability()) {
627627
asAvailableAs.push_back(parentDecl);
628628
}
629-
AvailabilityInference::applyInferredAvailableAttrs(
630-
ctor, asAvailableAs, ctx);
629+
AvailabilityInference::applyInferredAvailableAttrs(ctor, asAvailableAs);
631630
}
632631

633632
// Wire up the overrides.

lib/Sema/DerivedConformanceActor.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,7 @@ static ValueDecl *deriveActor_unownedExecutor(DerivedConformance &derived) {
160160
if (auto enclosingDecl = property->getInnermostDeclWithAvailability())
161161
asAvailableAs.push_back(enclosingDecl);
162162

163-
AvailabilityInference::applyInferredAvailableAttrs(
164-
property, asAvailableAs, ctx);
163+
AvailabilityInference::applyInferredAvailableAttrs(property, asAvailableAs);
165164

166165
auto getter = derived.addGetterToReadOnlyDerivedProperty(property);
167166
getter->setBodySynthesizer(deriveBodyActor_unownedExecutor);

0 commit comments

Comments
 (0)