[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
thakis closed this revision. thakis added a comment. Landed in r299952: http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20170410/189882.html Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier added a comment. In https://reviews.llvm.org/D31652#723664, @thakis wrote: > Looks good. Do you have commit access? Thanks! And no I don't have commit access. Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
thakis accepted this revision. thakis added a comment. This revision is now accepted and ready to land. Looks good. Do you have commit access? Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier added a comment. Friendly ping. Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier added a comment. Thanks for that @thakis, that's a much better solution than the first attempt! Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier updated this revision to Diff 94438. bradfier edited the summary of this revision. bradfier added a comment. Switch to a more appropriate (and much simpler) method of identifying these Java-specific operators. Also removed any references to fictitious "logical left shifts", I think I made those up while tired... Repository: rL LLVM https://reviews.llvm.org/D31652 Files: lib/Format/FormatTokenLexer.cpp unittests/Format/FormatTestJava.cpp Index: unittests/Format/FormatTestJava.cpp === --- unittests/Format/FormatTestJava.cpp +++ unittests/Format/FormatTestJava.cpp @@ -522,5 +522,17 @@ " 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 Index: lib/Format/FormatTokenLexer.cpp === --- lib/Format/FormatTokenLexer.cpp +++ lib/Format/FormatTokenLexer.cpp @@ -82,6 +82,19 @@ 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::tryMergeLessLess() { Index: unittests/Format/FormatTestJava.cpp === --- unittests/Format/FormatTestJava.cpp +++ unittests/Format/FormatTestJava.cpp @@ -522,5 +522,17 @@ " 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 Index: lib/Format/FormatTokenLexer.cpp === --- lib/Format/FormatTokenLexer.cpp +++ lib/Format/FormatTokenLexer.cpp @@ -82,6 +82,19 @@ 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::tryMergeLessLess() { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
thakis added inline comments. Comment at: include/clang/Basic/TokenKinds.def:230 +PUNCTUATOR(greatergreatergreaterequal, ">>>=") +PUNCTUATOR(lesslesslessequal, "<<<=") + I think this is the wrong approach to go about this. clang is a C compiler, and its tokenizer shouldn't have to know about Java. Instead, this should be handled in the formatter. See tryMergePreviousTokens() in lib/Format/FormatTokenLexer.cpp for how we do this for e.g. => or >>>= etc for JavaScript – just do the same for Java. Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier added inline comments. Comment at: include/clang/Basic/LangOptions.def:95 LANGOPT(ObjC2 , 1, 0, "Objective-C 2") +LANGOPT(Java , 1, 0, "Java") BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, arphaman wrote: > I don't think we should have a `Java` lang option, since Clang is not > actually a Java frontend. Maybe another option like `LogicalShiftOperators` > will work better? That seems reasonable. C and C++ have `>>>` or `<<<` operators as part of CUDA extensions though, so maybe the full `LogicalShiftAssignOperators` is more precise? Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier added a comment. In https://reviews.llvm.org/D31652#719990, @arphaman wrote: > Are the `<<<` and `>>>` operators handled correctly? Yes, as a side-effect of CUDA kernel-call syntax which uses `>>>` and `<<<`, those tokens are recognised as punctuators. Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
arphaman added inline comments. Comment at: include/clang/Basic/LangOptions.def:95 LANGOPT(ObjC2 , 1, 0, "Objective-C 2") +LANGOPT(Java , 1, 0, "Java") BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, I don't think we should have a `Java` lang option, since Clang is not actually a Java frontend. Maybe another option like `LogicalShiftOperators` will work better? Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
arphaman added a comment. Are the `<<<` and `>>>` operators handled correctly? Repository: rL LLVM https://reviews.llvm.org/D31652 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier updated this revision to Diff 94334. bradfier added a reviewer: klimek. bradfier added a comment. Add more diff context, add klimek as reviewer. Repository: rL LLVM https://reviews.llvm.org/D31652 Files: include/clang/Basic/LangOptions.def include/clang/Basic/TokenKinds.def lib/Format/Format.cpp lib/Lex/Lexer.cpp unittests/Format/FormatTestJava.cpp Index: unittests/Format/FormatTestJava.cpp === --- unittests/Format/FormatTestJava.cpp +++ unittests/Format/FormatTestJava.cpp @@ -522,5 +522,17 @@ " void f() {}")); } +TEST_F(FormatTestJava, RetainsLogicalShiftAssignments) { +verifyFormat("void f() {\n" + " int a = 1;\n" + " a >>>= 1;\n" + "}"); +verifyFormat("void f() {\n" + " int a = 1;\n" + " a <<<= 1;\n" + "}"); +} + + } // end namespace tooling } // end namespace clang Index: lib/Lex/Lexer.cpp === --- lib/Lex/Lexer.cpp +++ lib/Lex/Lexer.cpp @@ -2967,7 +2967,7 @@ Result.setFlag(Token::LeadingSpace); } - unsigned SizeTmp, SizeTmp2; // Temporaries for use in cases below. + unsigned SizeTmp, SizeTmp2, SizeTmp3; // Temporaries for use in cases below. // Read a character, advancing over it. char Char = getAndAdvanceChar(CurPtr, Result); @@ -3449,6 +3449,14 @@ Kind = tok::lesslessless; CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), SizeTmp2, Result); + } else if (LangOpts.Java && After == '<') { + char Fourth = getCharAndSize(CurPtr+SizeTmp+SizeTmp2, SizeTmp3); + if (Fourth == '=') { + Kind = tok::lesslesslessequal; + CurPtr = ConsumeChar(ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), + SizeTmp2, Result), + SizeTmp3, Result); + } } else { CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); Kind = tok::lessless; @@ -3505,6 +3513,14 @@ Kind = tok::greatergreatergreater; CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), SizeTmp2, Result); + } else if (LangOpts.Java && After == '>') { + char Fourth = getCharAndSize(CurPtr+SizeTmp+SizeTmp2, SizeTmp3); + if (Fourth == '=') { + Kind = tok::greatergreatergreaterequal; + CurPtr = ConsumeChar(ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), + SizeTmp2, Result), + SizeTmp3, Result); + } } else { CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); Kind = tok::greatergreater; Index: lib/Format/Format.cpp === --- lib/Format/Format.cpp +++ lib/Format/Format.cpp @@ -1903,6 +1903,7 @@ LangOpts.ObjC2 = 1; LangOpts.MicrosoftExt = 1;// To get kw___try, kw___finally. LangOpts.DeclSpecKeyword = 1; // To get __declspec. + LangOpts.Java = Style.Language == FormatStyle::LK_Java; return LangOpts; } Index: include/clang/Basic/TokenKinds.def === --- include/clang/Basic/TokenKinds.def +++ include/clang/Basic/TokenKinds.def @@ -225,6 +225,10 @@ // CL support PUNCTUATOR(caretcaret,"^^") +// Java support (for clang-format only) +PUNCTUATOR(greatergreatergreaterequal, ">>>=") +PUNCTUATOR(lesslesslessequal, "<<<=") + // C99 6.4.1: Keywords. These turn into kw_* tokens. // Flags allowed: // KEYALL - This is a keyword in all variants of C and C++, or it Index: include/clang/Basic/LangOptions.def === --- include/clang/Basic/LangOptions.def +++ include/clang/Basic/LangOptions.def @@ -92,6 +92,7 @@ LANGOPT(CPlusPlus1z , 1, 0, "C++1z") LANGOPT(ObjC1 , 1, 0, "Objective-C 1") LANGOPT(ObjC2 , 1, 0, "Objective-C 2") +LANGOPT(Java , 1, 0, "Java") BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, "Objective-C auto-synthesized properties") BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0, ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator
bradfier created this revision. Herald added a subscriber: klimek. At present, clang-format mangles Java containing logical shift assignment 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 the combined assignment forms for logical shifts to the lexer, so clang-format sees them as single tokens and doesn't try to insert whitespace.. Repository: rL LLVM https://reviews.llvm.org/D31652 Files: include/clang/Basic/LangOptions.def include/clang/Basic/TokenKinds.def lib/Format/Format.cpp lib/Lex/Lexer.cpp unittests/Format/FormatTestJava.cpp Index: unittests/Format/FormatTestJava.cpp === --- unittests/Format/FormatTestJava.cpp +++ unittests/Format/FormatTestJava.cpp @@ -522,5 +522,17 @@ " void f() {}")); } +TEST_F(FormatTestJava, RetainsLogicalShiftAssignments) { +verifyFormat("void f() {\n" + " int a = 1;\n" + " a >>>= 1;\n" + "}"); +verifyFormat("void f() {\n" + " int a = 1;\n" + " a <<<= 1;\n" + "}"); +} + + } // end namespace tooling } // end namespace clang Index: lib/Lex/Lexer.cpp === --- lib/Lex/Lexer.cpp +++ lib/Lex/Lexer.cpp @@ -2967,7 +2967,7 @@ Result.setFlag(Token::LeadingSpace); } - unsigned SizeTmp, SizeTmp2; // Temporaries for use in cases below. + unsigned SizeTmp, SizeTmp2, SizeTmp3; // Temporaries for use in cases below. // Read a character, advancing over it. char Char = getAndAdvanceChar(CurPtr, Result); @@ -3449,6 +3449,14 @@ Kind = tok::lesslessless; CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), SizeTmp2, Result); + } else if (LangOpts.Java && After == '<') { + char Fourth = getCharAndSize(CurPtr+SizeTmp+SizeTmp2, SizeTmp3); + if (Fourth == '=') { + Kind = tok::lesslesslessequal; + CurPtr = ConsumeChar(ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), + SizeTmp2, Result), + SizeTmp3, Result); + } } else { CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); Kind = tok::lessless; @@ -3505,6 +3513,14 @@ Kind = tok::greatergreatergreater; CurPtr = ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), SizeTmp2, Result); + } else if (LangOpts.Java && After == '>') { + char Fourth = getCharAndSize(CurPtr+SizeTmp+SizeTmp2, SizeTmp3); + if (Fourth == '=') { + Kind = tok::greatergreatergreaterequal; + CurPtr = ConsumeChar(ConsumeChar(ConsumeChar(CurPtr, SizeTmp, Result), + SizeTmp2, Result), + SizeTmp3, Result); + } } else { CurPtr = ConsumeChar(CurPtr, SizeTmp, Result); Kind = tok::greatergreater; Index: lib/Format/Format.cpp === --- lib/Format/Format.cpp +++ lib/Format/Format.cpp @@ -1902,6 +1902,7 @@ LangOpts.ObjC2 = 1; LangOpts.MicrosoftExt = 1;// To get kw___try, kw___finally. LangOpts.DeclSpecKeyword = 1; // To get __declspec. + LangOpts.Java = Style.Language == FormatStyle::LK_Java; return LangOpts; } Index: include/clang/Basic/TokenKinds.def === --- include/clang/Basic/TokenKinds.def +++ include/clang/Basic/TokenKinds.def @@ -225,6 +225,10 @@ // CL support PUNCTUATOR(caretcaret,"^^") +// Java support (for clang-format only) +PUNCTUATOR(greatergreatergreaterequal, ">>>=") +PUNCTUATOR(lesslesslessequal, "<<<=") + // C99 6.4.1: Keywords. These turn into kw_* tokens. // Flags allowed: // KEYALL - This is a keyword in all variants of C and C++, or it Index: include/clang/Basic/LangOptions.def === --- include/clang/Basic/LangOptions.def +++ include/clang/Basic/LangOptions.def @@ -92,6 +92,7 @@ LANGOPT(CPlusPlus1z , 1, 0, "C++1z") LANGOPT(ObjC1 , 1, 0, "Objective-C 1") LANGOPT(ObjC2 , 1, 0, "Objective-C 2") +LANGOPT(Java , 1, 0, "Java") BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, "Objective-C auto-synthesized properties") BENIGN_LANGOPT(EncodeExtendedBlockSig , 1, 0, ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits