Skip to content

Commit 7d01863

Browse files
committed
[Type Checker] Remove TypeChecker/LazyResolver parameters from name lookup.
Make the TypeChecker’s name-lookup routines static, so they don’t depend on the TypeCheck instance… except for one pesky place where we jump back into protocol conformance checking. This is part of teasing apart the type checker.
1 parent ed9b227 commit 7d01863

File tree

6 files changed

+38
-32
lines changed

6 files changed

+38
-32
lines changed

include/swift/AST/NameLookup.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,12 +287,10 @@ bool removeOverriddenDecls(SmallVectorImpl<ValueDecl*> &decls);
287287
///
288288
/// \param decls The set of declarations being considered.
289289
/// \param curModule The current module.
290-
/// \param typeResolver Used to resolve overload types.
291290
///
292291
/// \returns true if any shadowed declarations were removed.
293292
bool removeShadowedDecls(SmallVectorImpl<ValueDecl*> &decls,
294-
const ModuleDecl *curModule,
295-
LazyResolver *typeResolver);
293+
const ModuleDecl *curModule);
296294

297295
/// Finds decls visible in the given context and feeds them to the given
298296
/// VisibleDeclConsumer. If the current DeclContext is nested in a function,

lib/AST/LookupVisibleDecls.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ static void doGlobalExtensionLookup(Type BaseType,
215215
}
216216

217217
// Handle shadowing.
218-
removeShadowedDecls(FoundDecls, CurrDC->getParentModule(), TypeResolver);
218+
removeShadowedDecls(FoundDecls, CurrDC->getParentModule());
219219
}
220220

221221
/// \brief Enumerate immediate members of the type \c LookupType and its

lib/AST/NameLookup.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,9 @@ static ConstructorComparison compareConstructors(ConstructorDecl *ctor1,
157157
}
158158

