2222#include " swift/AST/AvailabilityRange.h"
2323#include " swift/AST/PlatformKind.h"
2424#include " swift/Basic/LLVM.h"
25+ #include " swift/Basic/OptionSet.h"
2526
2627namespace swift {
2728
@@ -33,6 +34,10 @@ class Decl;
3334// / certain context.
3435class AvailabilityConstraint {
3536public:
37+ // / The reason that the availability constraint is unsatisfied.
38+ // /
39+ // / NOTE: The order of this enum matters. Reasons are defined in descending
40+ // / priority order.
3641 enum class Reason {
3742 // / The declaration is referenced in a context in which it is generally
3843 // / unavailable. For example, a reference to a declaration that is
@@ -133,44 +138,50 @@ class AvailabilityConstraint {
133138 // / Returns the required range for `IntroducedInNewerVersion` requirements, or
134139 // / `std::nullopt` otherwise.
135140 std::optional<AvailabilityRange>
136- getRequiredNewerAvailabilityRange (ASTContext &ctx) const ;
141+ getRequiredNewerAvailabilityRange (const ASTContext &ctx) const ;
137142
138143 // / Some availability constraints are active for type-checking but cannot
139144 // / be translated directly into an `if #available(...)` runtime query.
140- bool isActiveForRuntimeQueries (ASTContext &ctx) const ;
145+ bool isActiveForRuntimeQueries (const ASTContext &ctx) const ;
141146};
142147
143148// / Represents a set of availability constraints that restrict use of a
144- // / declaration in a particular context.
149+ // / declaration in a particular context. There can only be one active constraint
150+ // / for a given `AvailabilityDomain`, but there may be multiple active
151+ // / constraints from separate domains.
145152class DeclAvailabilityConstraints {
146153 using Storage = llvm::SmallVector<AvailabilityConstraint, 4 >;
147154 Storage constraints;
148155
149156public:
150157 DeclAvailabilityConstraints () {}
158+ DeclAvailabilityConstraints (const Storage &&constraints)
159+ : constraints(constraints) {}
151160
152- void addConstraint (const AvailabilityConstraint &constraint) {
153- constraints.emplace_back (constraint);
154- }
161+ // / Returns the strongest availability constraint or `std::nullopt` if empty.
162+ std::optional<AvailabilityConstraint> getPrimaryConstraint () const ;
155163
156164 using const_iterator = Storage::const_iterator;
157165 const_iterator begin () const { return constraints.begin (); }
158166 const_iterator end () const { return constraints.end (); }
159167};
160168
161- // / Returns the `AvailabilityConstraint` that describes how \p attr restricts
162- // / use of \p decl in \p context or `std::nullopt` if there is no restriction.
163- std::optional<AvailabilityConstraint>
164- getAvailabilityConstraintForAttr (const Decl *decl,
165- const SemanticAvailableAttr &attr,
166- const AvailabilityContext &context);
169+ enum class AvailabilityConstraintFlag : uint8_t {
170+ // / By default, the availability constraints for the members of extensions
171+ // / include the constraints for `@available` attributes that were written on
172+ // / the enclosing extension, since these members can be referred to without
173+ // / referencing the extension. When this flag is specified, though, only the
174+ // / attributes directly attached to the declaration are considered.
175+ SkipEnclosingExtension = 1 << 0 ,
176+ };
177+ using AvailabilityConstraintFlags = OptionSet<AvailabilityConstraintFlag>;
167178
168179// / Returns the set of availability constraints that restrict use of \p decl
169180// / when it is referenced from the given context. In other words, it is the
170181// / collection of of `@available` attributes with unsatisfied conditions.
171- DeclAvailabilityConstraints
172- getAvailabilityConstraintsForDecl ( const Decl *decl,
173- const AvailabilityContext &context );
182+ DeclAvailabilityConstraints getAvailabilityConstraintsForDecl (
183+ const Decl *decl, const AvailabilityContext &context ,
184+ AvailabilityConstraintFlags flags = std:: nullopt );
174185} // end namespace swift
175186
176187#endif
0 commit comments