Skip to content

Commit 0345bcc

Browse files
authored
Merge pull request #11716 from ahoppen/swift-access-level
[Index] Add symbol properties to record the Swift access level of a declaration
2 parents 4e5e6c7 + f8da207 commit 0345bcc

File tree

4 files changed

+95
-23
lines changed

4 files changed

+95
-23
lines changed

clang/include/clang/Index/IndexSymbol.h

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,21 +110,43 @@ enum class SymbolSubKind : uint8_t {
110110
typedef uint32_t SymbolPropertySet;
111111
/// Set of properties that provide additional info about a symbol.
112112
enum class SymbolProperty : SymbolPropertySet {
113-
Generic = 1 << 0,
113+
Generic = 1 << 0,
114114
TemplatePartialSpecialization = 1 << 1,
115-
TemplateSpecialization = 1 << 2,
116-
UnitTest = 1 << 3,
117-
IBAnnotated = 1 << 4,
118-
IBOutletCollection = 1 << 5,
119-
GKInspectable = 1 << 6,
120-
Local = 1 << 7,
115+
TemplateSpecialization = 1 << 2,
116+
UnitTest = 1 << 3,
117+
IBAnnotated = 1 << 4,
118+
IBOutletCollection = 1 << 5,
119+
GKInspectable = 1 << 6,
120+
Local = 1 << 7,
121121
/// Symbol is part of a protocol interface.
122-
ProtocolInterface = 1 << 8,
123-
124-
/// Swift-only properties
125-
SwiftAsync = 1 << 16,
122+
ProtocolInterface = 1 << 8,
123+
124+
/// --- Swift-only properties
125+
126+
/// Whether this is a `async` function.
127+
SwiftAsync = 1 << 16,
128+
129+
/// Swift Access control levels, packed into 3 bits.
130+
///
131+
/// Use \c applyForEachSymbolProperty or \c
132+
/// getSwiftAccessLevelFromSymbolPropertySet to correctly unpack these from a
133+
/// \c SymbolPropertySet.
134+
SwiftAccessControlLessThanFilePrivate = 1 << 17,
135+
SwiftAccessControlFilePrivate = 1 << 18,
136+
SwiftAccessControlInternal = 1 << 18 | 1 << 17,
137+
SwiftAccessControlPackage = 1 << 19,
138+
SwiftAccessControlSPI = 1 << 19 | 1 << 17,
139+
SwiftAccessControlPublic = 1 << 19 | 1 << 18,
126140
};
127141

142+
/// The Swift access level is bit-packed into `SymbolPropertySet` so we can't
143+
/// easily apply a \c SymbolProperty bit-mask to a \c SymbolPropertySet to check
144+
/// for the access level. This function extracts the access level from a \c
145+
/// SymbolPropertySet. It guarantees to only ever return a \c
146+
/// SwiftAccessControl* case of \c SymbolProperty.
147+
std::optional<SymbolProperty>
148+
getSwiftAccessLevelFromSymbolPropertySet(SymbolPropertySet);
149+
128150
/// Set of roles that are attributed to symbol occurrences.
129151
///
130152
/// Low 9 bits of clang-c/include/Index.h CXSymbolRole mirrors this enum.

clang/include/indexstore/indexstore.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -318,18 +318,24 @@ typedef enum {
318318
INDEXSTORE_SYMBOL_SUBKIND_SWIFTACCESSORMUTATE = 1018,
319319
} indexstore_symbol_subkind_t;
320320

321-
INDEXSTORE_OPTIONS(uint64_t, indexstore_symbol_property_t) {
322-
INDEXSTORE_SYMBOL_PROPERTY_GENERIC = 1 << 0,
323-
INDEXSTORE_SYMBOL_PROPERTY_TEMPLATE_PARTIAL_SPECIALIZATION = 1 << 1,
324-
INDEXSTORE_SYMBOL_PROPERTY_TEMPLATE_SPECIALIZATION = 1 << 2,
325-
INDEXSTORE_SYMBOL_PROPERTY_UNITTEST = 1 << 3,
326-
INDEXSTORE_SYMBOL_PROPERTY_IBANNOTATED = 1 << 4,
327-
INDEXSTORE_SYMBOL_PROPERTY_IBOUTLETCOLLECTION = 1 << 5,
328-
INDEXSTORE_SYMBOL_PROPERTY_GKINSPECTABLE = 1 << 6,
329-
INDEXSTORE_SYMBOL_PROPERTY_LOCAL = 1 << 7,
330-
INDEXSTORE_SYMBOL_PROPERTY_PROTOCOL_INTERFACE = 1 << 8,
331-
332-
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ASYNC = 1 << 16,
321+
INDEXSTORE_OPTIONS(uint64_t, indexstore_symbol_property_t){
322+
INDEXSTORE_SYMBOL_PROPERTY_GENERIC = 1 << 0,
323+
INDEXSTORE_SYMBOL_PROPERTY_TEMPLATE_PARTIAL_SPECIALIZATION = 1 << 1,
324+
INDEXSTORE_SYMBOL_PROPERTY_TEMPLATE_SPECIALIZATION = 1 << 2,
325+
INDEXSTORE_SYMBOL_PROPERTY_UNITTEST = 1 << 3,
326+
INDEXSTORE_SYMBOL_PROPERTY_IBANNOTATED = 1 << 4,
327+
INDEXSTORE_SYMBOL_PROPERTY_IBOUTLETCOLLECTION = 1 << 5,
328+
INDEXSTORE_SYMBOL_PROPERTY_GKINSPECTABLE = 1 << 6,
329+
INDEXSTORE_SYMBOL_PROPERTY_LOCAL = 1 << 7,
330+
INDEXSTORE_SYMBOL_PROPERTY_PROTOCOL_INTERFACE = 1 << 8,
331+
332+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ASYNC = 1 << 16,
333+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_LESSTHANFILEPRIVATE = 1 << 17,
334+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_FILEPRIVATE = 1 << 18,
335+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_INTERNAL = 1 << 18 | 1 << 17,
336+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_PACKAGE = 1 << 19,
337+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_SPI = 1 << 19 | 1 << 17,
338+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_PUBLIC = 1 << 19 | 1 << 18,
333339
};
334340

335341
typedef enum {

clang/lib/Index/IndexDataStoreUtils.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,25 @@ indexstore_symbol_property_t index::getIndexStoreProperties(SymbolPropertySet Pr
483483
case SymbolProperty::SwiftAsync:
484484
storeProp |= INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ASYNC;
485485
break;
486+
case SymbolProperty::SwiftAccessControlLessThanFilePrivate:
487+
storeProp |=
488+
INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_LESSTHANFILEPRIVATE;
489+
break;
490+
case SymbolProperty::SwiftAccessControlFilePrivate:
491+
storeProp |= INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_FILEPRIVATE;
492+
break;
493+
case SymbolProperty::SwiftAccessControlInternal:
494+
storeProp |= INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_INTERNAL;
495+
break;
496+
case SymbolProperty::SwiftAccessControlPackage:
497+
storeProp |= INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_PACKAGE;
498+
break;
499+
case SymbolProperty::SwiftAccessControlSPI:
500+
storeProp |= INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_SPI;
501+
break;
502+
case SymbolProperty::SwiftAccessControlPublic:
503+
storeProp |= INDEXSTORE_SYMBOL_PROPERTY_SWIFT_ACCESSCONTROL_PUBLIC;
504+
break;
486505
}
487506
});
488507
return static_cast<indexstore_symbol_property_t>(storeProp);

clang/lib/Index/IndexSymbol.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,14 @@ StringRef index::getSymbolLanguageString(SymbolLanguage K) {
587587
llvm_unreachable("invalid symbol language kind");
588588
}
589589

590+
std::optional<SymbolProperty>
591+
index::getSwiftAccessLevelFromSymbolPropertySet(SymbolPropertySet Props) {
592+
if (uint32_t AccessLevel = Props & (1 << 19 | 1 << 18 | 1 << 17)) {
593+
return (SymbolProperty)AccessLevel;
594+
}
595+
return std::nullopt;
596+
}
597+
590598
void index::applyForEachSymbolProperty(SymbolPropertySet Props,
591599
llvm::function_ref<void(SymbolProperty)> Fn) {
592600
#define APPLY_FOR_PROPERTY(K) \
@@ -605,6 +613,11 @@ void index::applyForEachSymbolProperty(SymbolPropertySet Props,
605613
APPLY_FOR_PROPERTY(SwiftAsync);
606614

607615
#undef APPLY_FOR_PROPERTY
616+
617+
/// Access levels are bit-packed, so we need to handle them explicitly.
618+
if (auto AccessLevel = getSwiftAccessLevelFromSymbolPropertySet(Props)) {
619+
Fn(*AccessLevel);
620+
}
608621
}
609622

610623
void index::printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS) {
@@ -625,6 +638,18 @@ void index::printSymbolProperties(SymbolPropertySet Props, raw_ostream &OS) {
625638
case SymbolProperty::Local: OS << "local"; break;
626639
case SymbolProperty::ProtocolInterface: OS << "protocol"; break;
627640
case SymbolProperty::SwiftAsync: OS << "swift_async"; break;
641+
case SymbolProperty::SwiftAccessControlLessThanFilePrivate:
642+
OS << "less_than_private";
643+
break;
644+
case SymbolProperty::SwiftAccessControlFilePrivate: OS << "fileprivate"; break;
645+
case SymbolProperty::SwiftAccessControlInternal: OS << "internal"; break;
646+
case SymbolProperty::SwiftAccessControlPackage: OS << "package"; break;
647+
case SymbolProperty::SwiftAccessControlSPI:
648+
OS << "SPI";
649+
break;
650+
case SymbolProperty::SwiftAccessControlPublic:
651+
OS << "public";
652+
break;
628653
}
629654
});
630655
}

0 commit comments

Comments
 (0)