diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-02-16 20:13:02 +0000 |
| commit | b60736ec1405bb0a8dd40989f67ef4c93da068ab (patch) | |
| tree | 5c43fbb7c9fc45f0f87e0e6795a86267dbd12f9d /clang/lib/Format/FormatTokenLexer.cpp | |
| parent | cfca06d7963fa0909f90483b42a6d7d194d01e08 (diff) | |
Diffstat (limited to 'clang/lib/Format/FormatTokenLexer.cpp')
| -rw-r--r-- | clang/lib/Format/FormatTokenLexer.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 1fd153d1112e..e9b096370dbb 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -33,12 +33,14 @@ FormatTokenLexer::FormatTokenLexer( Encoding(Encoding), Allocator(Allocator), FirstInLineIndex(0), FormattingDisabled(false), MacroBlockBeginRegex(Style.MacroBlockBegin), MacroBlockEndRegex(Style.MacroBlockEnd) { - Lex.reset(new Lexer(ID, SourceMgr.getBuffer(ID), SourceMgr, + Lex.reset(new Lexer(ID, SourceMgr.getBufferOrFake(ID), SourceMgr, getFormattingLangOpts(Style))); Lex->SetKeepWhitespaceMode(true); for (const std::string &ForEachMacro : Style.ForEachMacros) Macros.insert({&IdentTable.get(ForEachMacro), TT_ForEachMacro}); + for (const std::string &AttributeMacro : Style.AttributeMacros) + Macros.insert({&IdentTable.get(AttributeMacro), TT_AttributeMacro}); for (const std::string &StatementMacro : Style.StatementMacros) Macros.insert({&IdentTable.get(StatementMacro), TT_StatementMacro}); for (const std::string &TypenameMacro : Style.TypenameMacros) @@ -50,6 +52,10 @@ FormatTokenLexer::FormatTokenLexer( Macros.insert( {&IdentTable.get(WhitespaceSensitiveMacro), TT_UntouchableMacroFunc}); } + for (const std::string &StatementAttributeLikeMacro : + Style.StatementAttributeLikeMacros) + Macros.insert({&IdentTable.get(StatementAttributeLikeMacro), + TT_StatementAttributeLikeMacro}); } ArrayRef<FormatToken *> FormatTokenLexer::lex() { @@ -119,6 +125,10 @@ void FormatTokenLexer::tryMergePreviousTokens() { tok::period}; static const tok::TokenKind JSNullishOperator[] = {tok::question, tok::question}; + static const tok::TokenKind JSNullishEqual[] = {tok::question, + tok::question, tok::equal}; + static const tok::TokenKind JSPipePipeEqual[] = {tok::pipepipe, tok::equal}; + static const tok::TokenKind JSAndAndEqual[] = {tok::ampamp, tok::equal}; // FIXME: Investigate what token type gives the correct operator priority. if (tryMergeTokens(JSIdentity, TT_BinaryOperator)) @@ -146,6 +156,13 @@ void FormatTokenLexer::tryMergePreviousTokens() { Tokens.back()->Tok.setKind(tok::period); return; } + if (tryMergeTokens(JSAndAndEqual, TT_JsAndAndEqual) || + tryMergeTokens(JSPipePipeEqual, TT_JsPipePipeEqual) || + tryMergeTokens(JSNullishEqual, TT_JsNullishCoalescingEqual)) { + // Treat like the "=" assignment operator. + Tokens.back()->Tok.setKind(tok::equal); + return; + } if (tryMergeJSPrivateIdentifier()) return; } @@ -399,7 +416,7 @@ bool FormatTokenLexer::tryTransformTryUsageForC() { if (!Try->is(tok::kw_try)) return false; auto &Next = *(Tokens.end() - 1); - if (Next->isOneOf(tok::l_brace, tok::colon)) + if (Next->isOneOf(tok::l_brace, tok::colon, tok::hash, tok::comment)) return false; if (Tokens.size() > 2) { @@ -761,7 +778,7 @@ bool FormatTokenLexer::tryMergeConflictMarkers() { unsigned FirstInLineOffset; std::tie(ID, FirstInLineOffset) = SourceMgr.getDecomposedLoc( Tokens[FirstInLineIndex]->getStartOfNonWhitespace()); - StringRef Buffer = SourceMgr.getBuffer(ID)->getBuffer(); + StringRef Buffer = SourceMgr.getBufferOrFake(ID).getBuffer(); // Calculate the offset of the start of the current line. auto LineOffset = Buffer.rfind('\n', FirstInLineOffset); if (LineOffset == StringRef::npos) { |
