Skip to content

Commit 3aa7158

Browse files
committed
Switch UnqualifiedLookup callers over to UnqualifiedLookupRequest
1 parent 633de02 commit 3aa7158

File tree

10 files changed

+80
-43
lines changed

10 files changed

+80
-43
lines changed

include/swift/AST/NameLookup.h

+8
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,21 @@ class LookupResult {
156156
return llvm::makeArrayRef(Results).drop_front(IndexOfFirstOuterResult);
157157
}
158158

159+
/// \returns An array of both the inner and outer results.
160+
ArrayRef<LookupResultEntry> allResults() const {
161+
return llvm::makeArrayRef(Results);
162+
}
163+
159164
const LookupResultEntry& operator[](unsigned index) const {
160165
return Results[index];
161166
}
162167

163168
LookupResultEntry front() const { return innerResults().front(); }
164169
LookupResultEntry back() const { return innerResults().back(); }
165170

171+
/// \returns The index of the first outer result within \c allResults().
172+
size_t getIndexOfFirstOuterResult() const { return IndexOfFirstOuterResult; }
173+
166174
/// Add a result to the set of results.
167175
void add(LookupResultEntry result, bool isOuter) {
168176
Results.push_back(result);

lib/AST/NameLookup.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -1982,8 +1982,11 @@ directReferencesForUnqualifiedTypeLookup(DeclName name,
19821982
if (lookupOuter == LookupOuterResults::Included)
19831983
options |= UnqualifiedLookup::Flags::IncludeOuterResults;
19841984

1985-
UnqualifiedLookup lookup(name, dc, loc, options);
1986-
for (const auto &result : lookup.Results) {
1985+
auto &ctx = dc->getASTContext();
1986+
auto flags = UnqualifiedLookupFlags(options.toRaw());
1987+
auto lookup = evaluateOrDefault(
1988+
ctx.evaluator, UnqualifiedLookupRequest{name, dc, loc, flags}, {});
1989+
for (const auto &result : lookup.allResults()) {
19871990
if (auto typeDecl = dyn_cast<TypeDecl>(result.getValueDecl()))
19881991
results.push_back(typeDecl);
19891992
}

lib/Immediate/REPL.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "swift/AST/IRGenOptions.h"
2121
#include "swift/AST/Module.h"
2222
#include "swift/AST/NameLookup.h"
23+
#include "swift/AST/NameLookupRequests.h"
2324
#include "swift/Basic/LLVMContext.h"
2425
#include "swift/Frontend/Frontend.h"
2526
#include "swift/IDE/REPLCodeCompletion.h"
@@ -1091,8 +1092,12 @@ class REPLEnvironment {
10911092
ASTContext &ctx = CI.getASTContext();
10921093
SourceFile &SF =
10931094
MostRecentModule->getMainSourceFile(SourceFileKind::REPL);
1094-
UnqualifiedLookup lookup(ctx.getIdentifier(Tok.getText()), &SF);
1095-
for (auto result : lookup.Results) {
1095+
auto name = ctx.getIdentifier(Tok.getText());
1096+
auto flags = UnqualifiedLookupFlags();
1097+
auto lookup = evaluateOrDefault(
1098+
ctx.evaluator,
1099+
UnqualifiedLookupRequest{name, &SF, SourceLoc(), flags}, {});
1100+
for (auto result : lookup) {
10961101
printOrDumpDecl(result.getValueDecl(), doPrint);
10971102

10981103
if (auto typeDecl = dyn_cast<TypeDecl>(result.getValueDecl())) {

lib/ParseSIL/ParseSIL.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "swift/AST/ExistentialLayout.h"
1616
#include "swift/AST/GenericEnvironment.h"
1717
#include "swift/AST/NameLookup.h"
18+
#include "swift/AST/NameLookupRequests.h"
1819
#include "swift/AST/ProtocolConformance.h"
1920
#include "swift/AST/SourceFile.h"
2021
#include "swift/AST/TypeCheckRequests.h"
@@ -1185,10 +1186,13 @@ lookupTopDecl(Parser &P, DeclBaseName Name, bool typeLookup) {
11851186
if (typeLookup)
11861187
options |= UnqualifiedLookup::Flags::TypeLookup;
11871188

1188-
UnqualifiedLookup DeclLookup(Name, &P.SF, SourceLoc(), options);
1189-
assert(DeclLookup.isSuccess() && DeclLookup.Results.size() == 1);
1190-
ValueDecl *VD = DeclLookup.Results.back().getValueDecl();
1191-
return VD;
1189+
auto &ctx = P.SF.getASTContext();
1190+
auto flags = UnqualifiedLookupFlags(options.toRaw());
1191+
auto lookup = evaluateOrDefault(
1192+
ctx.evaluator,
1193+
UnqualifiedLookupRequest{Name, &P.SF, SourceLoc(), flags}, {});
1194+
assert(lookup.size() == 1);
1195+
return lookup.back().getValueDecl();
11921196
}
11931197

11941198
/// Find the ValueDecl given an interface type and a member name.

lib/Sema/MiscDiagnostics.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "TypeCheckAvailability.h"
2020
#include "swift/AST/ASTWalker.h"
2121
#include "swift/AST/NameLookup.h"
22+
#include "swift/AST/NameLookupRequests.h"
2223
#include "swift/AST/Pattern.h"
2324
#include "swift/Basic/Defer.h"
2425
#include "swift/Basic/SourceManager.h"
@@ -531,13 +532,14 @@ static void diagSyntacticUseRestrictions(const Expr *E, const DeclContext *DC,
531532
}
532533

533534
DeclContext *topLevelContext = DC->getModuleScopeContext();
534-
UnqualifiedLookup lookup(VD->getBaseName(), topLevelContext,
535-
/*Loc=*/SourceLoc(),
536-
UnqualifiedLookup::Flags::KnownPrivate);
535+
auto req = UnqualifiedLookupRequest{VD->getBaseName(), topLevelContext,
536+
SourceLoc(),
537+
UnqualifiedLookupFlags::KnownPrivate};
538+
auto lookup = evaluateOrDefault(Ctx.evaluator, req, {});
537539

538540
// Group results by module. Pick an arbitrary result from each module.
539541
llvm::SmallDenseMap<const ModuleDecl*,const ValueDecl*,4> resultsByModule;
540-
for (auto &result : lookup.Results) {
542+
for (auto &result : lookup) {
541543
const ValueDecl *value = result.getValueDecl();
542544
resultsByModule.insert(std::make_pair(value->getModuleContext(),value));
543545
}

lib/Sema/TypeCheckAttr.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -2073,12 +2073,13 @@ void lookupReplacedDecl(DeclName replacedDeclName,
20732073

20742074
auto *moduleScopeCtxt = declCtxt->getModuleScopeContext();
20752075
if (isa<FileUnit>(declCtxt)) {
2076-
UnqualifiedLookup lookup(replacedDeclName, moduleScopeCtxt,
2077-
attr->getLocation());
2078-
if (lookup.isSuccess()) {
2079-
for (auto entry : lookup.Results) {
2080-
results.push_back(entry.getValueDecl());
2081-
}
2076+
auto &ctx = declCtxt->getASTContext();
2077+
auto req =
2078+
UnqualifiedLookupRequest{replacedDeclName, moduleScopeCtxt,
2079+
attr->getLocation(), UnqualifiedLookupFlags()};
2080+
auto lookup = evaluateOrDefault(ctx.evaluator, req, {});
2081+
for (auto entry : lookup) {
2082+
results.push_back(entry.getValueDecl());
20822083
}
20832084
return;
20842085
}

lib/Sema/TypeCheckNameLookup.cpp

+22-18
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "swift/AST/ExistentialLayout.h"
2121
#include "swift/AST/Initializer.h"
2222
#include "swift/AST/NameLookup.h"
23+
#include "swift/AST/NameLookupRequests.h"
2324
#include "swift/AST/ProtocolConformance.h"
2425
#include "swift/Basic/TopCollection.h"
2526
#include <algorithm>
@@ -225,13 +226,17 @@ convertToUnqualifiedLookupOptions(NameLookupOptions options) {
225226
LookupResult TypeChecker::lookupUnqualified(DeclContext *dc, DeclName name,
226227
SourceLoc loc,
227228
NameLookupOptions options) {
228-
UnqualifiedLookup lookup(name, dc, loc,
229-
convertToUnqualifiedLookupOptions(options));
229+
auto ulOptions = convertToUnqualifiedLookupOptions(options);
230+
231+
auto &ctx = dc->getASTContext();
232+
auto flags = UnqualifiedLookupFlags(ulOptions.toRaw());
233+
auto lookup = evaluateOrDefault(
234+
ctx.evaluator, UnqualifiedLookupRequest{name, dc, loc, flags}, {});
230235

231236
LookupResult result;
232237
LookupResultBuilder builder(result, dc, options);
233-
for (auto idx : indices(lookup.Results)) {
234-
const auto &found = lookup.Results[idx];
238+
for (auto idx : indices(lookup.allResults())) {
239+
const auto &found = lookup[idx];
235240
// Determine which type we looked through to find this result.
236241
Type foundInType;
237242

@@ -246,7 +251,7 @@ LookupResult TypeChecker::lookupUnqualified(DeclContext *dc, DeclName name,
246251
}
247252

248253
builder.add(found.getValueDecl(), found.getDeclContext(), foundInType,
249-
/*isOuter=*/idx >= lookup.IndexOfFirstOuterResult);
254+
/*isOuter=*/idx >= lookup.getIndexOfFirstOuterResult());
250255
}
251256
return result;
252257
}
@@ -255,18 +260,18 @@ LookupResult
255260
TypeChecker::lookupUnqualifiedType(DeclContext *dc, DeclName name,
256261
SourceLoc loc,
257262
NameLookupOptions options) {
263+
auto &ctx = dc->getASTContext();
258264
auto ulOptions = convertToUnqualifiedLookupOptions(options) |
259265
UnqualifiedLookup::Flags::TypeLookup;
260266
{
261267
// Try lookup without ProtocolMembers first.
262-
UnqualifiedLookup lookup(
263-
name, dc, loc,
264-
ulOptions - UnqualifiedLookup::Flags::AllowProtocolMembers);
265-
266-
if (!lookup.Results.empty() ||
267-
!options.contains(NameLookupFlags::ProtocolMembers)) {
268-
return LookupResult(lookup.Results, lookup.IndexOfFirstOuterResult);
269-
}
268+
ulOptions -= UnqualifiedLookupFlags::AllowProtocolMembers;
269+
auto flags = UnqualifiedLookupFlags(ulOptions.toRaw());
270+
auto lookup = evaluateOrDefault(
271+
ctx.evaluator, UnqualifiedLookupRequest{name, dc, loc, flags}, {});
272+
if (!lookup.allResults().empty() ||
273+
!options.contains(NameLookupFlags::ProtocolMembers))
274+
return lookup;
270275
}
271276

272277
{
@@ -275,11 +280,10 @@ TypeChecker::lookupUnqualifiedType(DeclContext *dc, DeclName name,
275280
// FIXME: Fix the problem where if NominalTypeDecl::getAllProtocols()
276281
// is called too early, we start resolving extensions -- even those
277282
// which do provide not conformances.
278-
UnqualifiedLookup lookup(
279-
name, dc, loc,
280-
ulOptions | UnqualifiedLookup::Flags::AllowProtocolMembers);
281-
282-
return LookupResult(lookup.Results, lookup.IndexOfFirstOuterResult);
283+
ulOptions |= UnqualifiedLookupFlags::AllowProtocolMembers;
284+
auto flags = UnqualifiedLookupFlags(ulOptions.toRaw());
285+
return evaluateOrDefault(
286+
ctx.evaluator, UnqualifiedLookupRequest{name, dc, loc, flags}, {});
283287
}
284288
}
285289

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "swift/AST/ASTPrinter.h"
2222
#include "swift/AST/Decl.h"
2323
#include "swift/AST/NameLookup.h"
24+
#include "swift/AST/NameLookupRequests.h"
2425
#include "swift/AST/SwiftNameTranslation.h"
2526
#include "swift/AST/GenericSignature.h"
2627
#include "swift/Basic/SourceManager.h"
@@ -495,10 +496,13 @@ void walkRelatedDecls(const ValueDecl *VD, const FnTy &Fn) {
495496

496497
// FIXME: Extract useful related declarations, overloaded functions,
497498
// if VD is an initializer, we should extract other initializers etc.
498-
// For now we use UnqualifiedLookup to fetch other declarations with the same
499+
// For now we use unqualified lookup to fetch other declarations with the same
499500
// base name.
500-
UnqualifiedLookup Lookup(VD->getBaseName(), VD->getDeclContext());
501-
for (auto result : Lookup.Results) {
501+
auto &ctx = VD->getASTContext();
502+
auto req = UnqualifiedLookupRequest{VD->getBaseName(), VD->getDeclContext(),
503+
SourceLoc(), UnqualifiedLookupFlags()};
504+
auto lookup = evaluateOrDefault(ctx.evaluator, req, {});
505+
for (auto result : lookup) {
502506
ValueDecl *RelatedVD = result.getValueDecl();
503507
if (RelatedVD->getAttrs().isUnavailable(VD->getASTContext()))
504508
continue;

tools/swift-ast-script/ASTScriptEvaluator.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "swift/AST/ASTWalker.h"
2222
#include "swift/AST/Decl.h"
2323
#include "swift/AST/NameLookup.h"
24+
#include "swift/AST/NameLookupRequests.h"
2425
#include "swift/Frontend/Frontend.h"
2526

2627
using namespace swift;
@@ -114,7 +115,9 @@ bool ASTScript::execute() const {
114115
return true;
115116
}
116117

117-
UnqualifiedLookup viewLookup(ctx.getIdentifier("View"), swiftUI);
118+
auto req = UnqualifiedLookupRequest{ctx.getIdentifier("View"), swiftUI,
119+
SourceLoc(), UnqualifiedLookupFlags()};
120+
auto viewLookup = evaluateOrDefault(ctx.evaluator, req, {});
118121
auto viewProtocol =
119122
dyn_cast_or_null<ProtocolDecl>(viewLookup.getSingleTypeResult());
120123
if (!viewProtocol) {

tools/swift-ide-test/swift-ide-test.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "swift/AST/DiagnosticConsumer.h"
2323
#include "swift/AST/DiagnosticEngine.h"
2424
#include "swift/AST/ImportCache.h"
25+
#include "swift/AST/NameLookupRequests.h"
2526
#include "swift/AST/PrintOptions.h"
2627
#include "swift/AST/RawComment.h"
2728
#include "swift/AST/USRGeneration.h"
@@ -2233,9 +2234,11 @@ static int doPrintDecls(const CompilerInvocation &InitInvok,
22332234

22342235
for (const auto &name : DeclsToPrint) {
22352236
ASTContext &ctx = CI.getASTContext();
2236-
UnqualifiedLookup lookup(ctx.getIdentifier(name),
2237-
CI.getPrimarySourceFile());
2238-
for (auto result : lookup.Results) {
2237+
auto req = UnqualifiedLookupRequest{ctx.getIdentifier(name),
2238+
CI.getPrimarySourceFile(), SourceLoc(),
2239+
UnqualifiedLookupFlags()};
2240+
auto lookup = evaluateOrDefault(ctx.evaluator, req, {});
2241+
for (auto result : lookup) {
22392242
result.getValueDecl()->print(*Printer, Options);
22402243

22412244
if (auto typeDecl = dyn_cast<TypeDecl>(result.getValueDecl())) {

0 commit comments

Comments
 (0)