diff options
author | Daniel Jasper <djasper@google.com> | 2013-02-14 08:42:54 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-02-14 08:42:54 +0000 |
commit | eead02b1b51770872c50c7c6176210fdab4a78f9 (patch) | |
tree | c5c3368ec0403a9bf3071f06970932f8e2ccc9b0 | |
parent | 70247a807b3f6fa6f5996fd2184d6276c8e1d881 (diff) | |
download | bcm5719-llvm-eead02b1b51770872c50c7c6176210fdab4a78f9.tar.gz bcm5719-llvm-eead02b1b51770872c50c7c6176210fdab4a78f9.zip |
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 {
};
llvm-svn: 175147
-rw-r--r-- | clang/lib/Format/Format.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Format/TokenAnnotator.h | 1 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 22 |
4 files changed, 36 insertions, 2 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 8c2128eb018..1bd864e5c9d 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/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/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 4c365361040..22e67df1eca 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/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/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h index 506f271dc5d..5ce84af96a0 100644 --- a/clang/lib/Format/TokenAnnotator.h +++ b/clang/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/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index f72aad7aad6..b30e0deb56b 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/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) {}", |