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