20
20
#include " swift/AST/ExistentialLayout.h"
21
21
#include " swift/AST/Initializer.h"
22
22
#include " swift/AST/NameLookup.h"
23
+ #include " swift/AST/NameLookupRequests.h"
23
24
#include " swift/AST/ProtocolConformance.h"
24
25
#include " swift/Basic/TopCollection.h"
25
26
#include < algorithm>
@@ -225,13 +226,17 @@ convertToUnqualifiedLookupOptions(NameLookupOptions options) {
225
226
LookupResult TypeChecker::lookupUnqualified (DeclContext *dc, DeclName name,
226
227
SourceLoc loc,
227
228
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}, {});
230
235
231
236
LookupResult result;
232
237
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];
235
240
// Determine which type we looked through to find this result.
236
241
Type foundInType;
237
242
@@ -246,7 +251,7 @@ LookupResult TypeChecker::lookupUnqualified(DeclContext *dc, DeclName name,
246
251
}
247
252
248
253
builder.add (found.getValueDecl (), found.getDeclContext (), foundInType,
249
- /* isOuter=*/ idx >= lookup.IndexOfFirstOuterResult );
254
+ /* isOuter=*/ idx >= lookup.getIndexOfFirstOuterResult () );
250
255
}
251
256
return result;
252
257
}
@@ -255,18 +260,18 @@ LookupResult
255
260
TypeChecker::lookupUnqualifiedType (DeclContext *dc, DeclName name,
256
261
SourceLoc loc,
257
262
NameLookupOptions options) {
263
+ auto &ctx = dc->getASTContext ();
258
264
auto ulOptions = convertToUnqualifiedLookupOptions (options) |
259
265
UnqualifiedLookup::Flags::TypeLookup;
260
266
{
261
267
// 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;
270
275
}
271
276
272
277
{
@@ -275,11 +280,10 @@ TypeChecker::lookupUnqualifiedType(DeclContext *dc, DeclName name,
275
280
// FIXME: Fix the problem where if NominalTypeDecl::getAllProtocols()
276
281
// is called too early, we start resolving extensions -- even those
277
282
// 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}, {});
283
287
}
284
288
}
285
289
0 commit comments