[PATCH] D80547: [clang-format] Fix an ObjC regression introduced with new [[likely]][[unlikely]] support in if/else clauses
MyDeveloperDay via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue May 26 04:18:03 PDT 2020
MyDeveloperDay created this revision.
MyDeveloperDay added reviewers: krasimir, JakeMerdichAMD.
MyDeveloperDay added projects: clang, clang-format.
D80144: [clang-format] @lefticus just taught the world how to use [[unlikely]] but we forgot to teach clang-format <https://reviews.llvm.org/D80144> introduce an ObjC regression
Only parse the `[]` if what follows is really an attribute
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80547
Files:
clang/lib/Format/UnwrappedLineParser.cpp
clang/lib/Format/UnwrappedLineParser.h
clang/unittests/Format/FormatTestObjC.cpp
Index: clang/unittests/Format/FormatTestObjC.cpp
===================================================================
--- clang/unittests/Format/FormatTestObjC.cpp
+++ clang/unittests/Format/FormatTestObjC.cpp
@@ -1434,6 +1434,18 @@
" }]");
}
+TEST_F(FormatTestObjC, IfNotUnlikely) {
+ Style = getGoogleStyle(FormatStyle::LK_ObjC);
+ Style.ObjCBreakBeforeNestedBlockParam = false;
+
+ verifyFormat("if (argc < 5) [obj func:arg];");
+
+ verifyFormat("if (argc < 5)\n"
+ " [obj func:arg];\n"
+ "else\n"
+ " [obj func:arg2];");
+}
+
} // end namespace
} // end namespace format
} // end namespace clang
Index: clang/lib/Format/UnwrappedLineParser.h
===================================================================
--- clang/lib/Format/UnwrappedLineParser.h
+++ clang/lib/Format/UnwrappedLineParser.h
@@ -134,6 +134,7 @@
bool tryToParseLambdaIntroducer();
bool tryToParsePropertyAccessor();
void tryToParseJSFunction();
+ bool tryToParseAttribute();
void addUnwrappedLine();
bool eof() const;
// LevelDifference is the difference of levels after and before the current
Index: clang/lib/Format/UnwrappedLineParser.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -1962,7 +1962,7 @@
if (FormatTok->Tok.is(tok::l_paren))
parseParens();
// handle [[likely]] / [[unlikely]]
- if (FormatTok->is(tok::l_square))
+ if (FormatTok->is(tok::l_square) && tryToParseAttribute())
parseSquare();
bool NeedsUnwrappedLine = false;
if (FormatTok->Tok.is(tok::l_brace)) {
@@ -1981,7 +1981,7 @@
if (FormatTok->Tok.is(tok::kw_else)) {
nextToken();
// handle [[likely]] / [[unlikely]]
- if (FormatTok->is(tok::l_square))
+ if (FormatTok->Tok.is(tok::l_square) && tryToParseAttribute())
parseSquare();
if (FormatTok->Tok.is(tok::l_brace)) {
CompoundStatementIndenter Indenter(this, Style, Line->Level);
@@ -2343,6 +2343,18 @@
// "} n, m;" will end up in one unwrapped line.
}
+// look to see if we have [[ by looking ahead if
+// its not then rewind to the original position
+bool UnwrappedLineParser::tryToParseAttribute() {
+ unsigned StoredPosition = Tokens->getPosition();
+ FormatToken *Tok = Tokens->getNextToken();
+ FormatTok = Tokens->setPosition(StoredPosition);
+ if (Tok->is(tok::l_square)) {
+ return true;
+ }
+ return false;
+}
+
void UnwrappedLineParser::parseJavaEnumBody() {
// Determine whether the enum is simple, i.e. does not have a semicolon or
// constants with class bodies. Simple enums can be formatted like braced
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80547.266162.patch
Type: text/x-patch
Size: 2707 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200526/2c0d1ed8/attachment-0001.bin>
More information about the cfe-commits
mailing list