[Doc parsing] Add availability information to generated Comment XML.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 28 Sep 2012 22:35:49 +0000 (22:35 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 28 Sep 2012 22:35:49 +0000 (22:35 +0000)
(I still need to add a test once I figure it out).
Reviewed off-line by Doug. // rdar://12378879

llvm-svn: 164861

clang/bindings/xml/comment-xml-schema.rng
clang/tools/libclang/CXComment.cpp

index 3942903..1438e3c 100644 (file)
@@ -79,6 +79,9 @@
       <optional>
         <ref name="Parameters" />
       </optional>
+      <zeroOrMore>
+        <ref name="Attribute" />
+      </zeroOrMore>
       <optional>
         <ref name="ResultDiscussion" />
       </optional>
     </element>
   </define>
 
+  <define name="Attribute">
+   <element name="Availability">
+      <attribute name="distribution">
+          <data type="string" />
+      </attribute>
+      <optional>
+        <element name="IntroducedInVersion">
+          <data type="float" />
+        </element>
+      </optional>
+      <optional>
+        <element name="DeprecatedInVersion">
+          <data type="float" />
+        </element>
+      </optional>
+      <optional>
+        <element name="RemovedAfterVersion">
+          <data type="float" />
+        </element>
+      </optional>
+      <optional>
+        <element name="DeprecationSummary">
+          <data type="string" />
+        </element>
+      </optional>
+      <optional>
+        <element name="Unavailable">
+          <data type="boolean" />
+        </element>
+      </optional>
+   </element>
+  </define>
+
   <define name="Abstract">
     <element name="Abstract">
       <zeroOrMore>
index 4e26a9e..a132a0d 100644 (file)
@@ -1170,7 +1170,62 @@ void CommentASTToXMLConverter::visitFullComment(const FullComment *C) {
     visit(Parts.Returns);
     Result << "</ResultDiscussion>";
   }
-
+  
+  if (DI->ThisDecl->hasAttrs()) {
+    const AttrVec &Attrs = DI->ThisDecl->getAttrs();
+    for (unsigned i = 0, e = Attrs.size(); i != e;) {
+      const AvailabilityAttr *AA = dyn_cast<AvailabilityAttr>(Attrs[i++]);
+      if (!AA)
+        continue;
+      // availability attribute info.
+  
+      Result << "<Availability";
+      StringRef distribution;
+      if (AA->getPlatform()) {
+        distribution = AA->getPlatform()->getName();
+        if (distribution == "macosx")
+          distribution = "OSX";
+        else
+          distribution = "iOS";
+      }
+      
+      Result << " distribution=\"";
+      Result << distribution;
+      Result << "\">";
+      VersionTuple IntroducedInVersion = AA->getIntroduced();
+      if (!IntroducedInVersion.empty()) {
+        Result << " <IntroducedInVersion>";
+        Result << IntroducedInVersion.getAsString();
+        Result << "</IntroducedInVersion>";
+      }
+      VersionTuple DeprecatedInVersion = AA->getDeprecated();
+      if (!DeprecatedInVersion.empty()) {
+        Result << " <DeprecatedInVersion>";
+        Result << DeprecatedInVersion.getAsString();
+        Result << "</DeprecatedInVersion>";
+      }
+      VersionTuple RemovedAfterVersion = AA->getObsoleted();
+      if (!RemovedAfterVersion.empty()) {
+        Result << " <RemovedAfterVersion>";
+        Result << RemovedAfterVersion.getAsString();
+        Result << "</RemovedAfterVersion>";
+      }
+      StringRef DeprecationSummary = AA->getMessage();
+      if (!DeprecationSummary.empty()) {
+        Result << " <DeprecationSummary>";
+        Result << DeprecationSummary;
+        Result << "</DeprecationSummary>";
+      }
+      Result << " <Unavailable>";
+      if (AA->getUnavailable())
+        Result << "true";
+      else
+        Result << "false";
+      Result << "</Unavailable>";
+      Result << " </Availability>";
+    }
+  }
+  
   {
     bool StartTagEmitted = false;
     for (unsigned i = 0, e = Parts.MiscBlocks.size(); i != e; ++i) {