[PATCH] YAML: Fix output of sequences that contain flow sequences

Justin Bogner mail at justinbogner.com
Fri May 1 10:29:27 PDT 2015


Alex Lorenz <arphaman at gmail.com> writes:
> This patch fixes a bug where the yaml Output class emitted a sequence
> of flow sequences in an incorrect manner:
>
> Before:
>   seq:
>       [ a, b ]
>       [ a, b ]
> Afer:
>     seq:
>       - [ a, b ]
>       - [ a, b ]
>
> Test case is attached.

LGTM.

> REPOSITORY
>   rL LLVM
>
> http://reviews.llvm.org/D9206
>
> Files:
>   lib/Support/YAMLTraits.cpp
>   unittests/Support/YAMLIOTest.cpp
>
> Index: lib/Support/YAMLTraits.cpp
> ===================================================================
> --- lib/Support/YAMLTraits.cpp
> +++ lib/Support/YAMLTraits.cpp
> @@ -633,7 +633,8 @@
>  
>    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;
> Index: unittests/Support/YAMLIOTest.cpp
> ===================================================================
> --- unittests/Support/YAMLIOTest.cpp
> +++ unittests/Support/YAMLIOTest.cpp
> @@ -829,6 +829,26 @@
>  }
>  }
>  
> +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 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
>  //===----------------------------------------------------------------------===//
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list