diff --git a/include/swift/IDE/DigesterEnums.def b/include/swift/IDE/DigesterEnums.def index f730523e4b6..53dae114e51 100644 --- a/include/swift/IDE/DigesterEnums.def +++ b/include/swift/IDE/DigesterEnums.def @@ -45,6 +45,7 @@ NODE_KIND(DeclGetter, Getter) NODE_KIND(DeclSetter, Setter) NODE_KIND(DeclVar, Var) NODE_KIND(DeclTypeAlias, TypeAlias) +NODE_KIND(DeclAssociatedType, AssociatedType) NODE_ANNOTATION(Added) NODE_ANNOTATION(Removed) diff --git a/test/api-digester/Inputs/cake.swift b/test/api-digester/Inputs/cake.swift index ea09c0a9f6a..d86173ab82f 100644 --- a/test/api-digester/Inputs/cake.swift +++ b/test/api-digester/Inputs/cake.swift @@ -49,4 +49,9 @@ public struct fixedLayoutStruct { var c = 3 } -extension Int: P1 { public func bar() {} } \ No newline at end of file +extension Int: P1 { public func bar() {} } + +public protocol ProWithAssociatedType { + associatedtype A + associatedtype B = Int +} \ No newline at end of file diff --git a/test/api-digester/Outputs/cake-abi.json b/test/api-digester/Outputs/cake-abi.json index 93d20c39811..424df9d65ea 100644 --- a/test/api-digester/Outputs/cake-abi.json +++ b/test/api-digester/Outputs/cake-abi.json @@ -963,6 +963,43 @@ } ] }, + { + "kind": "TypeDecl", + "name": "ProWithAssociatedType", + "printedName": "ProWithAssociatedType", + "declKind": "Protocol", + "usr": "s:4cake21ProWithAssociatedTypeP", + "location": "", + "moduleName": "cake", + "children": [ + { + "kind": "AssociatedType", + "name": "A", + "printedName": "A", + "declKind": "AssociatedType", + "usr": "s:4cake21ProWithAssociatedTypeP1AQa", + "location": "", + "moduleName": "cake" + }, + { + "kind": "AssociatedType", + "name": "B", + "printedName": "B", + "declKind": "AssociatedType", + "usr": "s:4cake21ProWithAssociatedTypeP1BQa", + "location": "", + "moduleName": "cake", + "children": [ + { + "kind": "TypeNominal", + "name": "Int", + "printedName": "Int", + "usr": "s:Si" + } + ] + } + ] + }, { "kind": "TypeDecl", "name": "Int", diff --git a/test/api-digester/Outputs/cake.json b/test/api-digester/Outputs/cake.json index cf77baec269..625f0bdab7d 100644 --- a/test/api-digester/Outputs/cake.json +++ b/test/api-digester/Outputs/cake.json @@ -839,6 +839,43 @@ } ] }, + { + "kind": "TypeDecl", + "name": "ProWithAssociatedType", + "printedName": "ProWithAssociatedType", + "declKind": "Protocol", + "usr": "s:4cake21ProWithAssociatedTypeP", + "location": "", + "moduleName": "cake", + "children": [ + { + "kind": "AssociatedType", + "name": "A", + "printedName": "A", + "declKind": "AssociatedType", + "usr": "s:4cake21ProWithAssociatedTypeP1AQa", + "location": "", + "moduleName": "cake" + }, + { + "kind": "AssociatedType", + "name": "B", + "printedName": "B", + "declKind": "AssociatedType", + "usr": "s:4cake21ProWithAssociatedTypeP1BQa", + "location": "", + "moduleName": "cake", + "children": [ + { + "kind": "TypeNominal", + "name": "Int", + "printedName": "Int", + "usr": "s:Si" + } + ] + } + ] + }, { "kind": "TypeDecl", "name": "Int", diff --git a/tools/swift-api-digester/ModuleAnalyzerNodes.cpp b/tools/swift-api-digester/ModuleAnalyzerNodes.cpp index d4f9a4d3158..4d3f3f417f2 100644 --- a/tools/swift-api-digester/ModuleAnalyzerNodes.cpp +++ b/tools/swift-api-digester/ModuleAnalyzerNodes.cpp @@ -130,6 +130,9 @@ SDKNodeDeclGetter::SDKNodeDeclGetter(SDKNodeInitInfo Info): SDKNodeDeclSetter::SDKNodeDeclSetter(SDKNodeInitInfo Info): SDKNodeDeclAbstractFunc(Info, SDKNodeKind::DeclSetter) {} +SDKNodeDeclAssociatedType::SDKNodeDeclAssociatedType(SDKNodeInitInfo Info): + SDKNodeDecl(Info, SDKNodeKind::DeclAssociatedType) {}; + StringRef SDKNodeDecl::getHeaderName() const { if (Location.empty()) return StringRef(); @@ -348,6 +351,7 @@ bool SDKNodeDecl::classof(const SDKNode *N) { case SDKNodeKind::DeclTypeAlias: case SDKNodeKind::DeclType: case SDKNodeKind::DeclVar: + case SDKNodeKind::DeclAssociatedType: return true; case SDKNodeKind::Root: case SDKNodeKind::TypeNominal: @@ -731,6 +735,7 @@ bool SDKNode::operator==(const SDKNode &Other) const { } LLVM_FALLTHROUGH; } + case SDKNodeKind::DeclAssociatedType: case SDKNodeKind::DeclTypeAlias: { auto Left = this->getAs(); auto Right = (&Other)->getAs(); @@ -1250,6 +1255,16 @@ static SDKNode *constructTypeAliasNode(SDKContext &Ctx,TypeAliasDecl *TAD) { return Alias; } +static SDKNode *constructAssociatedTypeNode(SDKContext &Ctx, + AssociatedTypeDecl *ATD) { + auto Asso = SDKNodeInitInfo(Ctx, ATD). + createSDKNode(SDKNodeKind::DeclAssociatedType); + if (auto DT = ATD->getDefaultDefinitionType()) { + Asso->addChild(constructTypeNode(Ctx, DT)); + } + return Asso; +} + static void addMembersToRoot(SDKContext &Ctx, SDKNode *Root, IterableDeclContext *Context, std::set &HandledExts) { @@ -1268,6 +1283,8 @@ static void addMembersToRoot(SDKContext &Ctx, SDKNode *Root, Root->addChild(constructVarNode(Ctx, EED)); } else if (auto NTD = dyn_cast(Member)) { Root->addChild(constructTypeDeclNode(Ctx, NTD, HandledExts)); + } else if (auto ATD = dyn_cast(Member)) { + Root->addChild(constructAssociatedTypeNode(Ctx, ATD)); } } } diff --git a/tools/swift-api-digester/ModuleAnalyzerNodes.h b/tools/swift-api-digester/ModuleAnalyzerNodes.h index 88358634cca..71e37ac6c8d 100644 --- a/tools/swift-api-digester/ModuleAnalyzerNodes.h +++ b/tools/swift-api-digester/ModuleAnalyzerNodes.h @@ -440,6 +440,15 @@ public: static bool classof(const SDKNode *N); }; +class SDKNodeDeclAssociatedType: public SDKNodeDecl { +public: + SDKNodeDeclAssociatedType(SDKNodeInitInfo Info); + const SDKNodeType* getDefault() const { + return getChildrenCount() ? getOnlyChild()->getAs(): nullptr; + } + static bool classof(const SDKNode *N); +}; + class SDKNodeDeclVar : public SDKNodeDecl { Optional FixedBinaryOrder; public: diff --git a/tools/swift-api-digester/swift-api-digester.cpp b/tools/swift-api-digester/swift-api-digester.cpp index 5cb4c3a6edb..a532c9d8168 100644 --- a/tools/swift-api-digester/swift-api-digester.cpp +++ b/tools/swift-api-digester/swift-api-digester.cpp @@ -860,6 +860,7 @@ public: break; } + case SDKNodeKind::DeclAssociatedType: case SDKNodeKind::DeclFunction: case SDKNodeKind::DeclSetter: case SDKNodeKind::DeclGetter: