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;
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;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits