@@ -110,6 +110,8 @@ using DependencySource = llvm::PointerIntPair<SourceFile *, 1, DependencyScope>;
110110struct DependencyRecorder ;
111111
112112struct DependencyCollector {
113+ friend DependencyRecorder;
114+
113115 struct Reference {
114116 public:
115117 enum class Kind {
@@ -123,38 +125,41 @@ struct DependencyCollector {
123125
124126 NominalTypeDecl *subject;
125127 DeclBaseName name;
128+ bool cascades;
126129
127130 private:
128- Reference (Kind kind, NominalTypeDecl *subject, DeclBaseName name)
129- : kind(kind), subject(subject), name(name) {}
131+ Reference (Kind kind, NominalTypeDecl *subject, DeclBaseName name,
132+ bool cascades)
133+ : kind(kind), subject(subject), name(name), cascades(cascades) {}
130134
131135 public:
132136 static Reference empty () {
133137 return {Kind::Empty, llvm::DenseMapInfo<NominalTypeDecl *>::getEmptyKey (),
134- llvm::DenseMapInfo<DeclBaseName>::getEmptyKey ()};
138+ llvm::DenseMapInfo<DeclBaseName>::getEmptyKey (), false };
135139 }
136140
137141 static Reference tombstone () {
138- return {Kind::Empty ,
142+ return {Kind::Tombstone ,
139143 llvm::DenseMapInfo<NominalTypeDecl *>::getTombstoneKey (),
140- llvm::DenseMapInfo<DeclBaseName>::getTombstoneKey ()};
144+ llvm::DenseMapInfo<DeclBaseName>::getTombstoneKey (), false };
141145 }
142146
143147 public:
144- static Reference usedMember (NominalTypeDecl *subject, DeclBaseName name) {
145- return {Kind::UsedMember, subject, name};
148+ static Reference usedMember (NominalTypeDecl *subject, DeclBaseName name,
149+ bool cascades) {
150+ return {Kind::UsedMember, subject, name, cascades};
146151 }
147152
148- static Reference potentialMember (NominalTypeDecl *subject) {
149- return {Kind::PotentialMember, subject, DeclBaseName ()};
153+ static Reference potentialMember (NominalTypeDecl *subject, bool cascades ) {
154+ return {Kind::PotentialMember, subject, DeclBaseName (), cascades };
150155 }
151156
152- static Reference topLevel (DeclBaseName name) {
153- return {Kind::TopLevel, nullptr , name};
157+ static Reference topLevel (DeclBaseName name, bool cascades ) {
158+ return {Kind::TopLevel, nullptr , name, cascades };
154159 }
155160
156- static Reference dynamic (DeclBaseName name) {
157- return {Kind::Dynamic, nullptr , name};
161+ static Reference dynamic (DeclBaseName name, bool cascades ) {
162+ return {Kind::Dynamic, nullptr , name, cascades };
158163 }
159164
160165 public:
@@ -174,8 +179,12 @@ struct DependencyCollector {
174179 };
175180 };
176181
182+ public:
183+ using ReferenceSet = llvm::DenseSet<Reference, Reference::Info>;
184+
185+ private:
177186 DependencyRecorder &parent;
178- llvm::DenseSet<Reference, Reference::Info> scratch;
187+ ReferenceSet scratch;
179188
180189public:
181190 explicit DependencyCollector (DependencyRecorder &parent) : parent(parent) {}
@@ -226,11 +235,7 @@ struct DependencyCollector {
226235// / particular \c DependencyScope during the course of request evaluation.
227236struct DependencyRecorder {
228237 friend DependencyCollector;
229- private:
230- // / A stack of dependency sources in the order they were evaluated.
231- llvm::SmallVector<evaluator::DependencySource, 8 > dependencySources;
232238
233- public:
234239 enum class Mode {
235240 // Enables the current "status quo" behavior of the dependency collector.
236241 //
@@ -244,14 +249,19 @@ struct DependencyRecorder {
244249 // the primary file being acted upon instead of to the destination file.
245250 ExperimentalPrivateDependencies,
246251 };
247- Mode mode;
248- llvm::DenseMap<AnyRequest, llvm::DenseSet<DependencyCollector::Reference,
249- DependencyCollector::Reference::Info>>
252+
253+ private:
254+ // / A stack of dependency sources in the order they were evaluated.
255+ llvm::SmallVector<evaluator::DependencySource, 8 > dependencySources;
256+ llvm::DenseMap<SourceFile *, DependencyCollector::ReferenceSet>
257+ fileReferences;
258+ llvm::DenseMap<AnyRequest, DependencyCollector::ReferenceSet>
250259 requestReferences;
260+ Mode mode;
251261 bool isRecording;
252262
253- explicit DependencyRecorder (Mode mode)
254- : mode{mode}, requestReferences{ }, isRecording{false } {};
263+ public:
264+ explicit DependencyRecorder (Mode mode) : mode{mode}, isRecording{false } {};
255265
256266private:
257267 void realize (const DependencyCollector::Reference &ref);
@@ -261,6 +271,12 @@ struct DependencyRecorder {
261271 void record (const llvm::SetVector<swift::ActiveRequest> &stack,
262272 llvm::function_ref<void (DependencyCollector &)> rec);
263273
274+ public:
275+ using ReferenceEnumerator =
276+ llvm::function_ref<void (const DependencyCollector::Reference &)>;
277+ void enumerateReferencesInFile (const SourceFile *SF,
278+ ReferenceEnumerator f) const ;
279+
264280public:
265281 // / Returns the scope of the current active scope.
266282 // /
@@ -323,25 +339,6 @@ struct DependencyRecorder {
323339 return dependencySources.front ().getPointer ();
324340 }
325341
326- // / If there is an active dependency source, returns its
327- // / \c ReferencedNameTracker. Else, returns \c nullptr.
328- ReferencedNameTracker *getActiveDependencyTracker () const {
329- SourceFile *source = nullptr ;
330- switch (mode) {
331- case Mode::StatusQuo:
332- source = getActiveDependencySourceOrNull ();
333- break ;
334- case Mode::ExperimentalPrivateDependencies:
335- source = getFirstDependencySourceOrNull ();
336- break ;
337- }
338-
339- if (!source)
340- return nullptr ;
341-
342- return source->getRequestBasedReferencedNameTracker ();
343- }
344-
345342 // / Returns \c true if the scope of the current active source cascades.
346343 // /
347344 // / If there is no active scope, the result always cascades.
0 commit comments