Skip to content

Commit cac8297

Browse files
Revert "[SymbolGraphGen] synthesize child symbols for type aliases of private…" (swiftlang#79062)
This reverts commit b1871fb.
1 parent 38c0ce5 commit cac8297

File tree

8 files changed

+62
-226
lines changed

8 files changed

+62
-226
lines changed

lib/SymbolGraphGen/Symbol.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,19 @@ using namespace swift;
3737
using namespace symbolgraphgen;
3838

3939
Symbol::Symbol(SymbolGraph *Graph, const ExtensionDecl *ED,
40-
const ValueDecl *SynthesizedBaseTypeDecl, Type BaseType)
40+
const NominalTypeDecl *SynthesizedBaseTypeDecl, Type BaseType)
4141
: Symbol::Symbol(Graph, nullptr, ED, SynthesizedBaseTypeDecl, BaseType) {}
4242

4343
Symbol::Symbol(SymbolGraph *Graph, const ValueDecl *VD,
44-
const ValueDecl *SynthesizedBaseTypeDecl, Type BaseType)
44+
const NominalTypeDecl *SynthesizedBaseTypeDecl, Type BaseType)
4545
: Symbol::Symbol(Graph, VD, nullptr, SynthesizedBaseTypeDecl, BaseType) {}
4646

4747
Symbol::Symbol(SymbolGraph *Graph, const ValueDecl *VD, const ExtensionDecl *ED,
48-
const ValueDecl *SynthesizedBaseTypeDecl, Type BaseType)
48+
const NominalTypeDecl *SynthesizedBaseTypeDecl, Type BaseType)
4949
: Graph(Graph), D(VD), BaseType(BaseType),
5050
SynthesizedBaseTypeDecl(SynthesizedBaseTypeDecl) {
51-
if (!BaseType && SynthesizedBaseTypeDecl) {
52-
if (const auto *NTD = dyn_cast<NominalTypeDecl>(SynthesizedBaseTypeDecl))
53-
BaseType = NTD->getDeclaredInterfaceType();
54-
}
51+
if (!BaseType && SynthesizedBaseTypeDecl)
52+
BaseType = SynthesizedBaseTypeDecl->getDeclaredInterfaceType();
5553
if (D == nullptr) {
5654
D = ED;
5755
}

lib/SymbolGraphGen/Symbol.h

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ class Symbol {
3535
/// Either a ValueDecl* or ExtensionDecl*.
3636
const Decl *D;
3737
Type BaseType;
38-
const ValueDecl *SynthesizedBaseTypeDecl;
38+
const NominalTypeDecl *SynthesizedBaseTypeDecl;
3939

4040
Symbol(SymbolGraph *Graph, const ValueDecl *VD, const ExtensionDecl *ED,
41-
const ValueDecl *SynthesizedBaseTypeDecl,
41+
const NominalTypeDecl *SynthesizedBaseTypeDecl,
4242
Type BaseTypeForSubstitution = Type());
4343

4444
swift::DeclName getName(const Decl *D) const;
@@ -87,11 +87,11 @@ class Symbol {
8787

8888
public:
8989
Symbol(SymbolGraph *Graph, const ExtensionDecl *ED,
90-
const ValueDecl *SynthesizedBaseTypeDecl,
90+
const NominalTypeDecl *SynthesizedBaseTypeDecl,
9191
Type BaseTypeForSubstitution = Type());
9292

9393
Symbol(SymbolGraph *Graph, const ValueDecl *VD,
94-
const ValueDecl *SynthesizedBaseTypeDecl,
94+
const NominalTypeDecl *SynthesizedBaseTypeDecl,
9595
Type BaseTypeForSubstitution = Type());
9696

9797
void serialize(llvm::json::OStream &OS) const;
@@ -108,7 +108,7 @@ class Symbol {
108108
return BaseType;
109109
}
110110

111-
const ValueDecl *getSynthesizedBaseTypeDecl() const {
111+
const NominalTypeDecl *getSynthesizedBaseTypeDecl() const {
112112
return SynthesizedBaseTypeDecl;
113113
}
114114

@@ -175,28 +175,27 @@ using SymbolGraph = swift::symbolgraphgen::SymbolGraph;
175175

176176
template <> struct DenseMapInfo<Symbol> {
177177
static inline Symbol getEmptyKey() {
178-
return Symbol{
179-
DenseMapInfo<SymbolGraph *>::getEmptyKey(),
180-
DenseMapInfo<const swift::ValueDecl *>::getEmptyKey(),
181-
DenseMapInfo<const swift::ValueDecl *>::getTombstoneKey(),
182-
DenseMapInfo<swift::Type>::getEmptyKey(),
178+
return Symbol {
179+
DenseMapInfo<SymbolGraph *>::getEmptyKey(),
180+
DenseMapInfo<const swift::ValueDecl *>::getEmptyKey(),
181+
DenseMapInfo<const swift::NominalTypeDecl *>::getTombstoneKey(),
182+
DenseMapInfo<swift::Type>::getEmptyKey(),
183183
};
184184
}
185185
static inline Symbol getTombstoneKey() {
186-
return Symbol{
187-
DenseMapInfo<SymbolGraph *>::getTombstoneKey(),
188-
DenseMapInfo<const swift::ValueDecl *>::getTombstoneKey(),
189-
DenseMapInfo<const swift::ValueDecl *>::getTombstoneKey(),
190-
DenseMapInfo<swift::Type>::getTombstoneKey(),
186+
return Symbol {
187+
DenseMapInfo<SymbolGraph *>::getTombstoneKey(),
188+
DenseMapInfo<const swift::ValueDecl *>::getTombstoneKey(),
189+
DenseMapInfo<const swift::NominalTypeDecl *>::getTombstoneKey(),
190+
DenseMapInfo<swift::Type>::getTombstoneKey(),
191191
};
192192
}
193193
static unsigned getHashValue(const Symbol S) {
194194
unsigned H = 0;
195195
H ^= DenseMapInfo<SymbolGraph *>::getHashValue(S.getGraph());
196196
H ^=
197197
DenseMapInfo<const swift::Decl *>::getHashValue(S.getLocalSymbolDecl());
198-
H ^= DenseMapInfo<const swift::ValueDecl *>::getHashValue(
199-
S.getSynthesizedBaseTypeDecl());
198+
H ^= DenseMapInfo<const swift::NominalTypeDecl *>::getHashValue(S.getSynthesizedBaseTypeDecl());
200199
H ^= DenseMapInfo<swift::Type>::getHashValue(S.getBaseType());
201200
return H;
202201
}

lib/SymbolGraphGen/SymbolGraph.cpp

Lines changed: 34 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -233,18 +233,6 @@ void SymbolGraph::recordEdge(Symbol Source,
233233

234234
void SymbolGraph::recordMemberRelationship(Symbol S) {
235235
const auto *DC = S.getLocalSymbolDecl()->getDeclContext();
236-
const ValueDecl *ParentDecl = DC->getSelfNominalTypeDecl();
237-
if (!ParentDecl) {
238-
// If we couldn't look up the type the member is declared on (e.g.
239-
// because the member is declared in an extension whose extended type
240-
// doesn't exist), don't record a memberOf relationship.
241-
return;
242-
}
243-
if (const auto *PublicDecl = Walker.PublicPrivateTypeAliases[ParentDecl]) {
244-
// If our member target is a private type that has a public type alias,
245-
// point the membership to that type alias instead.
246-
ParentDecl = PublicDecl;
247-
}
248236
switch (DC->getContextKind()) {
249237
case DeclContextKind::GenericTypeDecl:
250238
case DeclContextKind::ExtensionDecl:
@@ -263,6 +251,13 @@ void SymbolGraph::recordMemberRelationship(Symbol S) {
263251
return;
264252
}
265253

254+
if (DC->getSelfNominalTypeDecl() == nullptr) {
255+
// If we couldn't look up the type the member is declared on (e.g.
256+
// because the member is declared in an extension whose extended type
257+
// doesn't exist), don't record a memberOf relationship.
258+
return;
259+
}
260+
266261
// If this is an extension to an external type, we use the extension
267262
// symbol itself as the target.
268263
if (auto const *Extension =
@@ -274,7 +269,8 @@ void SymbolGraph::recordMemberRelationship(Symbol S) {
274269
}
275270
}
276271

277-
return recordEdge(S, Symbol(this, ParentDecl, nullptr),
272+
return recordEdge(S,
273+
Symbol(this, DC->getSelfNominalTypeDecl(), nullptr),
278274
RelationshipKind::MemberOf());
279275
case swift::DeclContextKind::AbstractClosureExpr:
280276
case swift::DeclContextKind::SerializedAbstractClosure:
@@ -327,16 +323,7 @@ void SymbolGraph::recordConformanceSynthesizedMemberRelationships(Symbol S) {
327323
bool dropSynthesizedMembers = !Walker.Options.EmitSynthesizedMembers ||
328324
Walker.Options.SkipProtocolImplementations;
329325

330-
const auto *D = S.getLocalSymbolDecl();
331-
332-
// If this symbol is a public type alias to a private symbol, collect
333-
// synthesized members for the underlying type.
334-
if (const auto *TD = dyn_cast<TypeAliasDecl>(D)) {
335-
const auto *NTD = TD->getUnderlyingType()->getAnyNominal();
336-
if (NTD && Walker.PublicPrivateTypeAliases[NTD] == D)
337-
D = NTD;
338-
}
339-
326+
const auto D = S.getLocalSymbolDecl();
340327
const NominalTypeDecl *OwningNominal = nullptr;
341328
if (const auto *ThisNominal = dyn_cast<NominalTypeDecl>(D)) {
342329
OwningNominal = ThisNominal;
@@ -389,11 +376,9 @@ void SymbolGraph::recordConformanceSynthesizedMemberRelationships(Symbol S) {
389376
// that protocol would otherwise be hidden.
390377
if (auto *Nominal = Info.Ext->getExtendedNominal()) {
391378
if (dropSynthesizedMembers &&
392-
!isImplicitlyPrivate(Nominal, /*IgnoreContext =*/
393-
[&](const Decl *P) {
394-
return Nominal->getModuleContext() ==
395-
StdlibModule;
396-
}))
379+
!isImplicitlyPrivate(
380+
Nominal, /*IgnoreContext =*/Nominal->getModuleContext() ==
381+
StdlibModule))
397382
continue;
398383
} else if (dropSynthesizedMembers) {
399384
continue;
@@ -408,12 +393,10 @@ void SymbolGraph::recordConformanceSynthesizedMemberRelationships(Symbol S) {
408393
// There can be synthesized members on effectively private
409394
// protocols or things that conform to them. We don't want to
410395
// include those.
411-
if (isImplicitlyPrivate(
412-
SynthMember,
413-
/*IgnoreContext =*/
414-
[&](const Decl *P) {
415-
return SynthMember->getModuleContext() == StdlibModule;
416-
})) {
396+
if (isImplicitlyPrivate(SynthMember,
397+
/*IgnoreContext =*/
398+
SynthMember->getModuleContext() ==
399+
StdlibModule)) {
417400
continue;
418401
}
419402

@@ -422,29 +405,22 @@ void SymbolGraph::recordConformanceSynthesizedMemberRelationships(Symbol S) {
422405
continue;
423406
}
424407

425-
const ValueDecl *BaseDecl = OwningNominal;
426-
if (Walker.PublicPrivateTypeAliases.contains(BaseDecl))
427-
BaseDecl = Walker.PublicPrivateTypeAliases[BaseDecl];
428-
429-
Symbol Source(this, SynthMember, BaseDecl);
408+
Symbol Source(this, SynthMember, OwningNominal);
430409

431410
if (auto *InheritedDecl = Source.getInheritedDecl()) {
432411
if (auto *ParentDecl =
433412
InheritedDecl->getDeclContext()->getAsDecl()) {
434413
if (dropSynthesizedMembers &&
435414
!isImplicitlyPrivate(
436415
ParentDecl,
437-
/*IgnoreContext =*/
438-
[&](const Decl *P) {
439-
return ParentDecl->getModuleContext() ==
440-
StdlibModule;
441-
})) {
416+
/*IgnoreContext =*/ParentDecl->getModuleContext() ==
417+
StdlibModule)) {
442418
continue;
443419
}
444420
}
445421
}
446422

447-
auto ExtendedSG = Walker.getModuleSymbolGraph(BaseDecl);
423+
auto ExtendedSG = Walker.getModuleSymbolGraph(OwningNominal);
448424

449425
ExtendedSG->Nodes.insert(Source);
450426

@@ -457,15 +433,7 @@ void SymbolGraph::recordConformanceSynthesizedMemberRelationships(Symbol S) {
457433

458434
void
459435
SymbolGraph::recordInheritanceRelationships(Symbol S) {
460-
const auto *D = S.getLocalSymbolDecl();
461-
462-
// If this is a public type alias for a private symbol, gather inheritance
463-
// for the underlying type instead.
464-
if (const auto *TD = dyn_cast<TypeAliasDecl>(D)) {
465-
const auto *NTD = TD->getUnderlyingType()->getAnyNominal();
466-
if (NTD && Walker.PublicPrivateTypeAliases[NTD] == D)
467-
D = NTD;
468-
}
436+
const auto D = S.getLocalSymbolDecl();
469437

470438
ClassDecl *Super = nullptr;
471439
if (auto *CD = dyn_cast<ClassDecl>(D))
@@ -474,7 +442,8 @@ SymbolGraph::recordInheritanceRelationships(Symbol S) {
474442
Super = PD->getSuperclassDecl();
475443

476444
if (Super) {
477-
recordEdge(S, Symbol(this, Super, nullptr),
445+
recordEdge(Symbol(this, cast<ValueDecl>(D), nullptr),
446+
Symbol(this, Super, nullptr),
478447
RelationshipKind::InheritsFrom());
479448
}
480449
}
@@ -553,16 +522,7 @@ void SymbolGraph::recordOptionalRequirementRelationships(Symbol S) {
553522
}
554523

555524
void SymbolGraph::recordConformanceRelationships(Symbol S) {
556-
const auto *D = S.getLocalSymbolDecl();
557-
558-
// If this is a public type alias for a private symbol, gather conformances
559-
// for the underlying type instead.
560-
if (const auto *TD = dyn_cast<TypeAliasDecl>(D)) {
561-
const auto *NTD = TD->getUnderlyingType()->getAnyNominal();
562-
if (NTD && Walker.PublicPrivateTypeAliases[NTD] == D)
563-
D = NTD;
564-
}
565-
525+
const auto D = S.getLocalSymbolDecl();
566526
if (const auto *NTD = dyn_cast<NominalTypeDecl>(D)) {
567527
if (auto *PD = dyn_cast<ProtocolDecl>(NTD)) {
568528
for (auto *inherited : PD->getAllInheritedProtocols()) {
@@ -740,8 +700,8 @@ const ValueDecl *getProtocolRequirement(const ValueDecl *VD) {
740700

741701
}
742702

743-
bool SymbolGraph::isImplicitlyPrivate(
744-
const Decl *D, llvm::function_ref<bool(const Decl *)> IgnoreContext) const {
703+
bool SymbolGraph::isImplicitlyPrivate(const Decl *D,
704+
bool IgnoreContext) const {
745705
// Don't record unconditionally private declarations
746706
if (D->isPrivateSystemDecl(/*treatNonBuiltinProtocolsAsPublic=*/false)) {
747707
return true;
@@ -849,15 +809,16 @@ bool SymbolGraph::isImplicitlyPrivate(
849809
if (IsGlobalSIMDType) {
850810
return true;
851811
}
812+
813+
if (IgnoreContext) {
814+
return false;
815+
}
852816
}
853817

854818
// Check up the parent chain. Anything inside a privately named
855819
// thing is also private. We could be looking at the `B` of `_A.B`.
856820
if (const auto *DC = D->getDeclContext()) {
857821
if (const auto *Parent = DC->getAsDecl()) {
858-
if (IgnoreContext && IgnoreContext(Parent))
859-
return false;
860-
861822
// Exception: Children of underscored protocols should be considered
862823
// public, even though the protocols themselves aren't. This way,
863824
// synthesized copies of those symbols are correctly added to the public
@@ -890,11 +851,7 @@ bool SymbolGraph::isUnconditionallyUnavailableOnAllPlatforms(const Decl *D) cons
890851
}
891852

892853
/// Returns `true` if the symbol should be included as a node in the graph.
893-
bool SymbolGraph::canIncludeDeclAsNode(const Decl *D,
894-
const Decl *PublicAncestorDecl) const {
895-
if (PublicAncestorDecl && D == PublicAncestorDecl)
896-
return true;
897-
854+
bool SymbolGraph::canIncludeDeclAsNode(const Decl *D) const {
898855
// If this decl isn't in this module or module that this module imported with `@_exported`, don't record it,
899856
// as it will appear elsewhere in its module's symbol graph.
900857

@@ -916,8 +873,6 @@ bool SymbolGraph::canIncludeDeclAsNode(const Decl *D,
916873
} else {
917874
return false;
918875
}
919-
return !isImplicitlyPrivate(
920-
cast<ValueDecl>(D), /*IgnoreContext=*/
921-
[&](const Decl *P) { return P == PublicAncestorDecl; }) &&
922-
!isUnconditionallyUnavailableOnAllPlatforms(cast<ValueDecl>(D));
876+
return !isImplicitlyPrivate(cast<ValueDecl>(D))
877+
&& !isUnconditionallyUnavailableOnAllPlatforms(cast<ValueDecl>(D));
923878
}

lib/SymbolGraphGen/SymbolGraph.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,10 @@ struct SymbolGraph {
220220
/// implicitly internal/private, such as underscore prefixes,
221221
/// and checking every named parent context as well.
222222
///
223-
/// \param IgnoreContext A function ref that receives the parent decl
224-
/// and returns whether or not the context should be ignored when determining
225-
/// privacy.
226-
bool isImplicitlyPrivate(
227-
const Decl *D,
228-
llvm::function_ref<bool(const Decl *)> IgnoreContext = nullptr) const;
223+
/// \param IgnoreContext If `true`, don't consider
224+
/// the context of the declaration to determine whether it is implicitly private.
225+
bool isImplicitlyPrivate(const Decl *D,
226+
bool IgnoreContext = false) const;
229227

230228
/// Returns `true` if the declaration has an availability attribute
231229
/// that marks it as unconditionally unavailable on all platforms (i.e., where
@@ -234,11 +232,7 @@ struct SymbolGraph {
234232

235233
/// Returns `true` if the declaration should be included as a node
236234
/// in the graph.
237-
///
238-
/// If `PublicAncestorDecl` is set and is an ancestor of `D`, that declaration
239-
/// is considered to be public, regardless of its surrounding context.
240-
bool canIncludeDeclAsNode(const Decl *D,
241-
const Decl *PublicAncestorDecl = nullptr) const;
235+
bool canIncludeDeclAsNode(const Decl *D) const;
242236

243237
/// Returns `true` if the declaration is a requirement of a protocol
244238
/// or is a default implementation of a protocol

0 commit comments

Comments
 (0)