[PATCH] D31652: [clang-format] Recognize Java logical shift assignment operator

2017-04-11 Thread Nico Weber via Phabricator via cfe-commits
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

2017-04-11 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-11 Thread Nico Weber via Phabricator via cfe-commits
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

2017-04-11 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-06 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-06 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-06 Thread Nico Weber via Phabricator via cfe-commits
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

2017-04-06 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-06 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-06 Thread Alex Lorenz via Phabricator via cfe-commits
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

2017-04-06 Thread Alex Lorenz via Phabricator via cfe-commits
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

2017-04-06 Thread Richard Bradfield via Phabricator via cfe-commits
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

2017-04-04 Thread Richard Bradfield via Phabricator via cfe-commits
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