159159
bool swift::removeShadowedDecls(SmallVectorImpl<ValueDecl*> &decls,
160-
const ModuleDecl *curModule,
161-
LazyResolver *typeResolver) {
160+
const ModuleDecl *curModule) {
161+
auto typeResolver = curModule->getASTContext().getLazyResolver();
162+
162163
// Category declarations by their signatures.
163164
llvm::SmallDenseMap<std::pair<CanType, DeclBaseName>,
164165
llvm::TinyPtrVector<ValueDecl *>>
@@ -478,6 +479,7 @@ UnqualifiedLookup::UnqualifiedLookup(DeclName Name, DeclContext *DC,
478479
{
479480
ModuleDecl &M = *DC->getParentModule();
480481
ASTContext &Ctx = M.getASTContext();
482+
if (!TypeResolver) TypeResolver = Ctx.getLazyResolver();
481483
const SourceManager &SM = Ctx.SourceMgr;
482484
DebuggerClient *DebugClient = M.getDebugClient();
483485

@@ -1634,6 +1636,9 @@ bool DeclContext::lookupQualified(Type type,
16341636
using namespace namelookup;
16351637
assert(decls.empty() && "additive lookup not supported");
16361638

1639+
if (!typeResolver)
1640+
typeResolver = getASTContext().getLazyResolver();
1641+
16371642
auto checkLookupCascading = [this, options]() -> Optional<bool> {
16381643
switch (static_cast<unsigned>(options & NL_KnownDependencyMask)) {
16391644
case 0:
@@ -1940,7 +1945,7 @@ bool DeclContext::lookupQualified(Type type,
19401945
// If we're supposed to remove shadowed/hidden declarations, do so now.
19411946
ModuleDecl *M = getParentModule();
19421947
if (options & NL_RemoveNonVisible)
1943-
removeShadowedDecls(decls, M, typeResolver);
1948+
removeShadowedDecls(decls, M);
19441949

19451950
if (auto *debugClient = M->getDebugClient())
19461951
filterForDiscriminator(decls, debugClient);

lib/AST/ProtocolConformance.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,7 @@ Witness NormalProtocolConformance::getWitness(ValueDecl *requirement,
788788

789789
auto known = Mapping.find(requirement);
790790
if (known == Mapping.end()) {
791+
if (!resolver) resolver = requirement->getASTContext().getLazyResolver();
791792
assert(resolver && "Unable to resolve witness without resolver");
792793
resolver->resolveWitness(this, requirement);
793794
known = Mapping.find(requirement);

lib/Sema/TypeCheckNameLookup.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ namespace {
7171
/// Builder that helps construct a lookup result from the raw lookup
7272
/// data.
7373
class LookupResultBuilder {
74-
TypeChecker &TC;
7574
LookupResult &Result;
7675
DeclContext *DC;
7776
NameLookupOptions Options;
@@ -86,12 +85,12 @@ namespace {
8685
llvm::SmallDenseMap<std::pair<ValueDecl *, DeclContext *>, bool, 4> Known;
8786

8887
public:
89-
LookupResultBuilder(TypeChecker &tc, LookupResult &result, DeclContext *dc,
88+
LookupResultBuilder(LookupResult &result, DeclContext *dc,
9089
NameLookupOptions options,
9190
bool isMemberLookup)
92-
: TC(tc), Result(result), DC(dc), Options(options),
91+
: Result(result), DC(dc), Options(options),
9392
IsMemberLookup(isMemberLookup) {
94-
if (!TC.Context.LangOpts.EnableAccessControl)
93+
if (!dc->getASTContext().LangOpts.EnableAccessControl)
9594
Options |= NameLookupFlags::IgnoreAccessControl;
9695
}
9796

@@ -132,8 +131,8 @@ namespace {
132131
removeOverriddenDecls(FoundOuterDecls);
133132

134133
// Remove any shadowed declarations from the found-declarations set.
135-
removeShadowedDecls(FoundDecls, DC->getParentModule(), &TC);
136-
removeShadowedDecls(FoundOuterDecls, DC->getParentModule(), &TC);
134+
removeShadowedDecls(FoundDecls, DC->getParentModule());
135+
removeShadowedDecls(FoundOuterDecls, DC->getParentModule());
137136

138137
// Filter out those results that have been removed from the
139138
// found-declarations set.
@@ -232,7 +231,10 @@ namespace {
232231

233232
// Dig out the protocol conformance.
234233
auto *foundProto = cast<ProtocolDecl>(foundDC);
235-
auto conformance = TC.conformsToProtocol(conformingType, foundProto, DC,
234+
auto resolver = DC->getASTContext().getLazyResolver();
235+
assert(resolver && "Need an active resolver");
236+
auto &tc = *static_cast<TypeChecker *>(resolver);
237+
auto conformance = tc.conformsToProtocol(conformingType, foundProto, DC,
236238
conformanceOptions);
237239
if (!conformance) {
238240
// If there's no conformance, we have an existential
@@ -254,10 +256,10 @@ namespace {
254256
ValueDecl *witness = nullptr;
255257
auto concrete = conformance->getConcrete();
256258
if (auto assocType = dyn_cast<AssociatedTypeDecl>(found)) {
257-
witness = concrete->getTypeWitnessAndDecl(assocType, &TC)
259+
witness = concrete->getTypeWitnessAndDecl(assocType, nullptr)
258260
.second;
259261
} else if (found->isProtocolRequirement()) {
260-
witness = concrete->getWitnessDecl(found, &TC);
262+
witness = concrete->getWitnessDecl(found, nullptr);
261263

262264
// It is possible that a requirement is visible to us, but
263265
// not the witness. In this case, just return the requirement;
@@ -300,12 +302,11 @@ convertToUnqualifiedLookupOptions(NameLookupOptions options) {
300302
LookupResult TypeChecker::lookupUnqualified(DeclContext *dc, DeclName name,
301303
SourceLoc loc,
302304
NameLookupOptions options) {
303-
UnqualifiedLookup lookup(name, dc, this, loc,
305+
UnqualifiedLookup lookup(name, dc, nullptr, loc,
304306
convertToUnqualifiedLookupOptions(options));
305307

306308
LookupResult result;
307-
LookupResultBuilder builder(*this, result, dc, options,
308-
/*memberLookup*/false);
309+
LookupResultBuilder builder(result, dc, options, /*memberLookup*/false);
309310
for (auto idx : indices(lookup.Results)) {
310311
const auto &found = lookup.Results[idx];
311312
// Determine which type we looked through to find this result.
@@ -336,7 +337,7 @@ TypeChecker::lookupUnqualifiedType(DeclContext *dc, DeclName name,
336337
{
337338
// Try lookup without ProtocolMembers first.
338339
UnqualifiedLookup lookup(
339-
name, dc, this, loc,
340+
name, dc, nullptr, loc,
340341
ulOptions - UnqualifiedLookup::Flags::AllowProtocolMembers);
341342

342343
if (!lookup.Results.empty() ||
@@ -352,7 +353,7 @@ TypeChecker::lookupUnqualifiedType(DeclContext *dc, DeclName name,
352353
// is called too early, we start resolving extensions -- even those
353354
// which do provide not conformances.
354355
UnqualifiedLookup lookup(
355-
name, dc, this, loc,
356+
name, dc, nullptr, loc,
356357
ulOptions | UnqualifiedLookup::Flags::AllowProtocolMembers);
357358

358359
return LookupResult(lookup.Results, lookup.IndexOfFirstOuterResult);
@@ -380,10 +381,10 @@ LookupResult TypeChecker::lookupMember(DeclContext *dc,
380381
subOptions &= ~NL_RemoveOverridden;
381382
subOptions &= ~NL_RemoveNonVisible;
382383

383-
LookupResultBuilder builder(*this, result, dc, options,
384+
LookupResultBuilder builder(result, dc, options,
384385
/*memberLookup*/true);
385386
SmallVector<ValueDecl *, 4> lookupResults;
386-
dc->lookupQualified(type, name, subOptions, this, lookupResults);
387+
dc->lookupQualified(type, name, subOptions, nullptr, lookupResults);
387388

388389
for (auto found : lookupResults)
389390
builder.add(found, nullptr, type, /*isOuter=*/false);

lib/Sema/TypeChecker.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,9 +2020,10 @@ class TypeChecker final : public LazyResolver {
20202020
/// \param name The name of the entity to look for.
20212021
/// \param loc The source location at which name lookup occurs.
20222022
/// \param options Options that control name lookup.
2023-
LookupResult lookupUnqualified(DeclContext *dc, DeclName name, SourceLoc loc,
2024-
NameLookupOptions options
2025-
= defaultUnqualifiedLookupOptions);
2023+
static LookupResult lookupUnqualified(DeclContext *dc, DeclName name,
2024+
SourceLoc loc,
2025+
NameLookupOptions options
2026+
= defaultUnqualifiedLookupOptions);
20262027

20272028
/// Perform unqualified type lookup at the given source location
20282029
/// within a particular declaration context.
@@ -2032,9 +2033,9 @@ class TypeChecker final : public LazyResolver {
20322033
/// \param loc The source location at which name lookup occurs.
20332034
/// \param options Options that control name lookup.
20342035
LookupResult
2035-
lookupUnqualifiedType(DeclContext *dc, DeclName name, SourceLoc loc,
2036-
NameLookupOptions options
2037-
= defaultUnqualifiedLookupOptions);
2036+
static lookupUnqualifiedType(DeclContext *dc, DeclName name, SourceLoc loc,
2037+
NameLookupOptions options
2038+
= defaultUnqualifiedLookupOptions);
20382039

20392040
/// \brief Lookup a member in the given type.
20402041
///
@@ -2044,9 +2045,9 @@ class TypeChecker final : public LazyResolver {
20442045
/// \param options Options that control name lookup.
20452046
///
20462047
/// \returns The result of name lookup.
2047-
LookupResult lookupMember(DeclContext *dc, Type type, DeclName name,
2048-
NameLookupOptions options
2049-
= defaultMemberLookupOptions);
2048+
static LookupResult lookupMember(DeclContext *dc, Type type, DeclName name,
2049+
NameLookupOptions options
2050+
= defaultMemberLookupOptions);
20502051

20512052
/// \brief Check whether the given declaration can be written as a
20522053
/// member of the given base type.

0 commit comments

Comments
 (0)