Skip to content

Commit e3e597d

Browse files
committed
Recursify operator lookup.
1 parent 26247b4 commit e3e597d

File tree

1 file changed

+30
-25
lines changed

1 file changed

+30
-25
lines changed

lib/AST/UnqualifiedLookup.cpp

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,16 @@ class UnqualifiedLookupFactory {
243243
nonoperatorScopeForASTScopeLookup(DeclContext *dc,
244244
Optional<bool> isCascadingUse) const;
245245

246+
struct DCAndUnresolvedIsCascadingUse {
247+
DeclContext *whereToLook;
248+
Optional<bool> isCascadingUse;
249+
DCAndResolvedIsCascadingUse resolve(const bool resolution) const {
250+
return DCAndResolvedIsCascadingUse{
251+
whereToLook,
252+
isCascadingUse.hasValue() ? isCascadingUse.getValue() : resolution};
253+
}
254+
};
255+
246256
struct ASTScopeLookupState {
247257
const ASTScope *scope;
248258
DeclContext *selfDC;
@@ -282,25 +292,13 @@ class UnqualifiedLookupFactory {
282292

283293
void lookInDeclContexts(DeclContext *dc, const Optional <bool> isCascadingUseArg);
284294

285-
/// Return None if lookup done.
286-
Optional<DCAndResolvedIsCascadingUse>
287-
lookupOperatorInDeclContexts(DeclContext *dc, Optional<bool> isCascadingUse);
295+
void lookupOperatorInDeclContexts(DCAndUnresolvedIsCascadingUse);
288296

289297
/// Return None if lookup done.
290298
Optional<DCAndResolvedIsCascadingUse>
291299
lookupNameInDeclContexts(DeclContext * dc,
292300
const Optional<bool> isCascadingUseArg);
293301

294-
struct DCAndUnresolvedIsCascadingUse {
295-
DeclContext *whereToLook;
296-
Optional<bool> isCascadingUse;
297-
DCAndResolvedIsCascadingUse resolve(const bool resolution) const {
298-
return DCAndResolvedIsCascadingUse{
299-
whereToLook,
300-
isCascadingUse.hasValue() ? isCascadingUse.getValue() : resolution};
301-
}
302-
};
303-
304302
/// Return the next context to search.
305303
Optional<DCAndUnresolvedIsCascadingUse>
306304
lookupNameInOneDeclContext(DCAndUnresolvedIsCascadingUse);
@@ -370,7 +368,11 @@ class UnqualifiedLookupFactory {
370368
static bool resolveIsCascadingUse(const DeclContext *const dc,
371369
Optional<bool> isCascadingUse,
372370
bool onlyCareAboutFunctionBody);
373-
371+
static bool resolveIsCascadingUse(DCAndUnresolvedIsCascadingUse x,
372+
bool onlyCareAboutFunctionBody) {
373+
return resolveIsCascadingUse(x.whereToLook, x.isCascadingUse,
374+
onlyCareAboutFunctionBody);
375+
}
374376
void dumpBreadcrumbs() const;
375377

376378
public:
@@ -652,24 +654,27 @@ void UnqualifiedLookupFactory::lookIntoDeclarationContextForASTScopeLookup(
652654

653655
void
654656
UnqualifiedLookupFactory::lookInDeclContexts(DeclContext *dc, const Optional <bool> isCascadingUseArg) {
655-
//#error move final rnt to tails of next two
656-
auto dcAndIsCascadingUse =
657-
Name.isOperator() ? lookupOperatorInDeclContexts(DC, isCascadingUseArg)
658-
: lookupNameInDeclContexts(DC, isCascadingUseArg);
657+
if (Name.isOperator()) {
658+
lookupOperatorInDeclContexts(
659+
DCAndUnresolvedIsCascadingUse{DC, isCascadingUseArg});
660+
return;
661+
}
662+
auto dcAndIsCascadingUse = lookupNameInDeclContexts(DC, isCascadingUseArg);
659663
if (!dcAndIsCascadingUse.hasValue())
660664
return;
661665
if (addLocalVariableResults(dcAndIsCascadingUse.getValue().DC))
662666
return;
663667
lookInModuleScopeContext(dcAndIsCascadingUse.getValue());
664668
}
665669

666-
Optional<UnqualifiedLookupFactory::DCAndResolvedIsCascadingUse>
667-
UnqualifiedLookupFactory::lookupOperatorInDeclContexts(DeclContext *dc,
668-
Optional<bool> isCascadingUse) {
669-
auto *msc = dc->getModuleScopeContext();
670-
return DCAndResolvedIsCascadingUse{
671-
msc, resolveIsCascadingUse(dc, isCascadingUse,
672-
/*onlyCareAboutFunctionBody*/ true)};
670+
void UnqualifiedLookupFactory::lookupOperatorInDeclContexts(
671+
const DCAndUnresolvedIsCascadingUse dcAndUseArg) {
672+
DCAndResolvedIsCascadingUse dcAndResolvedIsCascadingUse{
673+
dcAndUseArg.whereToLook->getModuleScopeContext(),
674+
resolveIsCascadingUse(dcAndUseArg,
675+
/*onlyCareAboutFunctionBody*/ true)};
676+
if (!addLocalVariableResults(dcAndResolvedIsCascadingUse.DC))
677+
lookInModuleScopeContext(dcAndResolvedIsCascadingUse);
673678
}
674679

675680
// TODO: Unify with LookupVisibleDecls.cpp::lookupVisibleDeclsImpl

0 commit comments

Comments
 (0)