aboutsummaryrefslogtreecommitdiff
path: root/lib/Format/UnwrappedLineParser.cpp
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2013-01-15 13:38:33 +0000
committerManuel Klimek <klimek@google.com>2013-01-15 13:38:33 +0000
commit47ea7f64108163491ed74dc746c8d94e10764704 (patch)
tree05f27390078e2a130eac01dcb3c0d58bb97ba0ad /lib/Format/UnwrappedLineParser.cpp
parent51ccafd66682ecbccc0a63364291dc7a8f6ec0f0 (diff)
Fixes various bugs around the keywords class, struct and union.
This switches to parsing record definitions only if we can clearly identify them. We're specifically allowing common patterns for visibility control through macros and attributes, but we cannot currently fix all instances. This fixes all known bugs we have though. Before: static class A f() { return g(); } int x; After: static class A f() { return g(); } int x; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172530 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Format/UnwrappedLineParser.cpp')
-rw-r--r--lib/Format/UnwrappedLineParser.cpp45
1 files changed, 23 insertions, 22 deletions
diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp
index b3671b3040..fe522ac9d8 100644
--- a/lib/Format/UnwrappedLineParser.cpp
+++ b/lib/Format/UnwrappedLineParser.cpp
@@ -320,8 +320,10 @@ void UnwrappedLineParser::parseStructuralElement() {
case tok::kw_struct: // fallthrough
case tok::kw_union: // fallthrough
case tok::kw_class:
- parseStructClassOrBracedList();
- return;
+ parseRecord();
+ // A record declaration or definition is always the start of a structural
+ // element.
+ break;
case tok::semi:
nextToken();
addUnwrappedLine();
@@ -569,30 +571,29 @@ void UnwrappedLineParser::parseEnum() {
} while (!eof());
}
-void UnwrappedLineParser::parseStructClassOrBracedList() {
+void UnwrappedLineParser::parseRecord() {
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;
- case tok::equal:
+ if (FormatTok.Tok.is(tok::identifier) ||
+ FormatTok.Tok.is(tok::kw___attribute) ||
+ FormatTok.Tok.is(tok::kw___declspec)) {
+ nextToken();
+ // We can have macros or attributes in between 'class' and the class name.
+ if (FormatTok.Tok.is(tok::l_paren)) {
+ parseParens();
+ }
+ if (FormatTok.Tok.is(tok::identifier))
nextToken();
- if (FormatTok.Tok.is(tok::l_brace)) {
- parseBracedList();
+
+ if (FormatTok.Tok.is(tok::colon)) {
+ while (FormatTok.Tok.isNot(tok::l_brace)) {
+ if (FormatTok.Tok.is(tok::semi))
+ return;
+ nextToken();
}
- break;
- default:
- nextToken();
- break;
}
- } while (!eof());
+ }
+ if (FormatTok.Tok.is(tok::l_brace))
+ parseBlock();
}
void UnwrappedLineParser::parseObjCProtocolList() {