Skip to content

Commit d22d189

Browse files
authored
Merge pull request swiftlang#31456 from hamishknight/operational-dependencies
2 parents 005f8ad + 22c6464 commit d22d189

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)