[PATCH] D27377: clang-format: Support the Java 8 'default' method modifier

Luis Héctor Chávez via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 2 17:02:12 PST 2016


lhchavez created this revision.
lhchavez added a reviewer: djasper.
lhchavez added subscribers: srhines, cfe-commits.
Herald added a subscriber: klimek.

Java 8 introduced the use of using the 'default' keyword as modifier in
interface method declarations[1]. Previously it was being parsed as
being part of a label, which put the parser into a very weird state it
could not get out of.

This change adds support for 'default' by treating it as a normal
identifier in Java when the parser is expecting a declaration.

1: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html


https://reviews.llvm.org/D27377

Files:
  lib/Format/UnwrappedLineParser.cpp
  unittests/Format/FormatTestJava.cpp


Index: unittests/Format/FormatTestJava.cpp
===================================================================
--- unittests/Format/FormatTestJava.cpp
+++ unittests/Format/FormatTestJava.cpp
@@ -515,5 +515,20 @@
                    "  void f() {}"));
 }
 
+TEST_F(FormatTestJava, UnderstandsDefaultModifier) {
+  verifyFormat("class SomeClass {\n"
+               "  default void f() {}\n"
+               "  int g() {\n"
+               "    switch (0) {\n"
+               "      case 0:\n"
+               "        break;\n"
+               "      default:\n"
+               "        break;\n"
+               "    }\n"
+               "  }\n"
+               "}",
+               getGoogleStyle(FormatStyle::LK_Java));
+}
+
 } // end namespace tooling
 } // end namespace clang
Index: lib/Format/UnwrappedLineParser.cpp
===================================================================
--- lib/Format/UnwrappedLineParser.cpp
+++ lib/Format/UnwrappedLineParser.cpp
@@ -294,6 +294,15 @@
       addUnwrappedLine();
       break;
     case tok::kw_default:
+      if (Style.Language != FormatStyle::LK_Java || !Line->MustBeDeclaration) {
+        if (!SwitchLabelEncountered &&
+            (Style.IndentCaseLabels ||
+             (Line->InPPDirective && Line->Level == 1)))
+          ++Line->Level;
+        SwitchLabelEncountered = true;
+      }
+      parseStructuralElement();
+      break;
     case tok::kw_case:
       if (!SwitchLabelEncountered &&
           (Style.IndentCaseLabels || (Line->InPPDirective && Line->Level == 1)))
@@ -853,9 +862,13 @@
     parseSwitch();
     return;
   case tok::kw_default:
-    nextToken();
-    parseLabel();
-    return;
+    if (Style.Language != FormatStyle::LK_Java || !Line->MustBeDeclaration) {
+      nextToken();
+      parseLabel();
+      return;
+    }
+    // 'default' can appear in a Java 8 declaration. Parse it as such.
+    break;
   case tok::kw_case:
     parseCaseLabel();
     return;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27377.80155.patch
Type: text/x-patch
Size: 1958 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161203/699df5aa/attachment.bin>


More information about the cfe-commits mailing list