forked from OSchip/llvm-project
[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:
parent
46103e0ede
commit
48c94a6164
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue