YAML: Fix the output of sequences that contain flow sequences.

This patch fixes a bug where the YAML Output class emitted
a sequence of flow sequences without the '-' characters.
Before:
  
  seq:
    [ a, b ]
    [ c, d ]

After:

  seq:
    - [ a, b ]
    - [ c, d ]


Reviewers: Justin Bogner

Differential Revision: http://reviews.llvm.org/D9206


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236329 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Alex Lorenz 2015-05-01 18:34:25 +00:00
parent 0b74b0823f
commit 9791e1ad9c
2 changed files with 67 additions and 1 deletions

View File

@ -633,7 +633,8 @@ void Output::newLineCheck() {
if (StateStack.back() == inSeq) {
OutputDash = true;
} else if ((StateStack.size() > 1) && (StateStack.back() == inMapFirstKey) &&
} else if ((StateStack.size() > 1) && ((StateStack.back() == inMapFirstKey) ||
(StateStack.back() == inFlowSeq)) &&
(StateStack[StateStack.size() - 2] == inSeq)) {
--Indent;
OutputDash = true;

View File

@ -829,6 +829,26 @@ namespace yaml {
}
}
typedef std::vector<MyNumber> MyNumberFlowSequence;
LLVM_YAML_IS_SEQUENCE_VECTOR(MyNumberFlowSequence)
struct NameAndNumbersFlow {
llvm::StringRef name;
std::vector<MyNumberFlowSequence> sequenceOfNumbers;
};
namespace llvm {
namespace yaml {
template <>
struct MappingTraits<NameAndNumbersFlow> {
static void mapping(IO &io, NameAndNumbersFlow& nn) {
io.mapRequired("name", nn.name);
io.mapRequired("sequenceOfNumbers", nn.sequenceOfNumbers);
}
};
}
}
//
// Test writing then reading back custom values
@ -876,6 +896,51 @@ TEST(YAMLIO, TestReadWriteMyFlowSequence) {
}
//
// Test writing then reading back a sequence of flow sequences.
//
TEST(YAMLIO, TestReadWriteSequenceOfMyFlowSequence) {
std::string intermediate;
{
NameAndNumbersFlow map;
map.name = "hello";
MyNumberFlowSequence single = { 0 };
MyNumberFlowSequence numbers = { 12, 1, -512 };
map.sequenceOfNumbers.push_back(single);
map.sequenceOfNumbers.push_back(numbers);
map.sequenceOfNumbers.push_back(MyNumberFlowSequence());
llvm::raw_string_ostream ostr(intermediate);
Output yout(ostr);
yout << map;
// Verify sequences were written in flow style
// and that the parent sequence used '-'.
ostr.flush();
llvm::StringRef flowOut(intermediate);
EXPECT_NE(llvm::StringRef::npos, flowOut.find("- [ 0 ]"));
EXPECT_NE(llvm::StringRef::npos, flowOut.find("- [ 12, 1, -512 ]"));
EXPECT_NE(llvm::StringRef::npos, flowOut.find("- [ ]"));
}
{
Input yin(intermediate);
NameAndNumbersFlow map2;
yin >> map2;
EXPECT_FALSE(yin.error());
EXPECT_TRUE(map2.name.equals("hello"));
EXPECT_EQ(map2.sequenceOfNumbers.size(), 3UL);
EXPECT_EQ(map2.sequenceOfNumbers[0].size(), 1UL);
EXPECT_EQ(0, map2.sequenceOfNumbers[0][0]);
EXPECT_EQ(map2.sequenceOfNumbers[1].size(), 3UL);
EXPECT_EQ(12, map2.sequenceOfNumbers[1][0]);
EXPECT_EQ(1, map2.sequenceOfNumbers[1][1]);
EXPECT_EQ(-512, map2.sequenceOfNumbers[1][2]);
EXPECT_TRUE(map2.sequenceOfNumbers[2].empty());
}
}
//===----------------------------------------------------------------------===//
// Test normalizing/denormalizing
//===----------------------------------------------------------------------===//