aboutsummaryrefslogtreecommitdiff
path: root/lib/Format/UnwrappedLineParser.cpp
diff options
context:
space:
mode:
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() {