Author: Martin Probst Date: 2020-11-10T09:26:46+01:00 New Revision: 16212b8b3e4fd5fbb73aecabf6f0b6fec91913d2
URL: https://github.com/llvm/llvm-project/commit/16212b8b3e4fd5fbb73aecabf6f0b6fec91913d2 DIFF: https://github.com/llvm/llvm-project/commit/16212b8b3e4fd5fbb73aecabf6f0b6fec91913d2.diff LOG: clang-format: [JS] support new assignment operators. Before: a && = b; After: a &&= b; These operators are new additions in ES2021. Differential Revision: https://reviews.llvm.org/D91132 Added: Modified: clang/lib/Format/FormatToken.h clang/lib/Format/FormatTokenLexer.cpp clang/unittests/Format/FormatTestJS.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index a3cb81f1b1ef..d53c016fd4db 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -68,6 +68,9 @@ namespace format { TYPE(JsTypeColon) \ TYPE(JsTypeOperator) \ TYPE(JsTypeOptionalQuestion) \ + TYPE(JsAndAndEqual) \ + TYPE(JsPipePipeEqual) \ + TYPE(JsNullishCoalescingEqual) \ TYPE(LambdaArrow) \ TYPE(LambdaLBrace) \ TYPE(LambdaLSquare) \ diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 2415da3a7ffb..8733834a079a 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -121,6 +121,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)) @@ -148,6 +152,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; } diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index d140fe581f2a..84d76c67764a 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -2424,6 +2424,15 @@ TEST_F(FormatTestJS, NullishCoalescingOperator) { getGoogleJSStyleWithColumns(40)); } +TEST_F(FormatTestJS, AssignmentOperators) { + verifyFormat("a &&= b;\n"); + verifyFormat("a ||= b;\n"); + // NB: need to split ? ?= to avoid it being interpreted by C++ as a trigraph + // for #. + verifyFormat("a ?" + "?= b;\n"); +} + TEST_F(FormatTestJS, Conditional) { verifyFormat("y = x ? 1 : 2;"); verifyFormat("x ? 1 : 2;"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits