[cfe-commits] r173688 - Let clang-format break after a function's return type.
Daniel Jasper
djasper at google.com
Mon Jan 28 07:16:31 PST 2013
Author: djasper
Date: Mon Jan 28 09:16:31 2013
New Revision: 173688
URL: http://llvm.org/viewvc/llvm-project?rev=173688&view=rev
Log:
Let clang-format break after a function's return type.
Before:
TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,
SourceLocation L, IdentifierInfo *II,
Type *T) {}
After:
TypeSpecDecl *
TypeSpecDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
IdentifierInfo *II, Type *T) {}
This fixes llvm.org/PR14717.
Modified:
cfe/trunk/lib/Format/Format.cpp
cfe/trunk/unittests/Format/FormatTest.cpp
Modified: cfe/trunk/lib/Format/Format.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=173688&r1=173687&r2=173688&view=diff
==============================================================================
--- cfe/trunk/lib/Format/Format.cpp (original)
+++ cfe/trunk/lib/Format/Format.cpp Mon Jan 28 09:16:31 2013
@@ -40,7 +40,6 @@ enum TokenType {
TT_CastRParen,
TT_ConditionalExpr,
TT_CtorInitializerColon,
- TT_RangeBasedForLoopColon,
TT_ImplicitStringLiteral,
TT_LineComment,
TT_ObjCBlockLParen,
@@ -51,6 +50,8 @@ enum TokenType {
TT_OverloadedOperator,
TT_PointerOrReference,
TT_PureVirtualSpecifier,
+ TT_RangeBasedForLoopColon,
+ TT_StartOfName,
TT_TemplateCloser,
TT_TemplateOpener,
TT_TrailingUnaryOperator,
@@ -566,7 +567,8 @@ private:
} else if (RootToken.is(tok::kw_for) && ParenLevel == 1 &&
Previous.is(tok::comma)) {
State.Column = State.ForLoopVariablePos;
- } else if (State.NextToken->Parent->ClosesTemplateDeclaration) {
+ } else if (State.NextToken->Parent->ClosesTemplateDeclaration ||
+ Current.Type == TT_StartOfName) {
State.Column = State.Stack[ParenLevel].Indent - 4;
} else if (Previous.Type == TT_BinaryOperator &&
State.Stack.back().AssignmentColumn != 0) {
@@ -895,7 +897,6 @@ public:
void markEnd(AnnotatedToken &Right) { Right.Type = TT_ObjCMethodExpr; }
};
-
bool parseAngle() {
if (CurrentToken == NULL)
return false;
@@ -1289,7 +1290,9 @@ public:
if (Line.Type == LT_Invalid)
return;
- determineTokenTypes(Line.First, /*IsExpression=*/ false);
+ bool LookForFunctionName = Line.MustBeDeclaration;
+ determineTokenTypes(Line.First, /*IsExpression=*/ false,
+ LookForFunctionName);
if (Line.First.Type == TT_ObjCMethodSpecifier)
Line.Type = LT_ObjCMethodDecl;
@@ -1308,7 +1311,8 @@ public:
}
private:
- void determineTokenTypes(AnnotatedToken &Current, bool IsExpression) {
+ void determineTokenTypes(AnnotatedToken &Current, bool IsExpression,
+ bool LookForFunctionName) {
if (getPrecedence(Current) == prec::Assignment) {
IsExpression = true;
AnnotatedToken *Previous = Current.Parent;
@@ -1326,7 +1330,10 @@ private:
IsExpression = true;
if (Current.Type == TT_Unknown) {
- if (Current.is(tok::star) || Current.is(tok::amp)) {
+ if (LookForFunctionName && Current.is(tok::l_paren)) {
+ findFunctionName(&Current);
+ LookForFunctionName = false;
+ } else if (Current.is(tok::star) || Current.is(tok::amp)) {
Current.Type = determineStarAmpUsage(Current, IsExpression);
} else if (Current.is(tok::minus) || Current.is(tok::plus) ||
Current.is(tok::caret)) {
@@ -1370,7 +1377,24 @@ private:
}
if (!Current.Children.empty())
- determineTokenTypes(Current.Children[0], IsExpression);
+ determineTokenTypes(Current.Children[0], IsExpression,
+ LookForFunctionName);
+ }
+
+ /// \brief Starting from \p Current, this searches backwards for an
+ /// identifier which could be the start of a function name and marks it.
+ void findFunctionName(AnnotatedToken *Current) {
+ AnnotatedToken *Parent = Current->Parent;
+ while (Parent != NULL && Parent->Parent != NULL) {
+ if (Parent->is(tok::identifier) &&
+ (Parent->Parent->is(tok::identifier) ||
+ Parent->Parent->Type == TT_PointerOrReference ||
+ Parent->Parent->Type == TT_TemplateCloser)) {
+ Parent->Type = TT_StartOfName;
+ break;
+ }
+ Parent = Parent->Parent;
+ }
}
/// \brief Returns the previous token ignoring comments.
@@ -1604,6 +1628,8 @@ private:
// Don't break at ':' if identifier before it can beak.
return false;
}
+ if (Right.Type == TT_StartOfName)
+ return true;
if (Right.is(tok::colon) && Right.Type == TT_ObjCMethodExpr)
return false;
if (Left.is(tok::colon) && Left.Type == TT_ObjCMethodExpr)
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=173688&r1=173687&r2=173688&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Mon Jan 28 09:16:31 2013
@@ -1504,13 +1504,13 @@ TEST_F(FormatTest, FormatsFunctionTypes)
verifyFormat("int(*func)(void *);");
}
-TEST_F(FormatTest, DoesNotBreakBeforePointerOrReference) {
- verifyFormat("int *someFunction(int LoooooooooooooooongParam1,\n"
- " int LoooooooooooooooongParam2) {\n}");
+TEST_F(FormatTest, BreaksFunctionDeclarations) {
+ verifyFormat("int *someFunction(int LoooooooooooooooooooongParam1,\n"
+ " int LoooooooooooooooooooongParam2) {\n}");
verifyFormat(
- "TypeSpecDecl *TypeSpecDecl::Create(ASTContext &C, DeclContext *DC,\n"
- " SourceLocation L, IdentifierIn *II,\n"
- " Type *T) {\n}");
+ "TypeSpecDecl *\n"
+ "TypeSpecDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,\n"
+ " IdentifierIn *II, Type *T) {\n}");
}
TEST_F(FormatTest, LineStartsWithSpecialCharacter) {
More information about the cfe-commits
mailing list