From: Daniel Jasper Date: Wed, 30 Oct 2013 13:54:53 +0000 (+0000) Subject: clang-format: Fix whitespaces in include directives. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8437957c9da906c24d4e385869c05d8e601c664d;p=clang clang-format: Fix whitespaces in include directives. Before (clang-format wouldn't change): #include "a.h" #include After: #include "a.h" #include This fixes llvm.org/PR16151. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193683 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 68b440dbe3..c1f448be56 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -202,7 +202,11 @@ unsigned ContinuationIndenter::addTokenToState(LineState &State, bool Newline, unsigned ExtraSpaces) { const FormatToken &Current = *State.NextToken; - if (State.Stack.size() == 0 || Current.Type == TT_ImplicitStringLiteral) { + if (State.Stack.size() == 0 || + (Current.Type == TT_ImplicitStringLiteral && + (Current.Previous->Tok.getIdentifierInfo() == NULL || + Current.Previous->Tok.getIdentifierInfo()->getPPKeywordID() == + tok::pp_not_keyword))) { // FIXME: Is this correct? int WhitespaceLength = SourceMgr.getSpellingColumnNumber( State.NextToken->WhitespaceRange.getEnd()) - @@ -700,6 +704,10 @@ unsigned ContinuationIndenter::breakProtrudingToken(const FormatToken &Current, if (Current.Type != TT_BlockComment && Current.IsMultiline) return addMultilineToken(Current, State); + // Don't break implicit string literals. + if (Current.Type == TT_ImplicitStringLiteral) + return 0; + if (!Current.isOneOf(tok::string_literal, tok::wide_string_literal, tok::utf8_string_literal, tok::utf16_string_literal, tok::utf32_string_literal, tok::comment)) diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 799e4c11a5..ac45859a5a 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -1450,7 +1450,8 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, Left.Previous->Type == TT_CastRParen)) return false; } - + if (Right.Type == TT_ImplicitStringLiteral) + return false; if (Right.isTrailingComment()) // We rely on MustBreakBefore being set correctly here as we should not // change the "binding" behavior of a comment. diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 2f6e06ff02..639b8c89d9 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -668,8 +668,7 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) { "#include \"a/b/c\" // comment"); verifyFormat("#include // comment\n" "#include // comment"); - EXPECT_EQ("#include \\\n" - " \"a\" // comment\n" + EXPECT_EQ("#include \"a\" // comment\n" "#include \"a/b/c\" // comment", format("#include \\\n" " \"a\" // comment\n" @@ -4295,6 +4294,8 @@ TEST_F(FormatTest, HandlesIncludeDirectives) { "#include \"some long include\" // with a comment\n" "#include \"some very long include paaaaaaaaaaaaaaaaaaaaaaath\"", getLLVMStyleWithColumns(35)); + EXPECT_EQ("#include \"a.h\"", format("#include \"a.h\"")); + EXPECT_EQ("#include ", format("#include")); verifyFormat("#import "); verifyFormat("#import ");