Index: docs/ClangFormatStyleOptions.rst =================================================================== --- docs/ClangFormatStyleOptions.rst +++ docs/ClangFormatStyleOptions.rst @@ -611,6 +611,9 @@ This does not affect trailing block comments (``/**/`` - comments) as those commonly have different usage patterns and a number of special cases. +**SpacesBetweenFunctionParameters** (``bool``) + If ``true``, a space will be inserted between several function parameters. + **SpacesInAngles** (``bool``) If ``true``, spaces will be inserted after '<' and before '>' in template argument lists Index: include/clang/Format/Format.h =================================================================== --- include/clang/Format/Format.h +++ include/clang/Format/Format.h @@ -539,6 +539,9 @@ /// commonly have different usage patterns and a number of special cases. unsigned SpacesBeforeTrailingComments; + /// \b If \c true, spaces will be inserted between function parameters. + bool SpacesBetweenFunctionParameters; + /// \brief If \c true, spaces will be inserted after '<' and before '>' in /// template argument lists bool SpacesInAngles; @@ -657,6 +660,8 @@ SpaceBeforeParens == R.SpaceBeforeParens && SpaceInEmptyParentheses == R.SpaceInEmptyParentheses && SpacesBeforeTrailingComments == R.SpacesBeforeTrailingComments && + SpacesBetweenFunctionParameters == + R.SpacesBetweenFunctionParameters && SpacesInAngles == R.SpacesInAngles && SpacesInContainerLiterals == R.SpacesInContainerLiterals && SpacesInCStyleCastParentheses == R.SpacesInCStyleCastParentheses && Index: lib/Format/Format.cpp =================================================================== --- lib/Format/Format.cpp +++ lib/Format/Format.cpp @@ -322,6 +322,8 @@ IO.mapOptional("SpaceInEmptyParentheses", Style.SpaceInEmptyParentheses); IO.mapOptional("SpacesBeforeTrailingComments", Style.SpacesBeforeTrailingComments); + IO.mapOptional("SpacesBetweenFunctionParameters", + Style.SpacesBetweenFunctionParameters); IO.mapOptional("SpacesInAngles", Style.SpacesInAngles); IO.mapOptional("SpacesInContainerLiterals", Style.SpacesInContainerLiterals); @@ -516,6 +518,7 @@ LLVMStyle.ObjCSpaceBeforeProtocolList = true; LLVMStyle.PointerAlignment = FormatStyle::PAS_Right; LLVMStyle.SpacesBeforeTrailingComments = 1; + LLVMStyle.SpacesBetweenFunctionParameters = true; LLVMStyle.Standard = FormatStyle::LS_Cpp11; LLVMStyle.UseTab = FormatStyle::UT_Never; LLVMStyle.ReflowComments = true; @@ -561,6 +564,7 @@ GoogleStyle.ObjCSpaceBeforeProtocolList = false; GoogleStyle.PointerAlignment = FormatStyle::PAS_Left; GoogleStyle.SpacesBeforeTrailingComments = 2; + GoogleStyle.SpacesBetweenFunctionParameters = true; GoogleStyle.Standard = FormatStyle::LS_Auto; GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200; Index: lib/Format/TokenAnnotator.cpp =================================================================== --- lib/Format/TokenAnnotator.cpp +++ lib/Format/TokenAnnotator.cpp @@ -2074,7 +2074,7 @@ if (Right.is(TT_OverloadedOperatorLParen)) return Style.SpaceBeforeParens == FormatStyle::SBPO_Always; if (Left.is(tok::comma)) - return true; + return Style.SpacesBetweenFunctionParameters; if (Right.is(tok::comma)) return false; if (Right.isOneOf(TT_CtorInitializerColon, TT_ObjCBlockLParen)) Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -10954,6 +10954,19 @@ verifyFormat("A>();", Spaces); } +TEST_F(FormatTest, SpacesBetweenFunctionParameters) { + FormatStyle Spaces = getLLVMStyle(); + Spaces.SpacesBetweenFunctionParameters = false; + + verifyFormat("void foo(int a);", Spaces); + verifyFormat("void foo(int a,double b);", Spaces); + verifyFormat("void foo(int a,double b,char c);", Spaces); + + Spaces.SpacesBetweenFunctionParameters = true; + verifyFormat("void foo(int a, double b);", Spaces); + verifyFormat("void foo(int a, double b, char c);", Spaces); +} + TEST_F(FormatTest, TripleAngleBrackets) { verifyFormat("f<<<1, 1>>>();"); verifyFormat("f<<<1, 1, 1, s>>>();");