<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Oct 18, 2013 at 3:55 PM, Lang Hames <span dir="ltr"><<a href="mailto:lhames@gmail.com" target="_blank">lhames@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Michael,<div><br></div><div>This has some std::move calls in it. Does they need to be conditionalized on LLVM_HAS_RVALUE_REFERENCES? Currently this doesn't compile on C++03.</div>
</div></blockquote><div><br></div><div>FWIW we have an llvm_move macro that's a no-op in C++98, std::move in C++11.</div><div><br></div><div>- David</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><span class="HOEnZb"><font color="#888888"><div><br></div>
<div>- Lang.</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Oct 18, 2013 at 3:38 PM, Michael J. Spencer <span dir="ltr"><<a href="mailto:bigcheesegs@gmail.com" target="_blank">bigcheesegs@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mspencer<br>
Date: Fri Oct 18 17:38:04 2013<br>
New Revision: 193004<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=193004&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=193004&view=rev</a><br>
Log:<br>
[Support][YAML] Add support for accessing tags and tag handle substitution.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Support/YAMLParser.h<br>
    llvm/trunk/lib/Support/YAMLParser.cpp<br>
    llvm/trunk/test/YAMLParser/spec-02-24.data<br>
    llvm/trunk/test/YAMLParser/spec-07-04.data<br>
    llvm/trunk/test/YAMLParser/yaml.data<br>
    llvm/trunk/utils/yaml-bench/YAMLBench.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Support/YAMLParser.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLParser.h?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/YAMLParser.h?rev=193004&r1=193003&r2=193004&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/include/llvm/Support/YAMLParser.h (original)<br>
+++ llvm/trunk/include/llvm/Support/YAMLParser.h Fri Oct 18 17:38:04 2013<br>
@@ -43,6 +43,8 @@<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Support/Allocator.h"<br>
 #include "llvm/Support/SMLoc.h"<br>
+<br>
+#include <map><br>
 #include <limits><br>
 #include <utility><br>
<br>
@@ -99,9 +101,6 @@ private:<br>
   OwningPtr<Document> CurrentDoc;<br>
<br>
   friend class Document;<br>
-<br>
-  /// @brief Validate a %YAML x.x directive.<br>
-  void handleYAMLDirective(const Token &);<br>
 };<br>
<br>
 /// @brief Abstract base class for all Nodes.<br>
@@ -116,12 +115,21 @@ public:<br>
     NK_Alias<br>
   };<br>
<br>
-  Node(unsigned int Type, OwningPtr<Document>&, StringRef Anchor);<br>
+  Node(unsigned int Type, OwningPtr<Document> &, StringRef Anchor,<br>
+       StringRef Tag);<br>
<br>
   /// @brief Get the value of the anchor attached to this node. If it does not<br>
   ///        have one, getAnchor().size() will be 0.<br>
   StringRef getAnchor() const { return Anchor; }<br>
<br>
+  /// \brief Get the tag as it was written in the document. This does not<br>
+  ///   perform tag resolution.<br>
+  StringRef getRawTag() const { return Tag; }<br>
+<br>
+  /// \brief Get the verbatium tag for a given Node. This performs tag resoluton<br>
+  ///   and substitution.<br>
+  std::string getVerbatimTag() const;<br>
+<br>
   SMRange getSourceRange() const { return SourceRange; }<br>
   void setSourceRange(SMRange SR) { SourceRange = SR; }<br>
<br>
@@ -158,6 +166,8 @@ protected:<br>
 private:<br>
   unsigned int TypeID;<br>
   StringRef Anchor;<br>
+  /// \brief The tag as typed in the document.<br>
+  StringRef Tag;<br>
 };<br>
<br>
 /// @brief A null value.<br>
@@ -166,7 +176,8 @@ private:<br>
 ///   !!null null<br>
 class NullNode : public Node {<br>
 public:<br>
-  NullNode(OwningPtr<Document> &D) : Node(NK_Null, D, StringRef()) {}<br>
+  NullNode(OwningPtr<Document> &D)<br>
+      : Node(NK_Null, D, StringRef(), StringRef()) {}<br>
<br>
   static inline bool classof(const Node *N) {<br>
     return N->getType() == NK_Null;<br>
@@ -180,9 +191,9 @@ public:<br>
 ///   Adena<br>
 class ScalarNode : public Node {<br>
 public:<br>
-  ScalarNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Val)<br>
-    : Node(NK_Scalar, D, Anchor)<br>
-    , Value(Val) {<br>
+  ScalarNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Tag,<br>
+             StringRef Val)<br>
+      : Node(NK_Scalar, D, Anchor, Tag), Value(Val) {<br>
     SMLoc Start = SMLoc::getFromPointer(Val.begin());<br>
     SMLoc End = SMLoc::getFromPointer(Val.end());<br>
     SourceRange = SMRange(Start, End);<br>
@@ -222,7 +233,7 @@ private:<br>
 class KeyValueNode : public Node {<br>
 public:<br>
   KeyValueNode(OwningPtr<Document> &D)<br>
-    : Node(NK_KeyValue, D, StringRef())<br>
+    : Node(NK_KeyValue, D, StringRef(), StringRef())<br>
     , Key(0)<br>
     , Value(0)<br>
   {}<br>
@@ -338,13 +349,10 @@ public:<br>
     MT_Inline ///< An inline mapping node is used for "[key: value]".<br>
   };<br>
<br>
-  MappingNode(OwningPtr<Document> &D, StringRef Anchor, MappingType MT)<br>
-    : Node(NK_Mapping, D, Anchor)<br>
-    , Type(MT)<br>
-    , IsAtBeginning(true)<br>
-    , IsAtEnd(false)<br>
-    , CurrentEntry(0)<br>
-  {}<br>
+  MappingNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Tag,<br>
+              MappingType MT)<br>
+      : Node(NK_Mapping, D, Anchor, Tag), Type(MT), IsAtBeginning(true),<br>
+        IsAtEnd(false), CurrentEntry(0) {}<br>
<br>
   friend class basic_collection_iterator<MappingNode, KeyValueNode>;<br>
   typedef basic_collection_iterator<MappingNode, KeyValueNode> iterator;<br>
@@ -397,14 +405,12 @@ public:<br>
     ST_Indentless<br>
   };<br>
<br>
-  SequenceNode(OwningPtr<Document> &D, StringRef Anchor, SequenceType ST)<br>
-    : Node(NK_Sequence, D, Anchor)<br>
-    , SeqType(ST)<br>
-    , IsAtBeginning(true)<br>
-    , IsAtEnd(false)<br>
-    , WasPreviousTokenFlowEntry(true) // Start with an imaginary ','.<br>
-    , CurrentEntry(0)<br>
-  {}<br>
+  SequenceNode(OwningPtr<Document> &D, StringRef Anchor, StringRef Tag,<br>
+               SequenceType ST)<br>
+      : Node(NK_Sequence, D, Anchor, Tag), SeqType(ST), IsAtBeginning(true),<br>
+        IsAtEnd(false),<br>
+        WasPreviousTokenFlowEntry(true), // Start with an imaginary ','.<br>
+        CurrentEntry(0) {}<br>
<br>
   friend class basic_collection_iterator<SequenceNode, Node>;<br>
   typedef basic_collection_iterator<SequenceNode, Node> iterator;<br>
@@ -442,7 +448,7 @@ private:<br>
 class AliasNode : public Node {<br>
 public:<br>
   AliasNode(OwningPtr<Document> &D, StringRef Val)<br>
-    : Node(NK_Alias, D, StringRef()), Name(Val) {}<br>
+    : Node(NK_Alias, D, StringRef(), StringRef()), Name(Val) {}<br>
<br>
   StringRef getName() const { return Name; }<br>
   Node *getTarget();<br>
@@ -475,6 +481,10 @@ public:<br>
     return Root = parseBlockNode();<br>
   }<br>
<br>
+  const std::map<StringRef, StringRef> &getTagMap() const {<br>
+    return TagMap;<br>
+  }<br>
+<br>
 private:<br>
   friend class Node;<br>
   friend class document_iterator;<br>
@@ -490,18 +500,23 @@ private:<br>
   ///        document.<br>
   Node *Root;<br>
<br>
+  /// \brief Maps tag prefixes to their expansion.<br>
+  std::map<StringRef, StringRef> TagMap;<br>
+<br>
   Token &peekNext();<br>
   Token getNext();<br>
   void setError(const Twine &Message, Token &Location) const;<br>
   bool failed() const;<br>
<br>
-  void handleTagDirective(const Token &Tag) {<br>
-    // TODO: Track tags.<br>
-  }<br>
-<br>
   /// @brief Parse %BLAH directives and return true if any were encountered.<br>
   bool parseDirectives();<br>
<br>
+  /// \brief Parse %YAML<br>
+  void parseYAMLDirective();<br>
+<br>
+  /// \brief Parse %TAG<br>
+  void parseTAGDirective();<br>
+<br>
   /// @brief Consume the next token and error if it is not \a TK.<br>
   bool expectToken(int TK);<br>
 };<br>
<br>
Modified: llvm/trunk/lib/Support/YAMLParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLParser.cpp?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/YAMLParser.cpp?rev=193004&r1=193003&r2=193004&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/lib/Support/YAMLParser.cpp (original)<br>
+++ llvm/trunk/lib/Support/YAMLParser.cpp Fri Oct 18 17:38:04 2013<br>
@@ -1070,14 +1070,22 @@ bool Scanner::scanDirective() {<br>
   Current = skip_while(&Scanner::skip_ns_char, Current);<br>
   StringRef Name(NameStart, Current - NameStart);<br>
   Current = skip_while(&Scanner::skip_s_white, Current);<br>
-<br>
+<br>
+  Token T;<br>
   if (Name == "YAML") {<br>
     Current = skip_while(&Scanner::skip_ns_char, Current);<br>
-    Token T;<br>
     T.Kind = Token::TK_VersionDirective;<br>
     T.Range = StringRef(Start, Current - Start);<br>
     TokenQueue.push_back(T);<br>
     return true;<br>
+  } else if(Name == "TAG") {<br>
+    Current = skip_while(&Scanner::skip_ns_char, Current);<br>
+    Current = skip_while(&Scanner::skip_s_white, Current);<br>
+    Current = skip_while(&Scanner::skip_ns_char, Current);<br>
+    T.Kind = Token::TK_TagDirective;<br>
+    T.Range = StringRef(Start, Current - Start);<br>
+    TokenQueue.push_back(T);<br>
+    return true;<br>
   }<br>
   return false;<br>
 }<br>
@@ -1564,10 +1572,6 @@ void Stream::printError(Node *N, const T<br>
                      , Ranges);<br>
 }<br>
<br>
-void Stream::handleYAMLDirective(const Token &t) {<br>
-  // TODO: Ensure version is 1.x.<br>
-}<br>
-<br>
 document_iterator Stream::begin() {<br>
   if (CurrentDoc)<br>
     report_fatal_error("Can only iterate over the stream once");<br>
@@ -1588,14 +1592,59 @@ void Stream::skip() {<br>
     i->skip();<br>
 }<br>
<br>
-Node::Node(unsigned int Type, OwningPtr<Document> &D, StringRef A)<br>
+Node::Node(unsigned int Type, OwningPtr<Document> &D, StringRef A, StringRef T)<br>
   : Doc(D)<br>
   , TypeID(Type)<br>
-  , Anchor(A) {<br>
+  , Anchor(A)<br>
+  , Tag(T) {<br>
   SMLoc Start = SMLoc::getFromPointer(peekNext().Range.begin());<br>
   SourceRange = SMRange(Start, Start);<br>
 }<br>
<br>
+std::string Node::getVerbatimTag() const {<br>
+  StringRef Raw = getRawTag();<br>
+  if (!Raw.empty() && Raw != "!") {<br>
+    std::string Ret;<br>
+    if (Raw.find_last_of('!') == 0) {<br>
+      Ret = Doc->getTagMap().find("!")->second;<br>
+      Ret += Raw.substr(1);<br>
+      return std::move(Ret);<br>
+    } else if (Raw.startswith("!!")) {<br>
+      Ret = Doc->getTagMap().find("!!")->second;<br>
+      Ret += Raw.substr(2);<br>
+      return std::move(Ret);<br>
+    } else {<br>
+      StringRef TagHandle = Raw.substr(0, Raw.find_last_of('!') + 1);<br>
+      std::map<StringRef, StringRef>::const_iterator It =<br>
+          Doc->getTagMap().find(TagHandle);<br>
+      if (It != Doc->getTagMap().end())<br>
+        Ret = It->second;<br>
+      else {<br>
+        Token T;<br>
+        T.Kind = Token::TK_Tag;<br>
+        T.Range = TagHandle;<br>
+        setError(Twine("Unknown tag handle ") + TagHandle, T);<br>
+      }<br>
+      Ret += Raw.substr(Raw.find_last_of('!') + 1);<br>
+      return std::move(Ret);<br>
+    }<br>
+  }<br>
+<br>
+  switch (getType()) {<br>
+  case NK_Null:<br>
+    return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:null";<br>
+  case NK_Scalar:<br>
+    // TODO: Tag resolution.<br>
+    return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:str";<br>
+  case NK_Mapping:<br>
+    return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:map";<br>
+  case NK_Sequence:<br>
+    return "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:seq";<br>
+  }<br>
+<br>
+  return "";<br>
+}<br>
+<br>
 Token &Node::peekNext() {<br>
   return Doc->peekNext();<br>
 }<br>
@@ -1999,6 +2048,10 @@ void SequenceNode::increment() {<br>
 }<br>
<br>
 Document::Document(Stream &S) : stream(S), Root(0) {<br>
+  // Tag maps starts with two default mappings.<br>
+  TagMap["!"] = "!";<br>
+  TagMap["!!"] = "tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:";<br>
+<br>
   if (parseDirectives())<br>
     expectToken(Token::TK_DocumentStart);<br>
   Token &T = peekNext();<br>
@@ -2042,6 +2095,7 @@ Node *Document::parseBlockNode() {<br>
   Token T = peekNext();<br>
   // Handle properties.<br>
   Token AnchorInfo;<br>
+  Token TagInfo;<br>
 parse_property:<br>
   switch (T.Kind) {<br>
   case Token::TK_Alias:<br>
@@ -2056,7 +2110,11 @@ parse_property:<br>
     T = peekNext();<br>
     goto parse_property;<br>
   case Token::TK_Tag:<br>
-    getNext(); // Skip TK_Tag.<br>
+    if (TagInfo.Kind == Token::TK_Tag) {<br>
+      setError("Already encountered a tag for this node!", T);<br>
+      return 0;<br>
+    }<br>
+    TagInfo = getNext(); // Consume TK_Tag.<br>
     T = peekNext();<br>
     goto parse_property;<br>
   default:<br>
@@ -2070,42 +2128,49 @@ parse_property:<br>
     // Don't eat the TK_BlockEntry, SequenceNode needs it.<br>
     return new (NodeAllocator) SequenceNode( stream.CurrentDoc<br>
                                            , AnchorInfo.Range.substr(1)<br>
+                                           , TagInfo.Range<br>
                                            , SequenceNode::ST_Indentless);<br>
   case Token::TK_BlockSequenceStart:<br>
     getNext();<br>
     return new (NodeAllocator)<br>
       SequenceNode( stream.CurrentDoc<br>
                   , AnchorInfo.Range.substr(1)<br>
+                  , TagInfo.Range<br>
                   , SequenceNode::ST_Block);<br>
   case Token::TK_BlockMappingStart:<br>
     getNext();<br>
     return new (NodeAllocator)<br>
       MappingNode( stream.CurrentDoc<br>
                  , AnchorInfo.Range.substr(1)<br>
+                 , TagInfo.Range<br>
                  , MappingNode::MT_Block);<br>
   case Token::TK_FlowSequenceStart:<br>
     getNext();<br>
     return new (NodeAllocator)<br>
       SequenceNode( stream.CurrentDoc<br>
                   , AnchorInfo.Range.substr(1)<br>
+                  , TagInfo.Range<br>
                   , SequenceNode::ST_Flow);<br>
   case Token::TK_FlowMappingStart:<br>
     getNext();<br>
     return new (NodeAllocator)<br>
       MappingNode( stream.CurrentDoc<br>
                  , AnchorInfo.Range.substr(1)<br>
+                 , TagInfo.Range<br>
                  , MappingNode::MT_Flow);<br>
   case Token::TK_Scalar:<br>
     getNext();<br>
     return new (NodeAllocator)<br>
       ScalarNode( stream.CurrentDoc<br>
                 , AnchorInfo.Range.substr(1)<br>
+                , TagInfo.Range<br>
                 , T.Range);<br>
   case Token::TK_Key:<br>
     // Don't eat the TK_Key, KeyValueNode expects it.<br>
     return new (NodeAllocator)<br>
       MappingNode( stream.CurrentDoc<br>
                  , AnchorInfo.Range.substr(1)<br>
+                 , TagInfo.Range<br>
                  , MappingNode::MT_Inline);<br>
   case Token::TK_DocumentStart:<br>
   case Token::TK_DocumentEnd:<br>
@@ -2126,10 +2191,10 @@ bool Document::parseDirectives() {<br>
   while (true) {<br>
     Token T = peekNext();<br>
     if (T.Kind == Token::TK_TagDirective) {<br>
-      handleTagDirective(getNext());<br>
+      parseTAGDirective();<br>
       isDirective = true;<br>
     } else if (T.Kind == Token::TK_VersionDirective) {<br>
-      stream.handleYAMLDirective(getNext());<br>
+      parseYAMLDirective();<br>
       isDirective = true;<br>
     } else<br>
       break;<br>
@@ -2137,6 +2202,21 @@ bool Document::parseDirectives() {<br>
   return isDirective;<br>
 }<br>
<br>
+void Document::parseYAMLDirective() {<br>
+  getNext(); // Eat %YAML <version><br>
+}<br>
+<br>
+void Document::parseTAGDirective() {<br>
+  Token Tag = getNext(); // %TAG <handle> <prefix><br>
+  StringRef T = Tag.Range;<br>
+  // Strip %TAG<br>
+  T = T.substr(T.find_first_of(" \t")).ltrim(" \t");<br>
+  std::size_t HandleEnd = T.find_first_of(" \t");<br>
+  StringRef TagHandle = T.substr(0, HandleEnd);<br>
+  StringRef TagPrefix = T.substr(HandleEnd).ltrim(" \t");<br>
+  TagMap[TagHandle] = TagPrefix;<br>
+}<br>
+<br>
 bool Document::expectToken(int TK) {<br>
   Token T = getNext();<br>
   if (T.Kind != TK) {<br>
<br>
Modified: llvm/trunk/test/YAMLParser/spec-02-24.data<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-02-24.data?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-02-24.data?rev=193004&r1=193003&r2=193004&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/test/YAMLParser/spec-02-24.data (original)<br>
+++ llvm/trunk/test/YAMLParser/spec-02-24.data Fri Oct 18 17:38:04 2013<br>
@@ -1,4 +1,4 @@<br>
-# RUN: yaml-bench -canonical %s<br>
+# RUN: yaml-bench -canonical %s | FileCheck %s<br>
<br>
 %TAG ! tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:<br>
 --- !shape<br>
@@ -14,3 +14,8 @@<br>
   start: *ORIGIN<br>
   color: 0xFFEEBB<br>
   text: Pretty vector drawing.<br>
+<br>
+#CHECK: !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:shape><br>
+#CHECK:   !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:circle><br>
+#CHECK:   !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:line><br>
+#CHECK:   !<tag:<a href="http://clarkevans.com" target="_blank">clarkevans.com</a>,2002:label><br>
<br>
Modified: llvm/trunk/test/YAMLParser/spec-07-04.data<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-07-04.data?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/spec-07-04.data?rev=193004&r1=193003&r2=193004&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/test/YAMLParser/spec-07-04.data (original)<br>
+++ llvm/trunk/test/YAMLParser/spec-07-04.data Fri Oct 18 17:38:04 2013<br>
@@ -1,5 +1,7 @@<br>
-# RUN: yaml-bench -canonical %s<br>
+# RUN: yaml-bench -canonical %s | FileCheck %s<br>
<br>
 %TAG !yaml! tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:<br>
 ---<br>
 !yaml!str "foo"<br>
+<br>
+#CHECK: !!str "foo"<br>
<br>
Modified: llvm/trunk/test/YAMLParser/yaml.data<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/yaml.data?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/YAMLParser/yaml.data?rev=193004&r1=193003&r2=193004&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/test/YAMLParser/yaml.data (original)<br>
+++ llvm/trunk/test/YAMLParser/yaml.data Fri Oct 18 17:38:04 2013<br>
@@ -1,5 +1,11 @@<br>
-# RUN: yaml-bench -canonical %s<br>
+# RUN: yaml-bench -canonical %s | FileCheck %s<br>
<br>
 - !!yaml '!'<br>
 - !!yaml '&'<br>
 - !!yaml '*'<br>
+<br>
+# CHECK: !!seq [<br>
+# CHECK:   !!yaml "!",<br>
+# CHECK:   !!yaml "&",<br>
+# CHECK:   !!yaml "*",<br>
+# CHECK: ]<br>
<br>
Modified: llvm/trunk/utils/yaml-bench/YAMLBench.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/yaml-bench/YAMLBench.cpp?rev=193004&r1=193003&r2=193004&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/yaml-bench/YAMLBench.cpp?rev=193004&r1=193003&r2=193004&view=diff</a><br>


==============================================================================<br>
--- llvm/trunk/utils/yaml-bench/YAMLBench.cpp (original)<br>
+++ llvm/trunk/utils/yaml-bench/YAMLBench.cpp Fri Oct 18 17:38:04 2013<br>
@@ -63,6 +63,20 @@ static raw_ostream &operator <<(raw_ostr<br>
   return os;<br>
 }<br>
<br>
+/// \brief Pretty print a tag by replacing tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002: with !!.<br>
+static std::string prettyTag(yaml::Node *N) {<br>
+  std::string Tag = N->getVerbatimTag();<br>
+  if (StringRef(Tag).startswith("tag:<a href="http://yaml.org" target="_blank">yaml.org</a>,2002:")) {<br>
+    std::string Ret = "!!";<br>
+    Ret += StringRef(Tag).substr(18);<br>
+    return std::move(Ret);<br>
+  }<br>
+  std::string Ret = "!<";<br>
+  Ret += Tag;<br>
+  Ret += ">";<br>
+  return Ret;<br>
+}<br>
+<br>
 static void dumpNode( yaml::Node *n<br>
                     , unsigned Indent = 0<br>
                     , bool SuppressFirstIndent = false) {<br>
@@ -76,9 +90,9 @@ static void dumpNode( yaml::Node *n<br>
   if (yaml::ScalarNode *sn = dyn_cast<yaml::ScalarNode>(n)) {<br>
     SmallString<32> Storage;<br>
     StringRef Val = sn->getValue(Storage);<br>
-    outs() << "!!str \"" << yaml::escape(Val) << "\"";<br>
+    outs() << prettyTag(n) << " \"" << yaml::escape(Val) << "\"";<br>
   } else if (yaml::SequenceNode *sn = dyn_cast<yaml::SequenceNode>(n)) {<br>
-    outs() << "!!seq [\n";<br>
+    outs() << prettyTag(n) << " [\n";<br>
     ++Indent;<br>
     for (yaml::SequenceNode::iterator i = sn->begin(), e = sn->end();<br>
                                       i != e; ++i) {<br>
@@ -88,7 +102,7 @@ static void dumpNode( yaml::Node *n<br>
     --Indent;<br>
     outs() << indent(Indent) << "]";<br>
   } else if (yaml::MappingNode *mn = dyn_cast<yaml::MappingNode>(n)) {<br>
-    outs() << "!!map {\n";<br>
+    outs() << prettyTag(n) << " {\n";<br>
     ++Indent;<br>
     for (yaml::MappingNode::iterator i = mn->begin(), e = mn->end();<br>
                                      i != e; ++i) {<br>
@@ -104,7 +118,7 @@ static void dumpNode( yaml::Node *n<br>
   } else if (yaml::AliasNode *an = dyn_cast<yaml::AliasNode>(n)){<br>
     outs() << "*" << an->getName();<br>
   } else if (dyn_cast<yaml::NullNode>(n)) {<br>
-    outs() << "!!null null";<br>
+    outs() << prettyTag(n) << " null";<br>
   }<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div></div>