[clang-format] Recognize Java logical shift assignment operator

At present, clang-format mangles Java containing logical right shift operators
('>>>=' or '>>>'), splitting them in two, resulting in invalid code:

 public class Minimal {
   public void func(String args) {
     int i = 42;
-    i >>>= 1;
+    i >> >= 1;
     return i;
   }
 }

This adds both forms of logical right shift to the FormatTokenLexer, so
clang-format won't attempt to split them and insert bogus whitespace.

https://reviews.llvm.org/D31652
Patch from Richard Bradfield <bradfier@fstab.me>!

llvm-svn: 299952
This commit is contained in:
Nico Weber 2017-04-11 15:50:04 +00:00
parent 46103e0ede
commit 48c94a6164
2 changed files with 25 additions and 0 deletions

View File

@ -84,6 +84,19 @@ void FormatTokenLexer::tryMergePreviousTokens() {
if (tryMergeTokens(JSRightArrow, TT_JsFatArrow))
return;
}
if (Style.Language == FormatStyle::LK_Java) {
static const tok::TokenKind JavaRightLogicalShift[] = {tok::greater,
tok::greater,
tok::greater};
static const tok::TokenKind JavaRightLogicalShiftAssign[] = {tok::greater,
tok::greater,
tok::greaterequal};
if (tryMergeTokens(JavaRightLogicalShift, TT_BinaryOperator))
return;
if (tryMergeTokens(JavaRightLogicalShiftAssign, TT_BinaryOperator))
return;
}
}
bool FormatTokenLexer::tryMergeNSStringLiteral() {

View File

@ -522,5 +522,17 @@ TEST_F(FormatTestJava, AlignsBlockComments) {
" void f() {}"));
}
TEST_F(FormatTestJava, RetainsLogicalShifts) {
verifyFormat("void f() {\n"
" int a = 1;\n"
" a >>>= 1;\n"
"}");
verifyFormat("void f() {\n"
" int a = 1;\n"
" a = a >>> 1;\n"
"}");
}
} // end namespace tooling
} // end namespace clang