Skip to content

Commit abe7544

Browse files
David Ungardavidungar
David Ungar
authored andcommitted
Subdivide emitting a provides decl.
1 parent d53122f commit abe7544

File tree

1 file changed

+140
-114
lines changed

1 file changed

+140
-114
lines changed

Diff for: lib/FrontendTool/ReferenceDependencies.cpp

+140-114
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,19 @@ static void emitProvidesTopLevelNames(
214214
out << "- \"" << escape(operatorFunction->getName()) << "\"\n";
215215
}
216216

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+
217230
static void emitProvidesTopLevelDecl(
218231
const Decl *const D, llvm::raw_fd_ostream &out,
219232
llvm::MapVector<const NominalTypeDecl *, bool> &extendedNominals,
@@ -227,34 +240,9 @@ static void emitProvidesTopLevelDecl(
227240
// FIXME: Handle re-exported decls.
228241
break;
229242

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);
256245
break;
257-
}
258246

259247
case DeclKind::InfixOperator:
260248
case DeclKind::PrefixOperator:
@@ -269,34 +257,16 @@ static void emitProvidesTopLevelDecl(
269257
case DeclKind::Enum:
270258
case DeclKind::Struct:
271259
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);
278262
break;
279-
}
280-
out << "- \"" << escape(NTD->getName()) << "\"\n";
281-
extendedNominals[NTD] |= true;
282-
findNominalsAndOperators(extendedNominals, memberOperatorDecls,
283-
NTD->getMembers());
284-
break;
285-
}
286263

287264
case DeclKind::TypeAlias:
288265
case DeclKind::Var:
289266
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);
295269
break;
296-
}
297-
out << "- \"" << escape(VD->getBaseName()) << "\"\n";
298-
break;
299-
}
300270

301271
case DeclKind::PatternBinding:
302272
case DeclKind::TopLevelCode:
@@ -317,82 +287,138 @@ static void emitProvidesTopLevelDecl(
317287
// These can occur in malformed ASTs.
318288
break;
319289
}
320-
}
290+
}
321291

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;
332314
}
315+
extensionsWithJustMembers.push_back(ED);
333316
}
317+
extendedNominals[NTD] |= !justMembers;
318+
findNominalsAndOperators(extendedNominals, memberOperatorDecls,
319+
ED->getMembers());
320+
}
334321

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+
}
346346

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;
360383
}
384+
out << "- [\"" << mangledName << "\", \"" << escape(VD->getBaseName())
385+
<< "\"]\n";
361386
}
362387
}
388+
}
363389

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());
394405
}
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";
395420
}
421+
}
396422
}
397423

398424
static SmallVector<std::pair<DeclBaseName, bool>, 16>

0 commit comments

Comments
 (0)