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>]