From: Daniel Jasper Date: Thu, 14 Feb 2013 08:42:54 +0000 (+0000) Subject: Align superclasses for multiple inheritence. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6cabab48dacc1317821f8f078ed2d4c603b67aff;p=clang Align superclasses for multiple inheritence. This fixes llvm.org/PR15179. Before: class ColorChooserMac : public content::ColorChooser, public content::WebContentsObserver { }; After: class ColorChooserMac : public content::ColorChooser, public content::WebContentsObserver { }; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@175147 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 8c2128eb01..1bd864e5c9 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -524,6 +524,8 @@ private: Previous.Type == TT_CtorInitializerColon) && getPrecedence(Previous) != prec::Assignment) State.Stack.back().LastSpace = State.Column; + else if (Previous.Type == TT_InheritanceColon) + State.Stack.back().Indent = State.Column; else if (Previous.ParameterCount > 1 && (Previous.is(tok::l_paren) || Previous.is(tok::l_square) || Previous.is(tok::l_brace) || @@ -564,6 +566,8 @@ private: const AnnotatedToken &Current = *State.NextToken; assert(State.Stack.size()); + if (Current.Type == TT_InheritanceColon) + State.Stack.back().AvoidBinPacking = true; if (Current.is(tok::lessless) && State.Stack.back().FirstLessLess == 0) State.Stack.back().FirstLessLess = State.Column; if (Current.is(tok::question)) diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 4c36536104..22e67df1ec 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -323,6 +323,8 @@ private: Contexts.back().FirstObjCSelectorName = Tok->Parent; } else if (Contexts.back().ColonIsForRangeExpr) { Tok->Type = TT_RangeBasedForLoopColon; + } else if (Contexts.size() == 1) { + Tok->Type = TT_InheritanceColon; } break; case tok::kw_if: @@ -856,7 +858,8 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, if (Left.is(tok::coloncolon)) return 500; - if (Left.Type == TT_RangeBasedForLoopColon) + if (Left.Type == TT_RangeBasedForLoopColon || + Left.Type == TT_InheritanceColon) return 5; if (Right.is(tok::arrow) || Right.is(tok::period)) { @@ -1040,7 +1043,11 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, return true; if (Right.Type == TT_ConditionalExpr || Right.is(tok::question)) return true; - if (Left.Type == TT_RangeBasedForLoopColon) + if (Right.Type == TT_RangeBasedForLoopColon || + Right.Type == TT_InheritanceColon) + return false; + if (Left.Type == TT_RangeBasedForLoopColon || + Left.Type == TT_InheritanceColon) return true; if (Left.Type == TT_PointerOrReference || Left.Type == TT_TemplateCloser || Left.Type == TT_UnaryOperator || Left.Type == TT_ConditionalExpr || diff --git a/lib/Format/TokenAnnotator.h b/lib/Format/TokenAnnotator.h index 506f271dc5..5ce84af96a 100644 --- a/lib/Format/TokenAnnotator.h +++ b/lib/Format/TokenAnnotator.h @@ -34,6 +34,7 @@ enum TokenType { TT_ConditionalExpr, TT_CtorInitializerColon, TT_ImplicitStringLiteral, + TT_InheritanceColon, TT_LineComment, TT_ObjCArrayLiteral, TT_ObjCBlockLParen, diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index f72aad7aad..b30e0deb56 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -584,6 +584,25 @@ TEST_F(FormatTest, UnderstandsAccessSpecifiers) { TEST_F(FormatTest, FormatsDerivedClass) { verifyFormat("class A : public B {\n};"); verifyFormat("class A : public ::B {\n};"); + + verifyFormat( + "class AAAAAAAAAAAAAAAAAAAA : public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" + " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {\n" + "};\n"); + verifyFormat("class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA :\n" + " public BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,\n" + " public CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC {\n" + "};\n"); + verifyFormat( + "class A : public B, public C, public D, public E, public F, public G {\n" + "};"); + verifyFormat("class AAAAAAAAAAAA : public B,\n" + " public C,\n" + " public D,\n" + " public E,\n" + " public F,\n" + " public G {\n" + "};"); } TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { @@ -1018,6 +1037,9 @@ TEST_F(FormatTest, PreventConfusingIndents) { " ddd);"); } +TEST_F(FormatTest, Inheritance) { +} + TEST_F(FormatTest, ConstructorInitializers) { verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}",