MyDeveloperDay updated this revision to Diff 459283. MyDeveloperDay marked 7 inline comments as done.
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133589/new/ https://reviews.llvm.org/D133589 Files: clang/.clang-format clang/docs/ClangFormatStyleOptions.rst clang/include/clang/Format/Format.h clang/lib/Format/Format.cpp clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTestJson.cpp
Index: clang/unittests/Format/FormatTestJson.cpp =================================================================== --- clang/unittests/Format/FormatTestJson.cpp +++ clang/unittests/Format/FormatTestJson.cpp @@ -159,6 +159,27 @@ "]"); } +TEST_F(FormatTestJson, JsonArrayOneLine) { + FormatStyle Style = getLLVMStyle(FormatStyle::LK_Json); + Style.BreakArrays = false; + Style.SpacesInContainerLiterals = false; + verifyFormat("[]", Style); + verifyFormat("[1]", Style); + verifyFormat("[1, 2]", Style); + verifyFormat("[1, 2, 3]", Style); + verifyFormat("[1, 2, 3, 4]", Style); + verifyFormat("[1, 2, 3, 4, 5]", Style); + + verifyFormat("[\n" + " 1,\n" + " 2,\n" + " {\n" + " A: 1\n" + " }\n" + "]", + Style); +} + TEST_F(FormatTestJson, JsonNoStringSplit) { FormatStyle Style = getLLVMStyle(FormatStyle::LK_Json); Style.IndentWidth = 4; Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -4399,18 +4399,22 @@ // } if (Left.is(TT_DictLiteral) && Left.is(tok::l_brace)) return true; - // Always break after a JSON array opener. - // [ - // ] + // Always break after a JSON array opener based on BreakArrays if (Left.is(TT_ArrayInitializerLSquare) && Left.is(tok::l_square) && - !Right.is(tok::r_square)) { - return true; + Right.isNot(tok::r_square) || + Left.is(tok::comma)) { + if (Right.is(tok::l_brace)) + return true; + // scan to the right if an we see an object or an array inside + // then break + for (const auto *Tok = &Right; Tok; Tok = Tok->Next) { + if (Tok->isOneOf(tok::l_brace, tok::l_square)) + return true; + if (Tok->isOneOf(tok::r_brace, tok::r_square)) + break; + } + return Style.BreakArrays; } - // Always break after successive entries. - // 1, - // 2 - if (Left.is(tok::comma)) - return true; } // If the last token before a '}', ']', or ')' is a comma or a trailing Index: clang/lib/Format/Format.cpp =================================================================== --- clang/lib/Format/Format.cpp +++ clang/lib/Format/Format.cpp @@ -756,6 +756,8 @@ IO.mapOptional("ExperimentalAutoDetectBinPacking", Style.ExperimentalAutoDetectBinPacking); + IO.mapOptional("BreakArrays", Style.BreakArrays); + IO.mapOptional("PackConstructorInitializers", Style.PackConstructorInitializers); // For backward compatibility: @@ -1249,6 +1251,7 @@ LLVMStyle.EmptyLineAfterAccessModifier = FormatStyle::ELAAMS_Never; LLVMStyle.EmptyLineBeforeAccessModifier = FormatStyle::ELBAMS_LogicalBlock; LLVMStyle.ExperimentalAutoDetectBinPacking = false; + LLVMStyle.BreakArrays = true; LLVMStyle.PackConstructorInitializers = FormatStyle::PCIS_BinPack; LLVMStyle.FixNamespaceComments = true; LLVMStyle.ForEachMacros.push_back("foreach"); Index: clang/include/clang/Format/Format.h =================================================================== --- clang/include/clang/Format/Format.h +++ clang/include/clang/Format/Format.h @@ -2058,6 +2058,23 @@ /// \version 12 EmptyLineBeforeAccessModifierStyle EmptyLineBeforeAccessModifier; + /// If ``true``, clang-format will always break after a Json array `[` + /// otherwise it will scan until the closing `]` to determine if it should add + /// newlines between elements (prettier compatible) + /// + /// NOTE: This is currently only for formatting JSON + /// \code + /// true: false: + /// [ vs. [1, 2, 3, 4] + /// 1, + /// 2, + /// 3, + /// 4 + /// ] + /// \endcode + /// \version 16 + bool BreakArrays; + /// If ``true``, clang-format detects whether function calls and /// definitions are formatted with one parameter per line. /// @@ -3897,6 +3914,7 @@ DisableFormat == R.DisableFormat && EmptyLineAfterAccessModifier == R.EmptyLineAfterAccessModifier && EmptyLineBeforeAccessModifier == R.EmptyLineBeforeAccessModifier && + BreakArrays == R.BreakArrays && ExperimentalAutoDetectBinPacking == R.ExperimentalAutoDetectBinPacking && PackConstructorInitializers == R.PackConstructorInitializers && Index: clang/docs/ClangFormatStyleOptions.rst =================================================================== --- clang/docs/ClangFormatStyleOptions.rst +++ clang/docs/ClangFormatStyleOptions.rst @@ -1698,6 +1698,23 @@ @Mock DataLoad loader; +**BreakArrays** (``Boolean``) :versionbadge:`clang-format 16` + If ``true``, clang-format will always break after a Json array `[` + otherwise it will scan until the closing `]` to determine if it should add + newlines between elements (prettier compatible) + + NOTE: This is currently only for formatting JSON + + .. code-block:: c++ + + true: false: + [ vs. [1, 2, 3, 4] + 1, + 2, + 3, + 4 + ] + **BreakBeforeBinaryOperators** (``BinaryOperatorStyle``) :versionbadge:`clang-format 3.6` The way to wrap binary operators. Index: clang/.clang-format =================================================================== --- clang/.clang-format +++ clang/.clang-format @@ -1 +1,2 @@ BasedOnStyle: LLVM +RemoveBracesLLVM: true
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits