aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Format/UnwrappedLineParser.cpp29
-rw-r--r--lib/Format/UnwrappedLineParser.h1
-rw-r--r--test/Index/comment-cplus-decls.cpp2
-rw-r--r--test/Index/comment-to-html-xml-conversion.cpp2
-rw-r--r--unittests/Format/FormatTest.cpp21
5 files changed, 42 insertions, 13 deletions
diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp
index 00ca3a5334..d7220259b7 100644
--- a/lib/Format/UnwrappedLineParser.cpp
+++ b/lib/Format/UnwrappedLineParser.cpp
@@ -129,13 +129,10 @@ bool UnwrappedLineParser::parseBlock(unsigned AddLevels) {
parseLevel(/*HasOpeningBrace=*/true);
Line.Level -= AddLevels;
- // FIXME: Add error handling.
if (!FormatTok.Tok.is(tok::r_brace))
return true;
- nextToken();
- if (FormatTok.Tok.is(tok::semi))
- nextToken();
+ nextToken(); // Munch the closing brace.
return false;
}
@@ -246,6 +243,10 @@ void UnwrappedLineParser::parseStructuralElement() {
case tok::kw_enum:
parseEnum();
return;
+ case tok::kw_struct: // fallthrough
+ case tok::kw_class:
+ parseStructOrClass();
+ return;
case tok::semi:
nextToken();
addUnwrappedLine();
@@ -459,6 +460,26 @@ void UnwrappedLineParser::parseEnum() {
} while (!eof());
}
+void UnwrappedLineParser::parseStructOrClass() {
+ nextToken();
+ do {
+ switch (FormatTok.Tok.getKind()) {
+ case tok::l_brace:
+ // FIXME: Think about how to resolve the error handling here.
+ parseBlock();
+ parseStructuralElement();
+ return;
+ case tok::semi:
+ nextToken();
+ addUnwrappedLine();
+ return;
+ default:
+ nextToken();
+ break;
+ }
+ } while (!eof());
+}
+
void UnwrappedLineParser::addUnwrappedLine() {
// Consume trailing comments.
while (!eof() && FormatTok.NewlinesBefore == 0 &&
diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h
index 27c1102055..a9f0475e32 100644
--- a/lib/Format/UnwrappedLineParser.h
+++ b/lib/Format/UnwrappedLineParser.h
@@ -128,6 +128,7 @@ private:
void parseNamespace();
void parseAccessSpecifier();
void parseEnum();
+ void parseStructOrClass();
void addUnwrappedLine();
bool eof() const;
void nextToken();
diff --git a/test/Index/comment-cplus-decls.cpp b/test/Index/comment-cplus-decls.cpp
index 29af712e1c..ed851d84fc 100644
--- a/test/Index/comment-cplus-decls.cpp
+++ b/test/Index/comment-cplus-decls.cpp
@@ -162,7 +162,7 @@ private:
*/
template <class T> friend class valarray;
};
-// CHECK: <Declaration>template &lt;class T = unsigned int&gt; class valarray {\n}\ntemplate &lt;class T&gt; class valarray</Declaration>
+// CHECK: <Declaration>template &lt;class T = unsigned int&gt; class valarray {\n} template &lt;class T&gt; class valarray</Declaration>
// CHECK: <Declaration>friend template &lt;class T&gt; class valarray</Declaration>
class gslice
diff --git a/test/Index/comment-to-html-xml-conversion.cpp b/test/Index/comment-to-html-xml-conversion.cpp
index 1ab49d6fc0..139120ec05 100644
--- a/test/Index/comment-to-html-xml-conversion.cpp
+++ b/test/Index/comment-to-html-xml-conversion.cpp
@@ -670,7 +670,7 @@ void comment_to_xml_conversion_10(int aaa, int bbb);
template<typename T, typename U>
class comment_to_xml_conversion_11 { };
-// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:7: ClassTemplate=comment_to_xml_conversion_11:{{.*}} FullCommentAsXML=[<Class templateKind="template" file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="7"><Name>comment_to_xml_conversion_11</Name><USR>c:@CT&gt;2#T#T@comment_to_xml_conversion_11</USR><Declaration>template &lt;typename T = int, typename U = int&gt;\nclass comment_to_xml_conversion_11 {\n}\ntemplate &lt;typename T, typename U&gt; class comment_to_xml_conversion_11 {\n}</Declaration><Abstract><Para> Aaa.</Para></Abstract></Class>]
+// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:7: ClassTemplate=comment_to_xml_conversion_11:{{.*}} FullCommentAsXML=[<Class templateKind="template" file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="7"><Name>comment_to_xml_conversion_11</Name><USR>c:@CT&gt;2#T#T@comment_to_xml_conversion_11</USR><Declaration>template &lt;typename T = int, typename U = int&gt;\nclass comment_to_xml_conversion_11 {\n} template &lt;typename T, typename U&gt; class comment_to_xml_conversion_11 {\n}</Declaration><Abstract><Para> Aaa.</Para></Abstract></Class>]
/// Aaa.
template<typename T>
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index d4490dddfc..2ba4765cc7 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -332,6 +332,13 @@ TEST_F(FormatTest, FormatsDerivedClass) {
"};");
}
+TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) {
+ verifyFormat("class A {\n"
+ "} a, b;");
+ verifyFormat("struct A {\n"
+ "} a, b;");
+}
+
TEST_F(FormatTest, FormatsEnum) {
verifyFormat("enum {\n"
" Zero,\n"
@@ -624,7 +631,7 @@ TEST_F(FormatTest, BreaksAsHighAsPossible) {
TEST_F(FormatTest, BreaksDesireably) {
verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
" aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
- " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n};");
+ " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n}");
verifyFormat(
"aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
@@ -974,14 +981,14 @@ TEST_F(FormatTest, IncorrectAccessSpecifier) {
"int qwerty;");
verifyFormat("public\n"
"B {\n"
- "};");
+ "}");
verifyFormat("public\n"
"{\n"
- "};");
+ "}");
verifyFormat("public\n"
"B {\n"
" int x;\n"
- "};");
+ "}");
}
TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
@@ -990,16 +997,16 @@ TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) {
TEST_F(FormatTest, IncorrectCodeDoNoWhile) {
verifyFormat("do {\n"
- "};");
+ "}");
verifyFormat("do {\n"
- "};\n"
+ "}\n"
"f();");
verifyFormat("do {\n"
"}\n"
"wheeee(fun);");
verifyFormat("do {\n"
" f();\n"
- "};");
+ "}");
}
TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {