Skip to content

Commit a895e71

Browse files
authored
Merge pull request #14947 from nkcsgexi/digester-enum-raw-type
2 parents a9b49a9 + f77b318 commit a895e71

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

include/swift/IDE/DigesterEnums.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ KEY(superclassUsr)
9292
KEY(parentExtensionReqs)
9393
KEY(hasDefaultArg)
9494
KEY(conformingProtocols)
95+
KEY(enumRawTypeName)
9596

9697
KNOWN_TYPE(Optional)
9798
KNOWN_TYPE(ImplicitlyUnwrappedOptional)

test/api-digester/Outputs/cake.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@
425425
"Hashable",
426426
"RawRepresentable"
427427
],
428+
"enumRawTypeName": "Int",
428429
"children": [
429430
{
430431
"kind": "Var",

tools/swift-api-digester/swift-api-digester.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ struct SDKNodeInitInfo {
333333
std::vector<TypeAttrKind> TypeAttrs;
334334
std::vector<StringRef> ConformingProtocols;
335335
StringRef SuperclassUsr;
336+
StringRef EnumRawTypeName;
336337
ParentExtensionInfo *ExtInfo = nullptr;
337338
TypeInitInfo TypeInfo;
338339

@@ -779,13 +780,26 @@ SDKNodeDecl *SDKNodeType::getClosestParentDecl() const {
779780
class SDKNodeTypeDecl : public SDKNodeDecl {
780781
StringRef SuperclassUsr;
781782
std::vector<StringRef> ConformingProtocols;
783+
StringRef EnumRawTypeName;
782784
public:
783785
SDKNodeTypeDecl(SDKNodeInitInfo Info) : SDKNodeDecl(Info, SDKNodeKind::TypeDecl),
784786
SuperclassUsr(Info.SuperclassUsr),
785-
ConformingProtocols(Info.ConformingProtocols){}
787+
ConformingProtocols(Info.ConformingProtocols),
788+
EnumRawTypeName(Info.EnumRawTypeName) {}
786789
static bool classof(const SDKNode *N);
787790
StringRef getSuperClassUsr() const { return SuperclassUsr; }
788791
ArrayRef<StringRef> getAllProtocols() const { return ConformingProtocols; }
792+
793+
#define NOMINAL_TYPE_DECL(ID, PARENT) \
794+
bool is##ID() const { return getDeclKind() == DeclKind::ID; }
795+
#define DECL(ID, PARENT)
796+
#include "swift/AST/DeclNodes.def"
797+
798+
StringRef getEnumRawTypeName() const {
799+
assert(isEnum());
800+
return EnumRawTypeName;
801+
}
802+
789803
Optional<SDKNodeTypeDecl*> getSuperclass() const {
790804
if (SuperclassUsr.empty())
791805
return None;
@@ -959,6 +973,11 @@ SDKNode* SDKNode::constructSDKNode(SDKContext &Ctx,
959973
}
960974
break;
961975
}
976+
case KeyKind::KK_enumRawTypeName: {
977+
assert(Info.DKind == DeclKind::Enum);
978+
Info.EnumRawTypeName = GetScalarString(Pair.getValue());
979+
break;
980+
}
962981
case KeyKind::KK_printedName:
963982
Info.PrintedName = GetScalarString(Pair.getValue());
964983
break;
@@ -1294,6 +1313,15 @@ SDKNodeInitInfo::SDKNodeInitInfo(SDKContext &Ctx, ValueDecl *VD)
12941313
ConformingProtocols.push_back(P->getName().str());
12951314
}
12961315
}
1316+
1317+
// Get enum raw type name if this is an enum.
1318+
if (auto *ED = dyn_cast<EnumDecl>(VD)) {
1319+
if (auto RT = ED->getRawType()) {
1320+
if (auto *D = RT->getNominalOrBoundGenericNominal()) {
1321+
EnumRawTypeName = D->getName().str();
1322+
}
1323+
}
1324+
}
12971325
}
12981326

12991327
SDKNode *SDKNodeInitInfo::createSDKNode(SDKNodeKind Kind) {
@@ -1675,6 +1703,14 @@ namespace swift {
16751703
KeyKind::KK_conformingProtocols).data(),
16761704
Pros);
16771705
}
1706+
1707+
auto RawTypeName = TD->isEnum() ? TD->getEnumRawTypeName() : StringRef();
1708+
if (!RawTypeName.empty()) {
1709+
out.mapRequired(getKeyContent(Ctx,
1710+
KeyKind::KK_enumRawTypeName).data(),
1711+
RawTypeName);
1712+
}
1713+
16781714
}
16791715
if (D->isFromExtension()) {
16801716
// Even if we don't have any requirements on this parent extension,

0 commit comments

Comments
 (0)