Skip to content

Commit de2b75c

Browse files
authored
Merge pull request swiftlang#22370 from DougGregor/lazy-known-protocol-kind
[AST] Lazily compute ProtocolDecl::getKnownProtocolKind()
2 parents cffe92c + d19d2f2 commit de2b75c

File tree

6 files changed

+27
-42
lines changed

6 files changed

+27
-42
lines changed

include/swift/AST/ASTContext.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -805,9 +805,6 @@ class ASTContext final {
805805
InheritedProtocolConformance *
806806
getInheritedConformance(Type type, ProtocolConformance *inherited);
807807

808-
/// Record compiler-known protocol information in the AST.
809-
void recordKnownProtocols(ModuleDecl *Stdlib);
810-
811808
/// Get the lazy data for the given declaration.
812809
///
813810
/// \param lazyLoader If non-null, the lazy loader to use when creating the

include/swift/AST/Decl.h

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4053,14 +4053,20 @@ class ProtocolDecl final : public NominalTypeDecl {
40534053
Bits.ProtocolDecl.ExistentialTypeSupportedValid = true;
40544054
}
40554055

4056+
private:
4057+
void computeKnownProtocolKind() const;
4058+
4059+
public:
40564060
/// If this is known to be a compiler-known protocol, returns the kind.
40574061
/// Otherwise returns None.
4058-
///
4059-
/// Note that this is only valid after type-checking.
40604062
Optional<KnownProtocolKind> getKnownProtocolKind() const {
40614063
if (Bits.ProtocolDecl.KnownProtocol == 0)
4064+
computeKnownProtocolKind();
4065+
4066+
if (Bits.ProtocolDecl.KnownProtocol == 1)
40624067
return None;
4063-
return static_cast<KnownProtocolKind>(Bits.ProtocolDecl.KnownProtocol - 1);
4068+
4069+
return static_cast<KnownProtocolKind>(Bits.ProtocolDecl.KnownProtocol - 2);
40644070
}
40654071

40664072
/// Check whether this protocol is of a specific, known protocol kind.
@@ -4071,15 +4077,6 @@ class ProtocolDecl final : public NominalTypeDecl {
40714077
return false;
40724078
}
40734079

4074-
/// Records that this is a compiler-known protocol.
4075-
void setKnownProtocolKind(KnownProtocolKind kind) {
4076-
assert((!getKnownProtocolKind() || *getKnownProtocolKind() == kind) &&
4077-
"can't reset known protocol kind");
4078-
Bits.ProtocolDecl.KnownProtocol = static_cast<unsigned>(kind) + 1;
4079-
assert(getKnownProtocolKind() && *getKnownProtocolKind() == kind &&
4080-
"not enough bits");
4081-
}
4082-
40834080
/// Retrieve the status of circularity checking for protocol inheritance.
40844081
CircularityCheck getCircularityCheck() const {
40854082
return static_cast<CircularityCheck>(Bits.ProtocolDecl.Circularity);

lib/AST/ASTContext.cpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,23 +1472,6 @@ ClangModuleLoader *ASTContext::getClangModuleLoader() const {
14721472
return getImpl().TheClangModuleLoader;
14731473
}
14741474

1475-
static void recordKnownProtocol(ModuleDecl *Stdlib, StringRef Name,
1476-
KnownProtocolKind Kind) {
1477-
Identifier ID = Stdlib->getASTContext().getIdentifier(Name);
1478-
UnqualifiedLookup Lookup(ID, Stdlib, nullptr, SourceLoc(),
1479-
UnqualifiedLookup::Flags::KnownPrivate |
1480-
UnqualifiedLookup::Flags::TypeLookup);
1481-
if (auto Proto
1482-
= dyn_cast_or_null<ProtocolDecl>(Lookup.getSingleTypeResult()))
1483-
Proto->setKnownProtocolKind(Kind);
1484-
}
1485-
1486-
void ASTContext::recordKnownProtocols(ModuleDecl *Stdlib) {
1487-
#define PROTOCOL_WITH_NAME(Id, Name) \
1488-
recordKnownProtocol(Stdlib, Name, KnownProtocolKind::Id);
1489-
#include "swift/AST/KnownProtocols.def"
1490-
}
1491-
14921475
ModuleDecl *ASTContext::getLoadedModule(
14931476
ArrayRef<std::pair<Identifier, SourceLoc>> ModulePath) const {
14941477
assert(!ModulePath.empty());
@@ -1761,10 +1744,6 @@ ASTContext::getModule(ArrayRef<std::pair<Identifier, SourceLoc>> ModulePath) {
17611744
auto moduleID = ModulePath[0];
17621745
for (auto &importer : getImpl().ModuleLoaders) {
17631746
if (ModuleDecl *M = importer->loadModule(moduleID.second, ModulePath)) {
1764-
if (ModulePath.size() == 1 &&
1765-
(ModulePath[0].first == StdlibModuleName ||
1766-
ModulePath[0].first == Id_Foundation))
1767-
recordKnownProtocols(M);
17681747
return M;
17691748
}
17701749
}

lib/AST/Decl.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4384,6 +4384,24 @@ void ProtocolDecl::setRequirementSignature(ArrayRef<Requirement> requirements) {
43844384
}
43854385
}
43864386

4387+
void ProtocolDecl::computeKnownProtocolKind() const {
4388+
auto module = getModuleContext();
4389+
if (module != module->getASTContext().getStdlibModule() &&
4390+
!module->getName().is("Foundation")) {
4391+
const_cast<ProtocolDecl *>(this)->Bits.ProtocolDecl.KnownProtocol = 1;
4392+
return;
4393+
}
4394+
4395+
unsigned value =
4396+
llvm::StringSwitch<unsigned>(getBaseName().userFacingName())
4397+
#define PROTOCOL_WITH_NAME(Id, Name) \
4398+
.Case(Name, static_cast<unsigned>(KnownProtocolKind::Id) + 2)
4399+
#include "swift/AST/KnownProtocols.def"
4400+
.Default(1);
4401+
4402+
const_cast<ProtocolDecl *>(this)->Bits.ProtocolDecl.KnownProtocol = value;
4403+
}
4404+
43874405
void AbstractStorageDecl::overwriteImplInfo(StorageImplInfo implInfo) {
43884406
setFieldsFromImplInfo(implInfo);
43894407
Accessors.getPointer()->overwriteImplInfo(implInfo);

lib/Frontend/Frontend.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -803,11 +803,6 @@ void CompilerInstance::parseAndCheckTypesUpTo(
803803
options.SwitchCheckingInvocationThreshold);
804804
});
805805

806-
// Even if there were no source files, we should still record known
807-
// protocols.
808-
if (auto *stdlib = Context->getStdlibModule())
809-
Context->recordKnownProtocols(stdlib);
810-
811806
if (Invocation.isCodeCompletion()) {
812807
performDelayedParsing(MainModule, PersistentState,
813808
Invocation.getCodeCompletionFactory());

lib/Sema/TypeChecker.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,6 @@ ModuleDecl *TypeChecker::getStdlibModule(const DeclContext *dc) {
228228
}
229229

230230
assert(StdlibModule && "no main module found");
231-
Context.recordKnownProtocols(StdlibModule);
232231
return StdlibModule;
233232
}
234233

0 commit comments

Comments
 (0)