From: Daniel Jasper Date: Wed, 9 Jul 2014 08:42:42 +0000 (+0000) Subject: clang-format: Add new option to indent wrapped function declarations. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bdfb53808762019d0f56302ec24a033d4982f7ce;p=clang clang-format: Add new option to indent wrapped function declarations. Though not completely identical, make former IndentFunctionDeclarationAfterType change this flag for backwards compatibility (it is somewhat close in meaning and better the err'ing on an unknown config flag). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@212597 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/ClangFormatStyleOptions.rst b/docs/ClangFormatStyleOptions.rst index 5c3b173698..910192bd34 100644 --- a/docs/ClangFormatStyleOptions.rst +++ b/docs/ClangFormatStyleOptions.rst @@ -251,6 +251,10 @@ the configuration (without a prefix: ``Auto``). **IndentWidth** (``unsigned``) The number of columns to use for indentation. +**IndentWrappedFunctionNames** (``bool``) + Indent if a function definition or declaration is wrapped after the + type. + **KeepEmptyLinesAtTheStartOfBlocks** (``bool``) If true, empty lines at the start of blocks are kept. diff --git a/include/clang/Format/Format.h b/include/clang/Format/Format.h index 3cf2a08285..45cccaacd5 100644 --- a/include/clang/Format/Format.h +++ b/include/clang/Format/Format.h @@ -126,6 +126,10 @@ struct FormatStyle { /// Switch statement body is always indented one level more than case labels. bool IndentCaseLabels; + /// \brief Indent if a function definition or declaration is wrapped after the + /// type. + bool IndentWrappedFunctionNames; + /// \brief Different ways to indent namespace contents. enum NamespaceIndentationKind { /// Don't indent in namespaces. @@ -383,6 +387,7 @@ struct FormatStyle { ExperimentalAutoDetectBinPacking == R.ExperimentalAutoDetectBinPacking && IndentCaseLabels == R.IndentCaseLabels && + IndentWrappedFunctionNames == R.IndentWrappedFunctionNames && IndentWidth == R.IndentWidth && Language == R.Language && MaxEmptyLinesToKeep == R.MaxEmptyLinesToKeep && KeepEmptyLinesAtTheStartOfBlocks == diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 683bb69eac..2af16fcd0c 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -520,8 +520,9 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) { return State.Stack.back().VariablePos; if ((PreviousNonComment && (PreviousNonComment->ClosesTemplateDeclaration || PreviousNonComment->Type == TT_AttributeParen)) || - NextNonComment->is(tok::kw_operator) || - NextNonComment->Type == TT_FunctionDeclarationName) + (!Style.IndentWrappedFunctionNames && + (NextNonComment->is(tok::kw_operator) || + NextNonComment->Type == TT_FunctionDeclarationName))) return std::max(State.Stack.back().LastSpace, State.Stack.back().Indent); if (NextNonComment->Type == TT_SelectorName) { if (!State.Stack.back().ObjCSelectorNameFound) { diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index a65f2e2ba2..be9bbed9c4 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -191,6 +191,10 @@ template <> struct MappingTraits { IO.mapOptional("ExperimentalAutoDetectBinPacking", Style.ExperimentalAutoDetectBinPacking); IO.mapOptional("IndentCaseLabels", Style.IndentCaseLabels); + IO.mapOptional("IndentWrappedFunctionNames", + Style.IndentWrappedFunctionNames); + IO.mapOptional("IndentFunctionDeclarationAfterType", + Style.IndentWrappedFunctionNames); IO.mapOptional("MaxEmptyLinesToKeep", Style.MaxEmptyLinesToKeep); IO.mapOptional("KeepEmptyLinesAtTheStartOfBlocks", Style.KeepEmptyLinesAtTheStartOfBlocks); @@ -326,6 +330,7 @@ FormatStyle getLLVMStyle() { LLVMStyle.ForEachMacros.push_back("Q_FOREACH"); LLVMStyle.ForEachMacros.push_back("BOOST_FOREACH"); LLVMStyle.IndentCaseLabels = false; + LLVMStyle.IndentWrappedFunctionNames = false; LLVMStyle.IndentWidth = 2; LLVMStyle.TabWidth = 8; LLVMStyle.MaxEmptyLinesToKeep = 1; diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 7029b43f05..150497745b 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -5082,6 +5082,23 @@ TEST_F(FormatTest, BreaksLongDeclarations) { "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); + FormatStyle Indented = getLLVMStyle(); + Indented.IndentWrappedFunctionNames = true; + verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" + " LoooooooooooooooooooooooooooooooongFunctionDeclaration();", + Indented); + verifyFormat( + "LoooooooooooooooooooooooooooooooooooooooongReturnType\n" + " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", + Indented); + verifyFormat( + "LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" + " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", + Indented); + verifyFormat( + "decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" + " LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}", + Indented); // FIXME: Without the comment, this breaks after "(". verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType // break\n" @@ -8103,6 +8120,7 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); CHECK_PARSE_BOOL(DerivePointerAlignment); CHECK_PARSE_BOOL(IndentCaseLabels); + CHECK_PARSE_BOOL(IndentWrappedFunctionNames); CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); CHECK_PARSE_BOOL(ObjCSpaceAfterProperty); CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);