@@ -214,6 +214,19 @@ static void emitProvidesTopLevelNames(
214
214
out << " - \" " << escape (operatorFunction->getName ()) << " \"\n " ;
215
215
}
216
216
217
+ static void emitProvidesExtensionDecl (const ExtensionDecl *ED,
218
+ llvm::raw_fd_ostream &out,
219
+ llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
220
+ llvm::SmallVectorImpl<const FuncDecl *> &memberOperatorDecls,
221
+ llvm::SmallVectorImpl<const ExtensionDecl *> &extensionsWithJustMembers);
222
+
223
+ static void emitProvidesNominalTypeDecl (const NominalTypeDecl *NTD,
224
+ llvm::raw_fd_ostream &out,
225
+ llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
226
+ llvm::SmallVectorImpl<const FuncDecl *> &memberOperatorDecls);
227
+
228
+ static void emitProvidesValueDecl (const ValueDecl *VD, llvm::raw_fd_ostream &out);
229
+
217
230
static void emitProvidesTopLevelDecl (
218
231
const Decl *const D, llvm::raw_fd_ostream &out,
219
232
llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
@@ -227,34 +240,9 @@ static void emitProvidesTopLevelDecl(
227
240
// FIXME: Handle re-exported decls.
228
241
break ;
229
242
230
- case DeclKind::Extension: {
231
- auto *ED = cast<ExtensionDecl>(D);
232
- auto *NTD = ED->getExtendedType ()->getAnyNominal ();
233
- if (!NTD)
234
- break ;
235
- if (NTD->hasAccess () &&
236
- NTD->getFormalAccess () <= AccessLevel::FilePrivate) {
237
- break ;
238
- }
239
-
240
- // Check if the extension is just adding members, or if it is
241
- // introducing a conformance to a public protocol.
242
- bool justMembers =
243
- std::all_of (ED->getInherited ().begin (), ED->getInherited ().end (),
244
- extendedTypeIsPrivate);
245
- if (justMembers) {
246
- if (std::all_of (ED->getMembers ().begin (), ED->getMembers ().end (),
247
- declIsPrivate)) {
248
- break ;
249
- } else {
250
- extensionsWithJustMembers.push_back (ED);
251
- }
252
- }
253
- extendedNominals[NTD] |= !justMembers;
254
- findNominalsAndOperators (extendedNominals, memberOperatorDecls,
255
- ED->getMembers ());
243
+ case DeclKind::Extension:
244
+ emitProvidesExtensionDecl (cast<ExtensionDecl>(D), out, extendedNominals, memberOperatorDecls, extensionsWithJustMembers);
256
245
break ;
257
- }
258
246
259
247
case DeclKind::InfixOperator:
260
248
case DeclKind::PrefixOperator:
@@ -269,34 +257,16 @@ static void emitProvidesTopLevelDecl(
269
257
case DeclKind::Enum:
270
258
case DeclKind::Struct:
271
259
case DeclKind::Class:
272
- case DeclKind::Protocol: {
273
- auto *NTD = cast<NominalTypeDecl>(D);
274
- if (!NTD->hasName ())
275
- break ;
276
- if (NTD->hasAccess () &&
277
- NTD->getFormalAccess () <= AccessLevel::FilePrivate) {
260
+ case DeclKind::Protocol:
261
+ emitProvidesNominalTypeDecl (cast<NominalTypeDecl>(D), out, extendedNominals, memberOperatorDecls);
278
262
break ;
279
- }
280
- out << " - \" " << escape (NTD->getName ()) << " \"\n " ;
281
- extendedNominals[NTD] |= true ;
282
- findNominalsAndOperators (extendedNominals, memberOperatorDecls,
283
- NTD->getMembers ());
284
- break ;
285
- }
286
263
287
264
case DeclKind::TypeAlias:
288
265
case DeclKind::Var:
289
266
case DeclKind::Func:
290
- case DeclKind::Accessor: {
291
- auto *VD = cast<ValueDecl>(D);
292
- if (!VD->hasName ())
293
- break ;
294
- if (VD->hasAccess () && VD->getFormalAccess () <= AccessLevel::FilePrivate) {
267
+ case DeclKind::Accessor:
268
+ emitProvidesValueDecl (cast<ValueDecl>(D), out);
295
269
break ;
296
- }
297
- out << " - \" " << escape (VD->getBaseName ()) << " \"\n " ;
298
- break ;
299
- }
300
270
301
271
case DeclKind::PatternBinding:
302
272
case DeclKind::TopLevelCode:
@@ -317,82 +287,138 @@ static void emitProvidesTopLevelDecl(
317
287
// These can occur in malformed ASTs.
318
288
break ;
319
289
}
320
- }
290
+ }
321
291
322
- static void emitProvidesNominalTypes (
323
- const llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
324
- llvm::raw_fd_ostream &out) {
325
- out << " provides-nominal:\n " ;
326
- for (auto entry : extendedNominals) {
327
- if (!entry.second )
328
- continue ;
329
- out << " - \" " ;
330
- out << mangleTypeAsContext (entry.first );
331
- out << " \"\n " ;
292
+ static void emitProvidesExtensionDecl (const ExtensionDecl *const ED,
293
+ llvm::raw_fd_ostream &out,
294
+ llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
295
+ llvm::SmallVectorImpl<const FuncDecl *> &memberOperatorDecls,
296
+ llvm::SmallVectorImpl<const ExtensionDecl *> &extensionsWithJustMembers) {
297
+ auto *NTD = ED->getExtendedType ()->getAnyNominal ();
298
+ if (!NTD)
299
+ return ;
300
+ if (NTD->hasAccess () &&
301
+ NTD->getFormalAccess () <= AccessLevel::FilePrivate) {
302
+ return ;
303
+ }
304
+
305
+ // Check if the extension is just adding members, or if it is
306
+ // introducing a conformance to a public protocol.
307
+ bool justMembers =
308
+ std::all_of (ED->getInherited ().begin (), ED->getInherited ().end (),
309
+ extendedTypeIsPrivate);
310
+ if (justMembers) {
311
+ if (std::all_of (ED->getMembers ().begin (), ED->getMembers ().end (),
312
+ declIsPrivate)) {
313
+ return ;
332
314
}
315
+ extensionsWithJustMembers.push_back (ED);
333
316
}
317
+ extendedNominals[NTD] |= !justMembers;
318
+ findNominalsAndOperators (extendedNominals, memberOperatorDecls,
319
+ ED->getMembers ());
320
+ }
334
321
335
- static void emitProvidesMembers (
336
- const llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
337
- const llvm::SmallVectorImpl<const ExtensionDecl *>
338
- &extensionsWithJustMembers,
339
- llvm::raw_fd_ostream &out) {
340
- out << " provides-member:\n " ;
341
- for (auto entry : extendedNominals) {
342
- out << " - [\" " ;
343
- out << mangleTypeAsContext (entry.first );
344
- out << " \" , \"\" ]\n " ;
345
- }
322
+ static void emitProvidesNominalTypeDecl (const NominalTypeDecl *const NTD,
323
+ llvm::raw_fd_ostream &out,
324
+ llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
325
+ llvm::SmallVectorImpl<const FuncDecl *> &memberOperatorDecls) {
326
+ if (!NTD->hasName ())
327
+ return ;
328
+ if (NTD->hasAccess () &&
329
+ NTD->getFormalAccess () <= AccessLevel::FilePrivate) {
330
+ return ;
331
+ }
332
+ out << " - \" " << escape (NTD->getName ()) << " \"\n " ;
333
+ extendedNominals[NTD] |= true ;
334
+ findNominalsAndOperators (extendedNominals, memberOperatorDecls,
335
+ NTD->getMembers ());
336
+ }
337
+
338
+ static void emitProvidesValueDecl (const ValueDecl *const VD, llvm::raw_fd_ostream &out) {
339
+ if (!VD->hasName ())
340
+ return ;
341
+ if (VD->hasAccess () && VD->getFormalAccess () <= AccessLevel::FilePrivate) {
342
+ return ;
343
+ }
344
+ out << " - \" " << escape (VD->getBaseName ()) << " \"\n " ;
345
+ }
346
346
347
- // This is also part of "provides-member".
348
- for (auto *ED : extensionsWithJustMembers) {
349
- auto mangledName =
350
- mangleTypeAsContext (ED->getExtendedType ()->getAnyNominal ());
351
-
352
- for (auto *member : ED->getMembers ()) {
353
- auto *VD = dyn_cast<ValueDecl>(member);
354
- if (!VD || !VD->hasName () ||
355
- VD->getFormalAccess () <= AccessLevel::FilePrivate) {
356
- continue ;
357
- }
358
- out << " - [\" " << mangledName << " \" , \" " << escape (VD->getBaseName ())
359
- << " \" ]\n " ;
347
+
348
+ static void emitProvidesNominalTypes (
349
+ const llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
350
+ llvm::raw_fd_ostream &out) {
351
+ out << " provides-nominal:\n " ;
352
+ for (auto entry : extendedNominals) {
353
+ if (!entry.second )
354
+ continue ;
355
+ out << " - \" " ;
356
+ out << mangleTypeAsContext (entry.first );
357
+ out << " \"\n " ;
358
+ }
359
+ }
360
+
361
+ static void emitProvidesMembers (
362
+ const llvm::MapVector<const NominalTypeDecl *, bool > &extendedNominals,
363
+ const llvm::SmallVectorImpl<const ExtensionDecl *>
364
+ &extensionsWithJustMembers,
365
+ llvm::raw_fd_ostream &out) {
366
+ out << " provides-member:\n " ;
367
+ for (auto entry : extendedNominals) {
368
+ out << " - [\" " ;
369
+ out << mangleTypeAsContext (entry.first );
370
+ out << " \" , \"\" ]\n " ;
371
+ }
372
+
373
+ // This is also part of "provides-member".
374
+ for (auto *ED : extensionsWithJustMembers) {
375
+ auto mangledName =
376
+ mangleTypeAsContext (ED->getExtendedType ()->getAnyNominal ());
377
+
378
+ for (auto *member : ED->getMembers ()) {
379
+ auto *VD = dyn_cast<ValueDecl>(member);
380
+ if (!VD || !VD->hasName () ||
381
+ VD->getFormalAccess () <= AccessLevel::FilePrivate) {
382
+ continue ;
360
383
}
384
+ out << " - [\" " << mangledName << " \" , \" " << escape (VD->getBaseName ())
385
+ << " \" ]\n " ;
361
386
}
362
387
}
388
+ }
363
389
364
- static void emitProvidesDynamicLookupMembers (const SourceFile *const SF,
365
- llvm::raw_fd_ostream &out) {
366
- if (SF->getASTContext ().LangOpts .EnableObjCInterop ) {
367
- // FIXME: This requires a traversal of the whole file to compute.
368
- // We should (a) see if there's a cheaper way to keep it up to date,
369
- // and/or (b) see if we can fast-path cases where there's no ObjC
370
- // involved.
371
- out << " provides-dynamic-lookup:\n " ;
372
- class NameCollector : public VisibleDeclConsumer {
373
- private:
374
- SmallVector<DeclBaseName, 16 > names;
375
-
376
- public:
377
- void foundDecl (ValueDecl *VD, DeclVisibilityKind Reason) override {
378
- names.push_back (VD->getBaseName ());
379
- }
380
- ArrayRef<DeclBaseName> getNames () {
381
- llvm::array_pod_sort (
382
- names.begin (), names.end (),
383
- [](const DeclBaseName *lhs, const DeclBaseName *rhs) {
384
- return lhs->compare (*rhs);
385
- });
386
- names.erase (std::unique (names.begin (), names.end ()), names.end ());
387
- return names;
388
- }
389
- };
390
- NameCollector collector;
391
- SF->lookupClassMembers ({}, collector);
392
- for (DeclBaseName name : collector.getNames ()) {
393
- out << " - \" " << escape (name) << " \"\n " ;
390
+ static void emitProvidesDynamicLookupMembers (const SourceFile *const SF,
391
+ llvm::raw_fd_ostream &out) {
392
+ if (SF->getASTContext ().LangOpts .EnableObjCInterop ) {
393
+ // FIXME: This requires a traversal of the whole file to compute.
394
+ // We should (a) see if there's a cheaper way to keep it up to date,
395
+ // and/or (b) see if we can fast-path cases where there's no ObjC
396
+ // involved.
397
+ out << " provides-dynamic-lookup:\n " ;
398
+ class NameCollector : public VisibleDeclConsumer {
399
+ private:
400
+ SmallVector<DeclBaseName, 16 > names;
401
+
402
+ public:
403
+ void foundDecl (ValueDecl *VD, DeclVisibilityKind Reason) override {
404
+ names.push_back (VD->getBaseName ());
394
405
}
406
+ ArrayRef<DeclBaseName> getNames () {
407
+ llvm::array_pod_sort (
408
+ names.begin (), names.end (),
409
+ [](const DeclBaseName *lhs, const DeclBaseName *rhs) {
410
+ return lhs->compare (*rhs);
411
+ });
412
+ names.erase (std::unique (names.begin (), names.end ()), names.end ());
413
+ return names;
414
+ }
415
+ };
416
+ NameCollector collector;
417
+ SF->lookupClassMembers ({}, collector);
418
+ for (DeclBaseName name : collector.getNames ()) {
419
+ out << " - \" " << escape (name) << " \"\n " ;
395
420
}
421
+ }
396
422
}
397
423
398
424
static SmallVector<std::pair<DeclBaseName, bool >, 16 >
0 commit comments