llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-format Author: Owen Pan (owenca) <details> <summary>Changes</summary> Fixes #<!-- -->108536. --- Full diff: https://github.com/llvm/llvm-project/pull/108671.diff 2 Files Affected: - (modified) clang/lib/Format/TokenAnnotator.cpp (+6-4) - (modified) clang/unittests/Format/TokenAnnotatorTest.cpp (+9) ``````````diff diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index dfa703aed0d34d..4313cc20dd61a3 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -189,7 +189,8 @@ class AnnotatingParser { next(); } - for (bool SeenTernaryOperator = false; CurrentToken;) { + for (bool SeenTernaryOperator = false, SeenFatArrow = false; + CurrentToken;) { const bool InExpr = Contexts[Contexts.size() - 2].IsExpression; if (CurrentToken->is(tok::greater)) { const auto *Next = CurrentToken->Next; @@ -243,7 +244,7 @@ class AnnotatingParser { // operator that was misinterpreted because we are parsing template // parameters. // FIXME: This is getting out of hand, write a decent parser. - if (InExpr && !Line.startsWith(tok::kw_template) && + if (InExpr && !SeenFatArrow && !Line.startsWith(tok::kw_template) && Prev.is(TT_BinaryOperator)) { const auto Precedence = Prev.getPrecedence(); if (Precedence > prec::Conditional && Precedence < prec::Relational) @@ -251,6 +252,8 @@ class AnnotatingParser { } if (Prev.isOneOf(tok::question, tok::colon) && !Style.isProto()) SeenTernaryOperator = true; + else if (Prev.is(TT_FatArrow)) + SeenFatArrow = true; updateParameterCount(Left, CurrentToken); if (Style.Language == FormatStyle::LK_Proto) { if (FormatToken *Previous = CurrentToken->getPreviousNonComment()) { @@ -260,8 +263,7 @@ class AnnotatingParser { Previous->setType(TT_SelectorName); } } - } - if (Style.isTableGen()) { + } else if (Style.isTableGen()) { if (CurrentToken->isOneOf(tok::comma, tok::equal)) { // They appear as separators. Unless they are not in class definition. next(); diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 5c28e3a4ea5a1f..c3ac5df12d085c 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -616,6 +616,15 @@ TEST_F(TokenAnnotatorTest, UnderstandsTernaryInTemplate) { EXPECT_TOKEN(Tokens[8], tok::greater, TT_TemplateCloser); } +TEST_F(TokenAnnotatorTest, FatArrowInAngleBrackets) { + auto Tokens = annotate("foo = new Bar<(id: int) => X | Y>();", + getLLVMStyle(FormatStyle::LK_JavaScript)); + ASSERT_EQ(Tokens.size(), 19u) << Tokens; + EXPECT_TOKEN(Tokens[4], tok::less, TT_TemplateOpener); + EXPECT_TOKEN(Tokens[10], tok::equal, TT_FatArrow); + EXPECT_TOKEN(Tokens[14], tok::greater, TT_TemplateCloser); +} + TEST_F(TokenAnnotatorTest, UnderstandsNonTemplateAngleBrackets) { auto Tokens = annotate("return a < b && c > d;"); ASSERT_EQ(Tokens.size(), 10u) << Tokens; `````````` </details> https://github.com/llvm/llvm-project/pull/108671 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits