@@ -110,6 +110,8 @@ using DependencySource = llvm::PointerIntPair<SourceFile *, 1, DependencyScope>;
110
110
struct DependencyRecorder ;
111
111
112
112
struct DependencyCollector {
113
+ friend DependencyRecorder;
114
+
113
115
struct Reference {
114
116
public:
115
117
enum class Kind {
@@ -123,38 +125,41 @@ struct DependencyCollector {
123
125
124
126
NominalTypeDecl *subject;
125
127
DeclBaseName name;
128
+ bool cascades;
126
129
127
130
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) {}
130
134
131
135
public:
132
136
static Reference empty () {
133
137
return {Kind::Empty, llvm::DenseMapInfo<NominalTypeDecl *>::getEmptyKey (),
134
- llvm::DenseMapInfo<DeclBaseName>::getEmptyKey ()};
138
+ llvm::DenseMapInfo<DeclBaseName>::getEmptyKey (), false };
135
139
}
136
140
137
141
static Reference tombstone () {
138
- return {Kind::Empty ,
142
+ return {Kind::Tombstone ,
139
143
llvm::DenseMapInfo<NominalTypeDecl *>::getTombstoneKey (),
140
- llvm::DenseMapInfo<DeclBaseName>::getTombstoneKey ()};
144
+ llvm::DenseMapInfo<DeclBaseName>::getTombstoneKey (), false };
141
145
}
142
146
143
147
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};
146
151
}
147
152
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 };
150
155
}
151
156
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 };
154
159
}
155
160
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 };
158
163
}
159
164
160
165
public:
@@ -174,8 +179,12 @@ struct DependencyCollector {
174
179
};
175
180
};
176
181
182
+ public:
183
+ using ReferenceSet = llvm::DenseSet<Reference, Reference::Info>;
184
+
185
+ private:
177
186
DependencyRecorder &parent;
178
- llvm::DenseSet<Reference, Reference::Info> scratch;
187
+ ReferenceSet scratch;
179
188
180
189
public:
181
190
explicit DependencyCollector (DependencyRecorder &parent) : parent(parent) {}
@@ -226,11 +235,7 @@ struct DependencyCollector {
226
235
// / particular \c DependencyScope during the course of request evaluation.
227
236
struct DependencyRecorder {
228
237
friend DependencyCollector;
229
- private:
230
- // / A stack of dependency sources in the order they were evaluated.
231
- llvm::SmallVector<evaluator::DependencySource, 8 > dependencySources;
232
238
233
- public:
234
239
enum class Mode {
235
240
// Enables the current "status quo" behavior of the dependency collector.
236
241
//
@@ -244,14 +249,19 @@ struct DependencyRecorder {
244
249
// the primary file being acted upon instead of to the destination file.
245
250
ExperimentalPrivateDependencies,
246
251
};
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>
250
259
requestReferences;
260
+ Mode mode;
251
261
bool isRecording;
252
262
253
- explicit DependencyRecorder (Mode mode)
254
- : mode{mode}, requestReferences{ }, isRecording{false } {};
263
+ public:
264
+ explicit DependencyRecorder (Mode mode) : mode{mode}, isRecording{false } {};
255
265
256
266
private:
257
267
void realize (const DependencyCollector::Reference &ref);
@@ -261,6 +271,12 @@ struct DependencyRecorder {
261
271
void record (const llvm::SetVector<swift::ActiveRequest> &stack,
262
272
llvm::function_ref<void (DependencyCollector &)> rec);
263
273
274
+ public:
275
+ using ReferenceEnumerator =
276
+ llvm::function_ref<void (const DependencyCollector::Reference &)>;
277
+ void enumerateReferencesInFile (const SourceFile *SF,
278
+ ReferenceEnumerator f) const ;
279
+
264
280
public:
265
281
// / Returns the scope of the current active scope.
266
282
// /
@@ -323,25 +339,6 @@ struct DependencyRecorder {
323
339
return dependencySources.front ().getPointer ();
324
340
}
325
341
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
-
345
342
// / Returns \c true if the scope of the current active source cascades.
346
343
// /
347
344
// / If there is no active scope, the result always cascades.
0 commit comments