Skip to content

Commit 22c6464

Browse files
committed
Register operator dependencies on direct lookup requests
Make sure a dependency gets registered when a direct lookup is fired off. This is necessary in order to ensure that operator redeclaration checking records the right dependencies (and any future logic that might want to perform direct operator lookups). In doing so, this commit also removes the compatibility logic for the old referenced name tracker that would skip recording dependencies in certain cases. This should be safe as the new logic will record strictly more dependencies than the old logic.
1 parent 1f5dcf0 commit 22c6464

File tree

2 files changed

+32
-39
lines changed

2 files changed

+32
-39
lines changed

include/swift/AST/NameLookupRequests.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -649,16 +649,15 @@ template <typename OperatorType>
649649
class LookupOperatorRequest
650650
: public SimpleRequest<LookupOperatorRequest<OperatorType>,
651651
OperatorType *(OperatorLookupDescriptor),
652-
RequestFlags::Cached|RequestFlags::DependencySink> {
652+
RequestFlags::Cached> {
653653
using SimpleRequest<LookupOperatorRequest<OperatorType>,
654654
OperatorType *(OperatorLookupDescriptor),
655-
RequestFlags::Cached |
656-
RequestFlags::DependencySink>::SimpleRequest;
655+
RequestFlags::Cached>::SimpleRequest;
657656

658657
private:
659658
friend SimpleRequest<LookupOperatorRequest<OperatorType>,
660659
OperatorType *(OperatorLookupDescriptor),
661-
RequestFlags::Cached|RequestFlags::DependencySink>;
660+
RequestFlags::Cached>;
662661

663662
// Evaluation.
664663
OperatorType *evaluate(Evaluator &evaluator,
@@ -667,11 +666,6 @@ class LookupOperatorRequest
667666
public:
668667
// Cached.
669668
bool isCached() const { return true; }
670-
671-
public:
672-
// Incremental dependencies
673-
void writeDependencySink(evaluator::DependencyCollector &tracker,
674-
OperatorType *o) const;
675669
};
676670

677671
using LookupPrefixOperatorRequest = LookupOperatorRequest<PrefixOperatorDecl>;
@@ -685,7 +679,8 @@ class DirectOperatorLookupRequest
685679
: public SimpleRequest<DirectOperatorLookupRequest,
686680
TinyPtrVector<OperatorDecl *>(
687681
OperatorLookupDescriptor, OperatorFixity),
688-
RequestFlags::Uncached> {
682+
RequestFlags::Uncached |
683+
RequestFlags::DependencySink> {
689684
public:
690685
using SimpleRequest::SimpleRequest;
691686

@@ -695,6 +690,11 @@ class DirectOperatorLookupRequest
695690
TinyPtrVector<OperatorDecl *>
696691
evaluate(Evaluator &evaluator, OperatorLookupDescriptor descriptor,
697692
OperatorFixity fixity) const;
693+
694+
public:
695+
// Incremental dependencies.
696+
void writeDependencySink(evaluator::DependencyCollector &tracker,
697+
TinyPtrVector<OperatorDecl *> ops) const;
698698
};
699699

700700
/// Looks up an precedencegroup in a given file or module without looking
@@ -703,7 +703,8 @@ class DirectPrecedenceGroupLookupRequest
703703
: public SimpleRequest<DirectPrecedenceGroupLookupRequest,
704704
TinyPtrVector<PrecedenceGroupDecl *>(
705705
OperatorLookupDescriptor),
706-
RequestFlags::Uncached> {
706+
RequestFlags::Uncached |
707+
RequestFlags::DependencySink> {
707708
public:
708709
using SimpleRequest::SimpleRequest;
709710

@@ -712,6 +713,11 @@ class DirectPrecedenceGroupLookupRequest
712713

713714
TinyPtrVector<PrecedenceGroupDecl *>
714715
evaluate(Evaluator &evaluator, OperatorLookupDescriptor descriptor) const;
716+
717+
public:
718+
// Incremental dependencies.
719+
void writeDependencySink(evaluator::DependencyCollector &tracker,
720+
TinyPtrVector<PrecedenceGroupDecl *> groups) const;
715721
};
716722

717723
class LookupConformanceDescriptor final {

lib/AST/Module.cpp

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,48 +1287,28 @@ OperatorType *LookupOperatorRequest<OperatorType>::evaluate(
12871287
return result.hasValue() ? result.getValue() : nullptr;
12881288
}
12891289

1290-
template <typename OperatorType>
1291-
void LookupOperatorRequest<OperatorType>::writeDependencySink(
1292-
evaluator::DependencyCollector &reqTracker, OperatorType *o) const {
1293-
auto &desc = std::get<0>(this->getStorage());
1294-
auto *FU = desc.fileOrModule.template get<FileUnit *>();
1295-
auto shouldRegisterDependencyEdge = [&FU](OperatorType *o) -> bool {
1296-
if (!o)
1297-
return true;
1298-
1299-
auto *topLevelContext = o->getDeclContext()->getModuleScopeContext();
1300-
return topLevelContext != FU;
1301-
};
1302-
1303-
// FIXME(Evaluator Incremental Dependencies): This is all needlessly complex.
1304-
// For one, it does not take into account the fact that precedence groups can
1305-
// be shadowed, and so should be registered regardless of their defining
1306-
// module. Second, lookups for operators within the file define a valid named
1307-
// dependency just as much as lookups outside of the current source file.
1308-
if (!shouldRegisterDependencyEdge(o)) {
1309-
return;
1310-
}
1311-
1312-
reqTracker.addTopLevelName(desc.name);
1313-
}
1314-
13151290
#define LOOKUP_OPERATOR(Kind) \
13161291
Kind##Decl *ModuleDecl::lookup##Kind(Identifier name, SourceLoc loc) { \
13171292
auto result = lookupOperatorDeclForName<Kind##Decl>( \
13181293
this, loc, name, /*isCascading*/ false); \
13191294
return result ? *result : nullptr; \
13201295
} \
13211296
template Kind##Decl *LookupOperatorRequest<Kind##Decl>::evaluate( \
1322-
Evaluator &e, OperatorLookupDescriptor) const; \
1323-
template void LookupOperatorRequest<Kind##Decl>::writeDependencySink( \
1324-
evaluator::DependencyCollector &, Kind##Decl *) const;
1297+
Evaluator &e, OperatorLookupDescriptor) const;
13251298

13261299
LOOKUP_OPERATOR(PrefixOperator)
13271300
LOOKUP_OPERATOR(InfixOperator)
13281301
LOOKUP_OPERATOR(PostfixOperator)
13291302
LOOKUP_OPERATOR(PrecedenceGroup)
13301303
#undef LOOKUP_OPERATOR
13311304

1305+
void DirectOperatorLookupRequest::writeDependencySink(
1306+
evaluator::DependencyCollector &reqTracker,
1307+
TinyPtrVector<OperatorDecl *> ops) const {
1308+
auto &desc = std::get<0>(getStorage());
1309+
reqTracker.addTopLevelName(desc.name);
1310+
}
1311+
13321312
TinyPtrVector<OperatorDecl *>
13331313
DirectOperatorLookupRequest::evaluate(Evaluator &evaluator,
13341314
OperatorLookupDescriptor descriptor,
@@ -1357,6 +1337,13 @@ void SourceFile::lookupOperatorDirect(
13571337
getCache().lookupOperator(name, fixity, results);
13581338
}
13591339

1340+
void DirectPrecedenceGroupLookupRequest::writeDependencySink(
1341+
evaluator::DependencyCollector &reqTracker,
1342+
TinyPtrVector<PrecedenceGroupDecl *> groups) const {
1343+
auto &desc = std::get<0>(getStorage());
1344+
reqTracker.addTopLevelName(desc.name);
1345+
}
1346+
13601347
TinyPtrVector<PrecedenceGroupDecl *>
13611348
DirectPrecedenceGroupLookupRequest::evaluate(
13621349
Evaluator &evaluator, OperatorLookupDescriptor descriptor) const {

0 commit comments

Comments
 (0)