This revision was automatically updated to reflect the committed changes. Closed by commit rGcc918e90c048: [clang-format] [PR33890] Add support for Microsoft C++/CLI non standard for… (authored by MyDeveloperDay).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D80228/new/ https://reviews.llvm.org/D80228 Files: clang/lib/Format/FormatTokenLexer.cpp clang/lib/Format/FormatTokenLexer.h clang/unittests/Format/FormatTest.cpp Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -994,6 +994,9 @@ "#define Q_FOREACH (x, y)\n" "#define BOOST_FOREACH (x, y)\n" "#define UNKNOWN_FOREACH (x, y)\n"); + + // handle microsoft non standard extension + verifyFormat("for each (char c in x->MyStringProperty)"); } TEST_F(FormatTest, FormatsWhileLoop) { Index: clang/lib/Format/FormatTokenLexer.h =================================================================== --- clang/lib/Format/FormatTokenLexer.h +++ clang/lib/Format/FormatTokenLexer.h @@ -55,6 +55,7 @@ bool tryMergeCSharpDoubleQuestion(); bool tryMergeCSharpNullConditional(); bool tryTransformCSharpForEach(); + bool tryMergeForEach(); bool tryMergeTokens(ArrayRef<tok::TokenKind> Kinds, TokenType NewType); Index: clang/lib/Format/FormatTokenLexer.cpp =================================================================== --- clang/lib/Format/FormatTokenLexer.cpp +++ clang/lib/Format/FormatTokenLexer.cpp @@ -74,6 +74,8 @@ return; if (tryMergeLessLess()) return; + if (tryMergeForEach()) + return; if (Style.isCSharp()) { if (tryMergeCSharpKeywordVariables()) @@ -359,6 +361,28 @@ return true; } +bool FormatTokenLexer::tryMergeForEach() { + if (Tokens.size() < 2) + return false; + auto &For = *(Tokens.end() - 2); + auto &Each = *(Tokens.end() - 1); + if (!For->is(tok::kw_for)) + return false; + if (!Each->is(tok::identifier)) + return false; + if (Each->TokenText != "each") + return false; + + For->setType(TT_ForEachMacro); + For->Tok.setKind(tok::kw_for); + + For->TokenText = StringRef(For->TokenText.begin(), + Each->TokenText.end() - For->TokenText.begin()); + For->ColumnWidth += Each->ColumnWidth; + Tokens.erase(Tokens.end() - 1); + return true; +} + bool FormatTokenLexer::tryMergeLessLess() { // Merge X,less,less,Y into X,lessless,Y unless X or Y is less. if (Tokens.size() < 3)
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -994,6 +994,9 @@ "#define Q_FOREACH (x, y)\n" "#define BOOST_FOREACH (x, y)\n" "#define UNKNOWN_FOREACH (x, y)\n"); + + // handle microsoft non standard extension + verifyFormat("for each (char c in x->MyStringProperty)"); } TEST_F(FormatTest, FormatsWhileLoop) { Index: clang/lib/Format/FormatTokenLexer.h =================================================================== --- clang/lib/Format/FormatTokenLexer.h +++ clang/lib/Format/FormatTokenLexer.h @@ -55,6 +55,7 @@ bool tryMergeCSharpDoubleQuestion(); bool tryMergeCSharpNullConditional(); bool tryTransformCSharpForEach(); + bool tryMergeForEach(); bool tryMergeTokens(ArrayRef<tok::TokenKind> Kinds, TokenType NewType); Index: clang/lib/Format/FormatTokenLexer.cpp =================================================================== --- clang/lib/Format/FormatTokenLexer.cpp +++ clang/lib/Format/FormatTokenLexer.cpp @@ -74,6 +74,8 @@ return; if (tryMergeLessLess()) return; + if (tryMergeForEach()) + return; if (Style.isCSharp()) { if (tryMergeCSharpKeywordVariables()) @@ -359,6 +361,28 @@ return true; } +bool FormatTokenLexer::tryMergeForEach() { + if (Tokens.size() < 2) + return false; + auto &For = *(Tokens.end() - 2); + auto &Each = *(Tokens.end() - 1); + if (!For->is(tok::kw_for)) + return false; + if (!Each->is(tok::identifier)) + return false; + if (Each->TokenText != "each") + return false; + + For->setType(TT_ForEachMacro); + For->Tok.setKind(tok::kw_for); + + For->TokenText = StringRef(For->TokenText.begin(), + Each->TokenText.end() - For->TokenText.begin()); + For->ColumnWidth += Each->ColumnWidth; + Tokens.erase(Tokens.end() - 1); + return true; +} + bool FormatTokenLexer::tryMergeLessLess() { // Merge X,less,less,Y into X,lessless,Y unless X or Y is less. if (Tokens.size() < 3)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits