diff options
author | Martin Probst <martin@probst.io> | 2019-11-07 23:39:03 +0100 |
---|---|---|
committer | Martin Probst <martin@probst.io> | 2019-11-11 16:35:35 +0100 |
commit | a7638d384983e8e3eb44a2d8c757238efc7096dc (patch) | |
tree | 53214762176bda8ffaded6b59b65b643aaa1dbc3 /clang/lib/Format/FormatTokenLexer.cpp | |
parent | 48b7068beca9d3a39dcfbebcb384b59b7898065f (diff) | |
download | bcm5719-llvm-a7638d384983e8e3eb44a2d8c757238efc7096dc.tar.gz bcm5719-llvm-a7638d384983e8e3eb44a2d8c757238efc7096dc.zip |
clang-format: [JS] support null operators.
Summary:
JavaScript / TypeScript is adding two new operators: the null
propagating operator `?.` and the nullish coalescing operator `??`.
const x = foo ?? 'default';
const z = foo?.bar?.baz;
This change adds support to lex and format both.
Reviewers: krasimir
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D69971
Diffstat (limited to 'clang/lib/Format/FormatTokenLexer.cpp')
-rw-r--r-- | clang/lib/Format/FormatTokenLexer.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index 5d8a77577c0..ef20ba884fb 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -100,6 +100,10 @@ void FormatTokenLexer::tryMergePreviousTokens() { static const tok::TokenKind JSExponentiation[] = {tok::star, tok::star}; static const tok::TokenKind JSExponentiationEqual[] = {tok::star, tok::starequal}; + static const tok::TokenKind JSNullPropagatingOperator[] = {tok::question, + tok::period}; + static const tok::TokenKind JSNullishOperator[] = {tok::question, + tok::question}; // FIXME: Investigate what token type gives the correct operator priority. if (tryMergeTokens(JSIdentity, TT_BinaryOperator)) @@ -116,6 +120,14 @@ void FormatTokenLexer::tryMergePreviousTokens() { Tokens.back()->Tok.setKind(tok::starequal); return; } + if (tryMergeTokens(JSNullishOperator, TT_JsNullishCoalescingOperator)) + return; + if (tryMergeTokens(JSNullPropagatingOperator, + TT_JsNullPropagatingOperator)) { + // Treat like a regular "." access. + Tokens.back()->Tok.setKind(tok::period); + return; + } if (tryMergeJSPrivateIdentifier()) return; } |