diff --git a/llvm/lib/Support/YAMLParser.cpp b/llvm/lib/Support/YAMLParser.cpp --- a/llvm/lib/Support/YAMLParser.cpp +++ b/llvm/lib/Support/YAMLParser.cpp @@ -159,6 +159,18 @@ Token() = default; }; +enum BlockStyleIndicator : char { + BSI_None = ' ', + BSI_Literal = '|', + BSI_Folded = '>' +}; + +enum BlockChompingIndicator : char { + BCI_Clip = ' ', + BCI_Strip = '-', + BCI_Keep = '+' +}; + } // end namespace yaml } // end namespace llvm @@ -479,14 +491,15 @@ /// YAML does not consider the style indicator to be a part of the header. /// /// Return false if an error occurred. - bool scanBlockScalarIndicators(char &StyleIndicator, char &ChompingIndicator, + bool scanBlockScalarIndicators(BlockStyleIndicator &StyleIndicator, + BlockChompingIndicator &ChompingIndicator, unsigned &IndentIndicator, bool &IsDone); /// Scan a style indicator in a block scalar header. - char scanBlockStyleIndicator(); + BlockStyleIndicator scanBlockStyleIndicator(); /// Scan a chomping indicator in a block scalar header. - char scanBlockChompingIndicator(); + BlockChompingIndicator scanBlockChompingIndicator(); /// Scan an indentation indicator in a block scalar header. unsigned scanBlockIndentationIndicator(); @@ -494,8 +507,8 @@ /// Scan a block scalar header. /// /// Return false if an error occurred. - bool scanBlockScalarHeader(char &ChompingIndicator, unsigned &IndentIndicator, - bool &IsDone); + bool scanBlockScalarHeader(BlockChompingIndicator &ChompingIndicator, + unsigned &IndentIndicator, bool &IsDone); /// Look for the indentation level of a block scalar. /// @@ -1538,30 +1551,40 @@ return true; } -bool Scanner::scanBlockScalarIndicators(char &StyleIndicator, - char &ChompingIndicator, - unsigned &IndentIndicator, - bool &IsDone) { +bool Scanner::scanBlockScalarIndicators( + BlockStyleIndicator &StyleIndicator, + BlockChompingIndicator &ChompingIndicator, unsigned &IndentIndicator, + bool &IsDone) { StyleIndicator = scanBlockStyleIndicator(); if (!scanBlockScalarHeader(ChompingIndicator, IndentIndicator, IsDone)) return false; return true; } -char Scanner::scanBlockStyleIndicator() { - char Indicator = ' '; - if (Current != End && (*Current == '>' || *Current == '|')) { - Indicator = *Current; - skip(1); +BlockStyleIndicator Scanner::scanBlockStyleIndicator() { + BlockStyleIndicator Indicator = BSI_None; + if (Current != End) { + if (*Current == '>') { + Indicator = BSI_Folded; + skip(1); + } else if (*Current == '|') { + Indicator = BSI_Literal; + skip(1); + } } return Indicator; } -char Scanner::scanBlockChompingIndicator() { - char Indicator = ' '; - if (Current != End && (*Current == '+' || *Current == '-')) { - Indicator = *Current; - skip(1); +BlockChompingIndicator Scanner::scanBlockChompingIndicator() { + BlockChompingIndicator Indicator = BCI_Clip; + if (Current != End) { + if (*Current == '+') { + Indicator = BCI_Keep; + skip(1); + } else if (*Current == '-') { + Indicator = BCI_Strip; + skip(1); + } } return Indicator; } @@ -1570,11 +1593,11 @@ /// /// Return the number of trailing line breaks to emit, depending on /// \p ChompingIndicator. -static unsigned getChompedLineBreaks(char ChompingIndicator, +static unsigned getChompedLineBreaks(BlockChompingIndicator ChompingIndicator, unsigned LineBreaks, StringRef Str) { - if (ChompingIndicator == '-') // Strip all line breaks. + if (ChompingIndicator == BCI_Strip) // Strip all line breaks. return 0; - if (ChompingIndicator == '+') // Keep all line breaks. + if (ChompingIndicator == BCI_Keep) // Keep all line breaks. return LineBreaks; // Clip trailing lines. return Str.empty() ? 0 : 1; @@ -1589,14 +1612,14 @@ return Indent; } -bool Scanner::scanBlockScalarHeader(char &ChompingIndicator, +bool Scanner::scanBlockScalarHeader(BlockChompingIndicator &ChompingIndicator, unsigned &IndentIndicator, bool &IsDone) { auto Start = Current; ChompingIndicator = scanBlockChompingIndicator(); IndentIndicator = scanBlockIndentationIndicator(); // Check for the chomping indicator once again. - if (ChompingIndicator == ' ') + if (ChompingIndicator == BCI_Clip) ChompingIndicator = scanBlockChompingIndicator(); Current = skip_while(&Scanner::skip_s_white, Current); skipComment(); @@ -1696,8 +1719,8 @@ bool Scanner::scanBlockScalar(bool IsLiteral) { assert(*Current == '|' || *Current == '>'); - char StyleIndicator; - char ChompingIndicator; + BlockStyleIndicator StyleIndicator; + BlockChompingIndicator ChompingIndicator; unsigned BlockIndent; bool IsDone = false; if (!scanBlockScalarIndicators(StyleIndicator, ChompingIndicator, BlockIndent, @@ -1705,7 +1728,6 @@ return false; if (IsDone) return true; - bool IsFolded = StyleIndicator == '>'; const auto *Start = Current; unsigned BlockExitIndent = Indent < 0 ? 0 : (unsigned)Indent; @@ -1728,7 +1750,8 @@ auto LineStart = Current; advanceWhile(&Scanner::skip_nb_char); if (LineStart != Current) { - if (LineBreaks && IsFolded && !Scanner::isLineEmpty(Str)) { + if (LineBreaks && StyleIndicator == BSI_Folded && + !Scanner::isLineEmpty(Str)) { // The folded style "folds" any single line break between content into a // single space, except when that content is "empty" (only contains // whitespace) in which case the line break is left as-is.