Skip to content

Commit cdcb8e4

Browse files
committed
AST: Lazier opaque type validation
1 parent e334e5d commit cdcb8e4

File tree

13 files changed

+43
-85
lines changed

13 files changed

+43
-85
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,6 @@ class ASTBuilder {
5858
using BuiltTypeDecl = swift::GenericTypeDecl *; // nominal or type alias
5959
using BuiltProtocolDecl = swift::ProtocolDecl *;
6060
explicit ASTBuilder(ASTContext &ctx) : Ctx(ctx) {}
61-
62-
/// The resolver to use for type checking, if necessary.
63-
LazyResolver *Resolver = nullptr;
6461

6562
ASTContext &getASTContext() { return Ctx; }
6663
DeclContext *getNotionalDC();

include/swift/AST/FileUnit.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ class FileUnit : public DeclContext {
6060

6161
/// Look up an opaque return type by the mangled name of the declaration
6262
/// that defines it.
63-
virtual OpaqueTypeDecl *lookupOpaqueResultType(StringRef MangledName,
64-
LazyResolver *resolver) {
63+
virtual OpaqueTypeDecl *lookupOpaqueResultType(StringRef MangledName) {
6564
return nullptr;
6665
}
6766

include/swift/AST/Module.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,8 +354,7 @@ class ModuleDecl : public DeclContext, public TypeDecl {
354354

355355
/// Look up an opaque return type by the mangled name of the declaration
356356
/// that defines it.
357-
OpaqueTypeDecl *lookupOpaqueResultType(StringRef MangledName,
358-
LazyResolver *resolver);
357+
OpaqueTypeDecl *lookupOpaqueResultType(StringRef MangledName);
359358

360359
/// Find ValueDecls in the module and pass them to the given consumer object.
361360
///

include/swift/AST/SourceFile.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ class SourceFile final : public FileUnit {
117117
/// The scope map that describes this source file.
118118
std::unique_ptr<ASTScope> Scope;
119119

120+
/// The set of validated opaque return type decls in the source file.
121+
llvm::SmallVector<OpaqueTypeDecl *, 4> OpaqueReturnTypes;
122+
llvm::StringMap<OpaqueTypeDecl *> ValidatedOpaqueReturnTypes;
123+
/// The set of parsed decls with opaque return types that have not yet
124+
/// been validated.
125+
llvm::SetVector<ValueDecl *> UnvalidatedDeclsWithOpaqueReturnTypes;
126+
120127
friend ASTContext;
121128
friend Impl;
122129
public:
@@ -130,13 +137,6 @@ class SourceFile final : public FileUnit {
130137
/// The list of local type declarations in the source file.
131138
llvm::SetVector<TypeDecl *> LocalTypeDecls;
132139

133-
/// The set of validated opaque return type decls in the source file.
134-
llvm::SmallVector<OpaqueTypeDecl *, 4> OpaqueReturnTypes;
135-
llvm::StringMap<OpaqueTypeDecl *> ValidatedOpaqueReturnTypes;
136-
/// The set of parsed decls with opaque return types that have not yet
137-
/// been validated.
138-
llvm::DenseSet<ValueDecl *> UnvalidatedDeclsWithOpaqueReturnTypes;
139-
140140
/// A set of special declaration attributes which require the
141141
/// Foundation module to be imported to work. If the foundation
142142
/// module is still not imported by the time type checking is
@@ -430,14 +430,13 @@ class SourceFile final : public FileUnit {
430430
void setSyntaxRoot(syntax::SourceFileSyntax &&Root);
431431
bool hasSyntaxRoot() const;
432432

433-
OpaqueTypeDecl *lookupOpaqueResultType(StringRef MangledName,
434-
LazyResolver *resolver) override;
433+
OpaqueTypeDecl *lookupOpaqueResultType(StringRef MangledName) override;
435434

436435
void addUnvalidatedDeclWithOpaqueResultType(ValueDecl *vd) {
437436
UnvalidatedDeclsWithOpaqueReturnTypes.insert(vd);
438437
}
439438

440-
void markDeclWithOpaqueResultTypeAsValidated(ValueDecl *vd);
439+
ArrayRef<OpaqueTypeDecl *> getOpaqueReturnTypeDecls();
441440

442441
private:
443442

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ class SerializedASTFile final : public LoadedFile {
278278
virtual TypeDecl *lookupLocalType(StringRef MangledName) const override;
279279

280280
virtual OpaqueTypeDecl *
281-
lookupOpaqueResultType(StringRef MangledName, LazyResolver *resolver) override;
281+
lookupOpaqueResultType(StringRef MangledName) override;
282282

283283
virtual TypeDecl *
284284
lookupNestedType(Identifier name,

lib/AST/ASTDemangler.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,7 @@ Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
259259
if (!parentModule)
260260
return Type();
261261

262-
auto opaqueDecl = parentModule->lookupOpaqueResultType(mangledName,
263-
Resolver);
262+
auto opaqueDecl = parentModule->lookupOpaqueResultType(mangledName);
264263
if (!opaqueDecl)
265264
return Type();
266265
// TODO: multiple opaque types

lib/AST/Module.cpp

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -475,10 +475,9 @@ TypeDecl * ModuleDecl::lookupLocalType(StringRef MangledName) const {
475475
}
476476

477477
OpaqueTypeDecl *
478-
ModuleDecl::lookupOpaqueResultType(StringRef MangledName,
479-
LazyResolver *resolver) {
478+
ModuleDecl::lookupOpaqueResultType(StringRef MangledName) {
480479
for (auto file : getFiles()) {
481-
auto OTD = file->lookupOpaqueResultType(MangledName, resolver);
480+
auto OTD = file->lookupOpaqueResultType(MangledName);
482481
if (OTD)
483482
return OTD;
484483
}
@@ -670,9 +669,8 @@ void SourceFile::getLocalTypeDecls(SmallVectorImpl<TypeDecl*> &Results) const {
670669
void
671670
SourceFile::getOpaqueReturnTypeDecls(SmallVectorImpl<OpaqueTypeDecl*> &Results)
672671
const {
673-
for (auto &member : ValidatedOpaqueReturnTypes) {
674-
Results.push_back(member.second);
675-
}
672+
auto result = const_cast<SourceFile *>(this)->getOpaqueReturnTypeDecls();
673+
llvm::copy(result, std::back_inserter(Results));
676674
}
677675

678676
TypeDecl *SourceFile::lookupLocalType(llvm::StringRef mangledName) const {
@@ -1806,44 +1804,41 @@ void SourceFile::createReferencedNameTracker() {
18061804
ReferencedNames.emplace(ReferencedNameTracker());
18071805
}
18081806

1807+
ArrayRef<OpaqueTypeDecl *> SourceFile::getOpaqueReturnTypeDecls() {
1808+
for (auto *vd : UnvalidatedDeclsWithOpaqueReturnTypes) {
1809+
if (auto opaqueDecl = vd->getOpaqueResultTypeDecl()) {
1810+
auto inserted = ValidatedOpaqueReturnTypes.insert(
1811+
{opaqueDecl->getOpaqueReturnTypeIdentifier().str(),
1812+
opaqueDecl});
1813+
if (inserted.second) {
1814+
OpaqueReturnTypes.push_back(opaqueDecl);
1815+
}
1816+
}
1817+
}
1818+
1819+
UnvalidatedDeclsWithOpaqueReturnTypes.clear();
1820+
return OpaqueReturnTypes;
1821+
}
1822+
18091823
OpaqueTypeDecl *
1810-
SourceFile::lookupOpaqueResultType(StringRef MangledName,
1811-
LazyResolver *resolver) {
1824+
SourceFile::lookupOpaqueResultType(StringRef MangledName) {
18121825
// Check already-validated decls.
18131826
auto found = ValidatedOpaqueReturnTypes.find(MangledName);
18141827
if (found != ValidatedOpaqueReturnTypes.end())
18151828
return found->second;
18161829

18171830
// If there are unvalidated decls with opaque types, go through and validate
18181831
// them now.
1819-
if (resolver && !UnvalidatedDeclsWithOpaqueReturnTypes.empty()) {
1820-
while (!UnvalidatedDeclsWithOpaqueReturnTypes.empty()) {
1821-
ValueDecl *decl = *UnvalidatedDeclsWithOpaqueReturnTypes.begin();
1822-
UnvalidatedDeclsWithOpaqueReturnTypes.erase(decl);
1823-
// FIXME(InterfaceTypeRequest): Remove this.
1824-
(void)decl->getInterfaceType();
1825-
}
1826-
1827-
found = ValidatedOpaqueReturnTypes.find(MangledName);
1828-
if (found != ValidatedOpaqueReturnTypes.end())
1829-
return found->second;
1830-
}
1832+
(void) getOpaqueReturnTypeDecls();
1833+
1834+
found = ValidatedOpaqueReturnTypes.find(MangledName);
1835+
if (found != ValidatedOpaqueReturnTypes.end())
1836+
return found->second;
18311837

18321838
// Otherwise, we don't have a matching opaque decl.
18331839
return nullptr;
18341840
}
18351841

1836-
void SourceFile::markDeclWithOpaqueResultTypeAsValidated(ValueDecl *vd) {
1837-
UnvalidatedDeclsWithOpaqueReturnTypes.erase(vd);
1838-
if (auto opaqueDecl = vd->getOpaqueResultTypeDecl()) {
1839-
auto inserted = ValidatedOpaqueReturnTypes.insert(
1840-
{opaqueDecl->getOpaqueReturnTypeIdentifier().str(), opaqueDecl});
1841-
if (inserted.second) {
1842-
OpaqueReturnTypes.push_back(opaqueDecl);
1843-
}
1844-
}
1845-
}
1846-
18471842
//===----------------------------------------------------------------------===//
18481843
// Miscellaneous
18491844
//===----------------------------------------------------------------------===//

lib/IRGen/GenDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ void IRGenModule::emitSourceFile(SourceFile &SF) {
440440
emitGlobalDecl(decl);
441441
for (auto *localDecl : SF.LocalTypeDecls)
442442
emitGlobalDecl(localDecl);
443-
for (auto *opaqueDecl : SF.OpaqueReturnTypes)
443+
for (auto *opaqueDecl : SF.getOpaqueReturnTypeDecls())
444444
maybeEmitOpaqueTypeDecl(opaqueDecl);
445445

446446
SF.collectLinkLibraries([this](LinkLibrary linkLib) {

lib/Sema/TypeCheckDecl.cpp

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3966,12 +3966,6 @@ void TypeChecker::validateDecl(ValueDecl *D) {
39663966
setBoundVarsTypeError(parentPattern, Context);
39673967
}
39683968

3969-
if (VD->getOpaqueResultTypeDecl()) {
3970-
if (auto SF = VD->getInnermostDeclContext()->getParentSourceFile()) {
3971-
SF->markDeclWithOpaqueResultTypeAsValidated(VD);
3972-
}
3973-
}
3974-
39753969
break;
39763970
}
39773971

@@ -4111,13 +4105,6 @@ void TypeChecker::validateDecl(ValueDecl *D) {
41114105
}
41124106
}
41134107
}
4114-
4115-
// Mark the opaque result type as validated, if there is one.
4116-
if (FD->getOpaqueResultTypeDecl()) {
4117-
if (auto sf = FD->getDeclContext()->getParentSourceFile()) {
4118-
sf->markDeclWithOpaqueResultTypeAsValidated(FD);
4119-
}
4120-
}
41214108

41224109
break;
41234110
}
@@ -4157,12 +4144,6 @@ void TypeChecker::validateDecl(ValueDecl *D) {
41574144
validateResultType(SD, SD->getElementTypeLoc());
41584145
SD->computeType();
41594146

4160-
if (SD->getOpaqueResultTypeDecl()) {
4161-
if (auto SF = SD->getInnermostDeclContext()->getParentSourceFile()) {
4162-
SF->markDeclWithOpaqueResultTypeAsValidated(SD);
4163-
}
4164-
}
4165-
41664147
break;
41674148
}
41684149

lib/Sema/TypeCheckPattern.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,14 +1135,6 @@ bool TypeChecker::coercePatternToType(Pattern *&P, TypeResolution resolution,
11351135
var->getTypeLoc() = tyLoc;
11361136
var->getTypeLoc().setType(var->getType());
11371137

1138-
// FIXME: Copy pasted from validateDecl(). This needs to be converted to
1139-
// use requests.
1140-
if (var->getOpaqueResultTypeDecl()) {
1141-
if (auto sf = var->getInnermostDeclContext()->getParentSourceFile()) {
1142-
sf->markDeclWithOpaqueResultTypeAsValidated(var);
1143-
}
1144-
}
1145-
11461138
// FIXME: Should probably just remove the forbidden prefix stuff, it no
11471139
// longer makes a lot of sense in a request-based world.
11481140
checkForForbiddenPrefix(var);

lib/Sema/TypeCheckType.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2449,7 +2449,6 @@ Type TypeResolver::resolveOpaqueReturnType(TypeRepr *repr,
24492449
if (definingDeclNode->getKind() == Node::Kind::Global)
24502450
definingDeclNode = definingDeclNode->getChild(0);
24512451
ASTBuilder builder(Context);
2452-
builder.Resolver = resolution.Resolver;
24532452
auto opaqueNode =
24542453
builder.getNodeFactory().createNode(Node::Kind::OpaqueReturnTypeOf);
24552454
opaqueNode->addChild(definingDeclNode, builder.getNodeFactory());

lib/Serialization/Deserialization.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,7 +1261,7 @@ ModuleFile::resolveCrossReference(ModuleID MID, uint32_t pathLen) {
12611261
auto name = getIdentifier(DefiningDeclNameID);
12621262
pathTrace.addOpaqueReturnType(name);
12631263

1264-
if (auto opaque = baseModule->lookupOpaqueResultType(name.str(), nullptr)) {
1264+
if (auto opaque = baseModule->lookupOpaqueResultType(name.str())) {
12651265
values.push_back(opaque);
12661266
}
12671267
break;
@@ -1664,8 +1664,7 @@ ModuleFile::resolveCrossReference(ModuleID MID, uint32_t pathLen) {
16641664
pathTrace.addOpaqueReturnType(name);
16651665

16661666
auto lookupModule = M ? M : baseModule;
1667-
if (auto opaqueTy = lookupModule->lookupOpaqueResultType(name.str(),
1668-
nullptr)) {
1667+
if (auto opaqueTy = lookupModule->lookupOpaqueResultType(name.str())) {
16691668
values.push_back(opaqueTy);
16701669
}
16711670
break;

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -961,8 +961,7 @@ TypeDecl *SerializedASTFile::lookupLocalType(llvm::StringRef MangledName) const{
961961
}
962962

963963
OpaqueTypeDecl *
964-
SerializedASTFile::lookupOpaqueResultType(StringRef MangledName,
965-
LazyResolver *resolver) {
964+
SerializedASTFile::lookupOpaqueResultType(StringRef MangledName) {
966965
return File.lookupOpaqueResultType(MangledName);
967966
}
968967

0 commit comments

Comments
 (0)