Skip to content

Commit e04f4ea

Browse files
committed
Sema: Use ExportedLevel for ExportContext services
1 parent 60731d9 commit e04f4ea

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ ExportContext::ExportContext(DeclContext *DC,
8686
AvailabilityContext availability,
8787
FragileFunctionKind kind,
8888
llvm::SmallVectorImpl<UnsafeUse> *unsafeUses,
89-
bool spi, bool exported,
89+
bool spi, ExportedLevel exported,
9090
bool implicit)
9191
: DC(DC), Availability(availability), FragileKind(kind),
9292
UnsafeUses(unsafeUses) {
9393
SPI = spi;
94-
Exported = exported;
94+
Exported = unsigned(exported);
9595
Implicit = implicit;
9696
Reason = unsigned(ExportabilityReason::General);
9797
}
@@ -178,7 +178,7 @@ ExportContext ExportContext::forDeclSignature(Decl *D) {
178178
computeExportContextBits(Ctx, D, &spi, &implicit);
179179
});
180180

181-
bool exported = ::isExported(D) != ExportedLevel::None;
181+
ExportedLevel exported = ::isExported(D);
182182

183183
return ExportContext(DC, availabilityContext, fragileKind, nullptr,
184184
spi, exported, implicit);
@@ -194,7 +194,7 @@ ExportContext ExportContext::forFunctionBody(DeclContext *DC, SourceLoc loc) {
194194
forEachOuterDecl(
195195
DC, [&](Decl *D) { computeExportContextBits(Ctx, D, &spi, &implicit); });
196196

197-
bool exported = false;
197+
ExportedLevel exported = ExportedLevel::None;
198198

199199
return ExportContext(DC, availabilityContext, fragileKind, nullptr,
200200
spi, exported, implicit);
@@ -205,8 +205,9 @@ ExportContext ExportContext::forConformance(DeclContext *DC,
205205
assert(isa<ExtensionDecl>(DC) || isa<NominalTypeDecl>(DC));
206206
auto where = forDeclSignature(DC->getInnermostDeclarationDeclContext());
207207

208-
where.Exported &= proto->getFormalAccessScope(
209-
DC, /*usableFromInlineAsPublic*/true).isPublic();
208+
if (!proto->getFormalAccessScope(
209+
DC, /*usableFromInlineAsPublic*/true).isPublic())
210+
where.Exported = unsigned(ExportedLevel::None);
210211

211212
return where;
212213
}
@@ -219,7 +220,7 @@ ExportContext ExportContext::withReason(ExportabilityReason reason) const {
219220

220221
ExportContext ExportContext::withExported(bool exported) const {
221222
auto copy = *this;
222-
copy.Exported = isExported() && exported;
223+
copy.Exported = exported ? Exported : unsigned(ExportedLevel::None);
223224
return copy;
224225
}
225226

lib/Sema/TypeCheckAvailability.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "swift/AST/AvailabilityConstraint.h"
1818
#include "swift/AST/AvailabilityContext.h"
1919
#include "swift/AST/DeclContext.h"
20+
#include "swift/AST/DeclExportabilityVisitor.h"
2021
#include "swift/AST/Identifier.h"
2122
#include "swift/Basic/LLVM.h"
2223
#include "swift/Basic/OptionSet.h"
@@ -115,14 +116,14 @@ class ExportContext {
115116
FragileFunctionKind FragileKind;
116117
llvm::SmallVectorImpl<UnsafeUse> *UnsafeUses;
117118
unsigned SPI : 1;
118-
unsigned Exported : 1;
119+
unsigned Exported : 2;
119120
unsigned Implicit : 1;
120121
unsigned Reason : 3;
121122

122123
ExportContext(DeclContext *DC, AvailabilityContext availability,
123124
FragileFunctionKind kind,
124125
llvm::SmallVectorImpl<UnsafeUse> *unsafeUses,
125-
bool spi, bool exported, bool implicit);
126+
bool spi, ExportedLevel exported, bool implicit);
126127

127128
public:
128129

@@ -184,9 +185,12 @@ class ExportContext {
184185
/// If true, the context is SPI and can reference SPI declarations.
185186
bool isSPI() const { return SPI; }
186187

187-
/// If true, the context is exported and cannot reference SPI declarations
188-
/// or declarations from `@_implementationOnly` imports.
189-
bool isExported() const { return Exported; }
188+
/// If true, the context is exported explicitly and cannot reference
189+
/// restricted decls.
190+
bool isExported() const { return Exported != unsigned(ExportedLevel::None); }
191+
192+
/// Get the export level of the context.
193+
ExportedLevel getExportedLevel() const { return ExportedLevel(Exported); }
190194

191195
/// If true, the context can only reference exported declarations, either
192196
/// because it is the signature context of an exported declaration, or

0 commit comments

Comments
 (0)