Merge pull request #10524 from bitjammer/rdar-32877771-markup-print-tags-xml
[Markup] Print Tags in documentation comment XML
diff --git a/bindings/xml/comment-xml-schema.rng b/bindings/xml/comment-xml-schema.rng
index 33fce49..e077c7c 100644
--- a/bindings/xml/comment-xml-schema.rng
+++ b/bindings/xml/comment-xml-schema.rng
@@ -47,6 +47,9 @@
<ref name="ResultDiscussion" />
</optional>
<optional>
+ <ref name="Tags" />
+ </optional>
+ <optional>
<ref name="Discussion" />
</optional>
</element>
@@ -116,6 +119,9 @@
<ref name="ResultDiscussion" />
</optional>
<optional>
+ <ref name="Tags" />
+ </optional>
+ <optional>
<ref name="Discussion" />
</optional>
</element>
@@ -166,6 +172,9 @@
<optional>
<ref name="ResultDiscussion" />
</optional>
+ <optional>
+ <ref name="Tags" />
+ </optional>
<optional>
<ref name="Discussion" />
@@ -209,6 +218,9 @@
<optional>
<ref name="ResultDiscussion" />
</optional>
+ <optional>
+ <ref name="Tags" />
+ </optional>
<optional>
<ref name="Discussion" />
@@ -252,6 +264,9 @@
<optional>
<ref name="ResultDiscussion" />
</optional>
+ <optional>
+ <ref name="Tags" />
+ </optional>
<optional>
<ref name="Discussion" />
@@ -294,6 +309,9 @@
<optional>
<ref name="ResultDiscussion" />
</optional>
+ <optional>
+ <ref name="Tags" />
+ </optional>
<optional>
<ref name="Discussion" />
@@ -337,6 +355,9 @@
<optional>
<ref name="ResultDiscussion" />
</optional>
+ <optional>
+ <ref name="Tags" />
+ </optional>
<optional>
<ref name="Discussion" />
@@ -640,6 +661,16 @@
</element>
</define>
+ <define name="Tags">
+ <element name="Tags">
+ <oneOrMore>
+ <element name="Tag">
+ <data type="string" />
+ </element>
+ </oneOrMore>
+ </element>
+ </define>
+
<define name="Parameters">
<element name="Parameters">
<!-- Parameter elements should be sorted according to index. -->
diff --git a/lib/IDE/CommentConversion.cpp b/lib/IDE/CommentConversion.cpp
index 0c8a16e..cdbd8ec 100644
--- a/lib/IDE/CommentConversion.cpp
+++ b/lib/IDE/CommentConversion.cpp
@@ -245,6 +245,19 @@
OS << "</ThrowsDiscussion>";
}
+ void printTagFields(ArrayRef<StringRef> Tags) {
+ OS << "<Tags>";
+ for (const auto Tag : Tags) {
+ if (Tag.empty()) {
+ continue;
+ }
+ OS << "<Tag>";
+ appendWithXMLEscaping(OS, Tag);
+ OS << "</Tag>";
+ }
+ OS << "</Tags>";
+ }
+
void visitDocComment(const DocComment *DC);
void visitCommentParts(const swift::markup::CommentParts &Parts);
};
@@ -271,6 +284,10 @@
if (Parts.ThrowsField.hasValue())
printThrowsDiscussion(Parts.ThrowsField.getValue());
+ if (!Parts.Tags.empty()) {
+ printTagFields(Parts.Tags);
+ }
+
if (!Parts.BodyNodes.empty()) {
OS << "<Discussion>";
for (const auto *N : Parts.BodyNodes)
diff --git a/test/Inputs/comment_to_something_conversion.swift b/test/Inputs/comment_to_something_conversion.swift
index 7c043c4..655a2ca 100644
--- a/test/Inputs/comment_to_something_conversion.swift
+++ b/test/Inputs/comment_to_something_conversion.swift
@@ -477,3 +477,15 @@
/// - LocalizationKey: ABC
public func localizationKeyShouldNotAppearInDocComments2() {}
// CHECK: DocCommentAsXML=[<Function file="{{.*}}" line="{{.*}}" column="{{.*}}"><Name>localizationKeyShouldNotAppearInDocComments2()</Name><USR>s:14comment_to_xml44localizationKeyShouldNotAppearInDocComments2yyF</USR><Declaration>public func localizationKeyShouldNotAppearInDocComments2()</Declaration><CommentParts></CommentParts></Function>]
+
+/// Brief.
+///
+/// - Tag:
+/// - Tag:
+/// - Tag: Tag_A
+/// - Tag: Tag B
+/// - Tag: Dedupe tag
+/// - Tag: Dedupe tag
+/// - TAG: TAG_C
+public func tags() {}
+// CHECK: DocCommentAsXML=[<Function file="{{.*}}" line="{{.*}}" column="{{.*}}"><Name>tags()</Name><USR>s:14comment_to_xml4tagsyyF</USR><Declaration>public func tags()</Declaration><CommentParts><Abstract><Para>Brief.</Para></Abstract><Tags><Tag>Tag_A</Tag><Tag>Tag B</Tag><Tag>Dedupe tag</Tag><Tag>TAG_C</Tag></Tags></CommentParts></Function>]