[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