diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Format/FormatTokenLexer.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Format/FormatTokenLexer.cpp | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/contrib/llvm-project/clang/lib/Format/FormatTokenLexer.cpp b/contrib/llvm-project/clang/lib/Format/FormatTokenLexer.cpp index 52a55ea23b5f..63949b2e26bd 100644 --- a/contrib/llvm-project/clang/lib/Format/FormatTokenLexer.cpp +++ b/contrib/llvm-project/clang/lib/Format/FormatTokenLexer.cpp @@ -100,6 +100,13 @@ ArrayRef<FormatToken *> FormatTokenLexer::lex() { if (Tokens.back()->NewlinesBefore > 0 || Tokens.back()->IsMultiline) FirstInLineIndex = Tokens.size() - 1; } while (Tokens.back()->isNot(tok::eof)); + if (Style.InsertNewlineAtEOF) { + auto &TokEOF = *Tokens.back(); + if (TokEOF.NewlinesBefore == 0) { + TokEOF.NewlinesBefore = 1; + TokEOF.OriginalColumn = 0; + } + } return Tokens; } @@ -276,13 +283,44 @@ void FormatTokenLexer::tryMergePreviousTokens() { return; } } - // TableGen's Multi line string starts with [{ - if (Style.isTableGen() && tryMergeTokens({tok::l_square, tok::l_brace}, - TT_TableGenMultiLineString)) { - // Set again with finalizing. This must never be annotated as other types. - Tokens.back()->setFinalizedType(TT_TableGenMultiLineString); - Tokens.back()->Tok.setKind(tok::string_literal); - return; + if (Style.isTableGen()) { + // TableGen's Multi line string starts with [{ + if (tryMergeTokens({tok::l_square, tok::l_brace}, + TT_TableGenMultiLineString)) { + // Set again with finalizing. This must never be annotated as other types. + Tokens.back()->setFinalizedType(TT_TableGenMultiLineString); + Tokens.back()->Tok.setKind(tok::string_literal); + return; + } + // TableGen's bang operator is the form !<name>. + // !cond is a special case with specific syntax. + if (tryMergeTokens({tok::exclaim, tok::identifier}, + TT_TableGenBangOperator)) { + Tokens.back()->Tok.setKind(tok::identifier); + Tokens.back()->Tok.setIdentifierInfo(nullptr); + if (Tokens.back()->TokenText == "!cond") + Tokens.back()->setFinalizedType(TT_TableGenCondOperator); + else + Tokens.back()->setFinalizedType(TT_TableGenBangOperator); + return; + } + if (tryMergeTokens({tok::exclaim, tok::kw_if}, TT_TableGenBangOperator)) { + // Here, "! if" becomes "!if". That is, ! captures if even when the space + // exists. That is only one possibility in TableGen's syntax. + Tokens.back()->Tok.setKind(tok::identifier); + Tokens.back()->Tok.setIdentifierInfo(nullptr); + Tokens.back()->setFinalizedType(TT_TableGenBangOperator); + return; + } + // +, - with numbers are literals. Not unary operators. + if (tryMergeTokens({tok::plus, tok::numeric_constant}, TT_Unknown)) { + Tokens.back()->Tok.setKind(tok::numeric_constant); + return; + } + if (tryMergeTokens({tok::minus, tok::numeric_constant}, TT_Unknown)) { + Tokens.back()->Tok.setKind(tok::numeric_constant); + return; + } } } @@ -373,7 +411,7 @@ bool FormatTokenLexer::tryMergeNullishCoalescingEqual() { return false; auto &NullishCoalescing = *(Tokens.end() - 2); auto &Equal = *(Tokens.end() - 1); - if (NullishCoalescing->getType() != TT_NullCoalescingOperator || + if (NullishCoalescing->isNot(TT_NullCoalescingOperator) || Equal->isNot(tok::equal)) { return false; } @@ -785,7 +823,7 @@ void FormatTokenLexer::handleTableGenMultilineString() { auto CloseOffset = Lex->getBuffer().find("}]", OpenOffset); if (CloseOffset == StringRef::npos) return; - auto Text = Lex->getBuffer().substr(OpenOffset, CloseOffset + 2); + auto Text = Lex->getBuffer().substr(OpenOffset, CloseOffset - OpenOffset + 2); MultiLineString->TokenText = Text; resetLexer(SourceMgr.getFileOffset( Lex->getSourceLocation(Lex->getBufferLocation() - 2 + Text.size()))); @@ -1389,7 +1427,7 @@ void FormatTokenLexer::readRawToken(FormatToken &Tok) { // For formatting, treat unterminated string literals like normal string // literals. if (Tok.is(tok::unknown)) { - if (!Tok.TokenText.empty() && Tok.TokenText[0] == '"') { + if (Tok.TokenText.starts_with("\"")) { Tok.Tok.setKind(tok::string_literal); Tok.IsUnterminatedLiteral = true; } else if (Style.isJavaScript() && Tok.TokenText == "''") { @@ -1411,7 +1449,6 @@ void FormatTokenLexer::readRawToken(FormatToken &Tok) { void FormatTokenLexer::resetLexer(unsigned Offset) { StringRef Buffer = SourceMgr.getBufferData(ID); - LangOpts = getFormattingLangOpts(Style); Lex.reset(new Lexer(SourceMgr.getLocForStartOfFile(ID), LangOpts, Buffer.begin(), Buffer.begin() + Offset, Buffer.end())); Lex->SetKeepWhitespaceMode(true); |