Skip to content

Commit e04b56b

Browse files
committed
[NameLookup] Add LookupInModuleRequest
1 parent 4cd873a commit e04b56b

File tree

6 files changed

+78
-6
lines changed

6 files changed

+78
-6
lines changed

include/swift/AST/LookupKinds.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ enum class NLKind {
2626
QualifiedLookup
2727
};
2828

29+
void simple_display(llvm::raw_ostream &out, NLKind kind);
30+
2931
/// Constants used to customize name lookup.
3032
enum NLOptions : unsigned {
3133
/// Consider declarations within protocols to which the context type conforms.

include/swift/AST/ModuleNameLookup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ enum class ResolutionKind {
3939
TypesOnly
4040
};
4141

42+
void simple_display(llvm::raw_ostream &out, ResolutionKind kind);
43+
4244
/// Performs a lookup into the given module and it's imports.
4345
///
4446
/// If 'moduleOrFile' is a ModuleDecl, we search the module and it's

include/swift/AST/NameLookupRequests.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class DestructorDecl;
3131
class GenericContext;
3232
class GenericParamList;
3333
class LookupResult;
34+
enum class NLKind;
3435
class SourceLoc;
3536
class TypeAliasDecl;
3637
class TypeDecl;
@@ -39,6 +40,9 @@ namespace ast_scope {
3940
class ASTScopeImpl;
4041
class ScopeCreator;
4142
} // namespace ast_scope
43+
namespace namelookup {
44+
enum class ResolutionKind;
45+
} // namespace namelookup
4246

4347
/// Display a nominal type or extension thereof.
4448
void simple_display(
@@ -360,6 +364,28 @@ class UnqualifiedLookupRequest
360364
UnqualifiedLookupDescriptor desc) const;
361365
};
362366

367+
using QualifiedLookupResult = SmallVector<ValueDecl *, 4>;
368+
369+
/// Performs a lookup into a given module and its imports.
370+
class LookupInModuleRequest
371+
: public SimpleRequest<LookupInModuleRequest,
372+
QualifiedLookupResult(
373+
const DeclContext *, DeclName, NLKind,
374+
namelookup::ResolutionKind, const DeclContext *),
375+
CacheKind::Uncached> {
376+
public:
377+
using SimpleRequest::SimpleRequest;
378+
379+
private:
380+
friend SimpleRequest;
381+
382+
// Evaluation.
383+
llvm::Expected<QualifiedLookupResult>
384+
evaluate(Evaluator &evaluator, const DeclContext *moduleOrFile, DeclName name,
385+
NLKind lookupKind, namelookup::ResolutionKind resolutionKind,
386+
const DeclContext *moduleScopeContext) const;
387+
};
388+
363389
#define SWIFT_TYPEID_ZONE NameLookup
364390
#define SWIFT_TYPEID_HEADER "swift/AST/NameLookupTypeIDZone.def"
365391
#include "swift/Basic/DefineTypeIDZone.h"

include/swift/AST/NameLookupTypeIDZone.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ SWIFT_REQUEST(NameLookup, UnderlyingTypeDeclsReferencedRequest,
4848
SWIFT_REQUEST(NameLookup, UnqualifiedLookupRequest,
4949
LookupResult(UnqualifiedLookupDescriptor), Uncached,
5050
NoLocationInfo)
51+
SWIFT_REQUEST(NameLookup, LookupInModuleRequest,
52+
QualifiedLookupResult(const DeclContext *, DeclName, NLKind,
53+
namelookup::ResolutionKind,
54+
const DeclContext *),
55+
Uncached, NoLocationInfo)

lib/AST/ModuleNameLookup.cpp

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "swift/AST/ClangModuleLoader.h"
1616
#include "swift/AST/ImportCache.h"
1717
#include "swift/AST/NameLookup.h"
18+
#include "swift/AST/NameLookupRequests.h"
1819
#include "llvm/Support/raw_ostream.h"
1920

2021
using namespace swift;
@@ -228,12 +229,10 @@ void ModuleNameLookup<LookupStrategy>::lookupInModule(
228229
decls.end());
229230
}
230231

231-
void namelookup::lookupInModule(const DeclContext *moduleOrFile,
232-
DeclName name,
233-
SmallVectorImpl<ValueDecl *> &decls,
234-
NLKind lookupKind,
235-
ResolutionKind resolutionKind,
236-
const DeclContext *moduleScopeContext) {
232+
llvm::Expected<QualifiedLookupResult> LookupInModuleRequest::evaluate(
233+
Evaluator &evaluator, const DeclContext *moduleOrFile, DeclName name,
234+
NLKind lookupKind, ResolutionKind resolutionKind,
235+
const DeclContext *moduleScopeContext) const {
237236
assert(moduleScopeContext->isModuleScopeContext());
238237

239238
auto &ctx = moduleOrFile->getASTContext();
@@ -243,8 +242,23 @@ void namelookup::lookupInModule(const DeclContext *moduleOrFile,
243242

244243
FrontendStatsTracer tracer(stats, "lookup-in-module");
245244

245+
QualifiedLookupResult decls;
246246
LookupByName lookup(ctx, resolutionKind, name, lookupKind);
247247
lookup.lookupInModule(decls, moduleOrFile, {}, moduleScopeContext);
248+
return decls;
249+
}
250+
251+
void namelookup::lookupInModule(const DeclContext *moduleOrFile,
252+
DeclName name,
253+
SmallVectorImpl<ValueDecl *> &decls,
254+
NLKind lookupKind,
255+
ResolutionKind resolutionKind,
256+
const DeclContext *moduleScopeContext) {
257+
auto &ctx = moduleOrFile->getASTContext();
258+
LookupInModuleRequest req(moduleOrFile, name, lookupKind, resolutionKind,
259+
moduleScopeContext);
260+
auto results = evaluateOrDefault(ctx.evaluator, req, {});
261+
decls.append(results.begin(), results.end());
248262
}
249263

250264
void namelookup::lookupVisibleDeclsInModule(
@@ -260,3 +274,14 @@ void namelookup::lookupVisibleDeclsInModule(
260274
lookup.lookupInModule(decls, moduleOrFile, accessPath, moduleScopeContext);
261275
}
262276

277+
void namelookup::simple_display(llvm::raw_ostream &out, ResolutionKind kind) {
278+
switch (kind) {
279+
case ResolutionKind::Overloadable:
280+
out << "Overloadable";
281+
return;
282+
case ResolutionKind::TypesOnly:
283+
out << "TypesOnly";
284+
return;
285+
}
286+
llvm_unreachable("Unhandled case in switch");
287+
}

lib/AST/NameLookup.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2635,3 +2635,15 @@ void FindLocalVal::visitCatchStmt(CatchStmt *S) {
26352635
checkPattern(S->getErrorPattern(), DeclVisibilityKind::LocalVariable);
26362636
visit(S->getBody());
26372637
}
2638+
2639+
void swift::simple_display(llvm::raw_ostream &out, NLKind kind) {
2640+
switch (kind) {
2641+
case NLKind::QualifiedLookup:
2642+
out << "QualifiedLookup";
2643+
return;
2644+
case NLKind::UnqualifiedLookup:
2645+
out << "UnqualifiedLookup";
2646+
return;
2647+
}
2648+
llvm_unreachable("Unhandled case in switch");
2649+
}

0 commit comments

Comments
 (0)