Fix formatting of long declarations with const type.

Before (exceeding the column limit):
LoooooooooooooooooooooooooooooooooooooooongType const LoooooooooooooooooooooooooooooooooooooooongVariable;

After:
LoooooooooooooooooooooooooooooooooooooooongType const
LoooooooooooooooooooooooooooooooooooooooongVariable;

llvm-svn: 185418
This commit is contained in:
Daniel Jasper 2013-07-02 09:47:29 +00:00
parent 868bebf844
commit dba1c5587c
2 changed files with 33 additions and 7 deletions

View File

@ -585,13 +585,7 @@ private:
}
if (Current.Type == TT_Unknown) {
if (Current.Previous && Current.is(tok::identifier) &&
((Current.Previous->is(tok::identifier) &&
Current.Previous->Tok.getIdentifierInfo()->getPPKeywordID() ==
tok::pp_not_keyword) ||
isSimpleTypeSpecifier(*Current.Previous) ||
Current.Previous->Type == TT_PointerOrReference ||
Current.Previous->Type == TT_TemplateCloser)) {
if (isStartOfName(Current)) {
Contexts.back().FirstStartOfName = &Current;
Current.Type = TT_StartOfName;
NameFound = true;
@ -666,6 +660,33 @@ private:
}
}
/// \brief Take a guess at whether \p Tok starts a name of a function or
/// variable declaration.
///
/// This is a heuristic based on whether \p Tok is an identifier following
/// something that is likely a type.
bool isStartOfName(const FormatToken &Tok) {
if (Tok.isNot(tok::identifier) || Tok.Previous == NULL)
return false;
// Skip "const" as it does not have an influence on whether this is a name.
FormatToken *PreviousNotConst = Tok.Previous;
while (PreviousNotConst != NULL && PreviousNotConst->is(tok::kw_const))
PreviousNotConst = PreviousNotConst->Previous;
if (PreviousNotConst == NULL)
return false;
bool IsPPKeyword =
PreviousNotConst->is(tok::identifier) && PreviousNotConst->Previous &&
PreviousNotConst->Previous->is(tok::hash);
return (!IsPPKeyword && PreviousNotConst->is(tok::identifier)) ||
PreviousNotConst->Type == TT_PointerOrReference ||
PreviousNotConst->Type == TT_TemplateCloser ||
isSimpleTypeSpecifier(*PreviousNotConst);
}
/// \brief Return the type of the given token assuming it is * or &.
TokenType determineStarAmpUsage(const FormatToken &Tok, bool IsExpression) {
const FormatToken *PrevToken = Tok.getPreviousNoneComment();

View File

@ -3451,11 +3451,16 @@ TEST_F(FormatTest, BreaksLongDeclarations) {
verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
" LoooooooooooooooooooooooooooooooooooooooongVariable;",
getGoogleStyle());
verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
" LoooooooooooooooooooooooooooooooooooooooongVariable;",
getGoogleStyle());
verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
" LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
getGoogleStyle());
verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
"LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
"LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
// FIXME: Without the comment, this breaks after "(".
verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n"