22
22
#include " swift/AST/AvailabilityRange.h"
23
23
#include " swift/AST/PlatformKind.h"
24
24
#include " swift/Basic/LLVM.h"
25
+ #include " swift/Basic/OptionSet.h"
25
26
26
27
namespace swift {
27
28
@@ -33,6 +34,10 @@ class Decl;
33
34
// / certain context.
34
35
class AvailabilityConstraint {
35
36
public:
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.
36
41
enum class Reason {
37
42
// / The declaration is referenced in a context in which it is generally
38
43
// / unavailable. For example, a reference to a declaration that is
@@ -133,44 +138,50 @@ class AvailabilityConstraint {
133
138
// / Returns the required range for `IntroducedInNewerVersion` requirements, or
134
139
// / `std::nullopt` otherwise.
135
140
std::optional<AvailabilityRange>
136
- getRequiredNewerAvailabilityRange (ASTContext &ctx) const ;
141
+ getRequiredNewerAvailabilityRange (const ASTContext &ctx) const ;
137
142
138
143
// / Some availability constraints are active for type-checking but cannot
139
144
// / be translated directly into an `if #available(...)` runtime query.
140
- bool isActiveForRuntimeQueries (ASTContext &ctx) const ;
145
+ bool isActiveForRuntimeQueries (const ASTContext &ctx) const ;
141
146
};
142
147
143
148
// / 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.
145
152
class DeclAvailabilityConstraints {
146
153
using Storage = llvm::SmallVector<AvailabilityConstraint, 4 >;
147
154
Storage constraints;
148
155
149
156
public:
150
157
DeclAvailabilityConstraints () {}
158
+ DeclAvailabilityConstraints (const Storage &&constraints)
159
+ : constraints(constraints) {}
151
160
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 ;
155
163
156
164
using const_iterator = Storage::const_iterator;
157
165
const_iterator begin () const { return constraints.begin (); }
158
166
const_iterator end () const { return constraints.end (); }
159
167
};
160
168
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>;
167
178
168
179
// / Returns the set of availability constraints that restrict use of \p decl
169
180
// / when it is referenced from the given context. In other words, it is the
170
181
// / 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 );
174
185
} // end namespace swift
175
186
176
187
#endif
0 commit comments