25#include "llvm/ADT/Sequence.h"
27#define DEBUG_TYPE "format-formatter"
31LLVM_YAML_IS_SEQUENCE_VECTOR(FormatStyle::RawStringFormat)
36struct ScalarEnumerationTraits<
FormatStyle::BreakBeforeNoexceptSpecifierStyle> {
39 IO.enumCase(
Value,
"Never", FormatStyle::BBNSS_Never);
40 IO.enumCase(
Value,
"OnlyWithParen", FormatStyle::BBNSS_OnlyWithParen);
41 IO.enumCase(
Value,
"Always", FormatStyle::BBNSS_Always);
45template <>
struct MappingTraits<
FormatStyle::AlignConsecutiveStyle> {
47 IO.enumCase(
Value,
"None", FormatStyle::AlignConsecutiveStyle({}));
48 IO.enumCase(
Value,
"Consecutive",
49 FormatStyle::AlignConsecutiveStyle(
54 IO.enumCase(
Value,
"AcrossEmptyLines",
55 FormatStyle::AlignConsecutiveStyle(
60 IO.enumCase(
Value,
"AcrossComments",
61 FormatStyle::AlignConsecutiveStyle(
66 IO.enumCase(
Value,
"AcrossEmptyLinesAndComments",
67 FormatStyle::AlignConsecutiveStyle(
74 IO.enumCase(
Value,
"true",
75 FormatStyle::AlignConsecutiveStyle(
80 IO.enumCase(
Value,
"false", FormatStyle::AlignConsecutiveStyle({}));
83 static void mapping(IO &IO, FormatStyle::AlignConsecutiveStyle &
Value) {
84 IO.mapOptional(
"Enabled",
Value.Enabled);
85 IO.mapOptional(
"AcrossEmptyLines",
Value.AcrossEmptyLines);
86 IO.mapOptional(
"AcrossComments",
Value.AcrossComments);
87 IO.mapOptional(
"AlignCompound",
Value.AlignCompound);
88 IO.mapOptional(
"AlignFunctionDeclarations",
89 Value.AlignFunctionDeclarations);
90 IO.mapOptional(
"AlignFunctionPointers",
Value.AlignFunctionPointers);
91 IO.mapOptional(
"PadOperators",
Value.PadOperators);
96struct MappingTraits<
FormatStyle::ShortCaseStatementsAlignmentStyle> {
98 FormatStyle::ShortCaseStatementsAlignmentStyle &
Value) {
99 IO.mapOptional(
"Enabled",
Value.Enabled);
100 IO.mapOptional(
"AcrossEmptyLines",
Value.AcrossEmptyLines);
101 IO.mapOptional(
"AcrossComments",
Value.AcrossComments);
102 IO.mapOptional(
"AlignCaseArrows",
Value.AlignCaseArrows);
103 IO.mapOptional(
"AlignCaseColons",
Value.AlignCaseColons);
108struct ScalarEnumerationTraits<
FormatStyle::AttributeBreakingStyle> {
110 IO.enumCase(
Value,
"Always", FormatStyle::ABS_Always);
111 IO.enumCase(
Value,
"Leave", FormatStyle::ABS_Leave);
112 IO.enumCase(
Value,
"Never", FormatStyle::ABS_Never);
117struct ScalarEnumerationTraits<
FormatStyle::ArrayInitializerAlignmentStyle> {
119 FormatStyle::ArrayInitializerAlignmentStyle &
Value) {
120 IO.enumCase(
Value,
"None", FormatStyle::AIAS_None);
121 IO.enumCase(
Value,
"Left", FormatStyle::AIAS_Left);
122 IO.enumCase(
Value,
"Right", FormatStyle::AIAS_Right);
126template <>
struct ScalarEnumerationTraits<
FormatStyle::BinaryOperatorStyle> {
128 IO.enumCase(
Value,
"All", FormatStyle::BOS_All);
129 IO.enumCase(
Value,
"true", FormatStyle::BOS_All);
130 IO.enumCase(
Value,
"None", FormatStyle::BOS_None);
131 IO.enumCase(
Value,
"false", FormatStyle::BOS_None);
132 IO.enumCase(
Value,
"NonAssignment", FormatStyle::BOS_NonAssignment);
137struct ScalarEnumerationTraits<
FormatStyle::BinPackParametersStyle> {
139 IO.enumCase(
Value,
"BinPack", FormatStyle::BPPS_BinPack);
140 IO.enumCase(
Value,
"OnePerLine", FormatStyle::BPPS_OnePerLine);
141 IO.enumCase(
Value,
"AlwaysOnePerLine", FormatStyle::BPPS_AlwaysOnePerLine);
144 IO.enumCase(
Value,
"true", FormatStyle::BPPS_BinPack);
145 IO.enumCase(
Value,
"false", FormatStyle::BPPS_OnePerLine);
149template <>
struct ScalarEnumerationTraits<
FormatStyle::BinPackStyle> {
151 IO.enumCase(
Value,
"Auto", FormatStyle::BPS_Auto);
152 IO.enumCase(
Value,
"Always", FormatStyle::BPS_Always);
153 IO.enumCase(
Value,
"Never", FormatStyle::BPS_Never);
158struct ScalarEnumerationTraits<
FormatStyle::BitFieldColonSpacingStyle> {
160 FormatStyle::BitFieldColonSpacingStyle &
Value) {
161 IO.enumCase(
Value,
"Both", FormatStyle::BFCS_Both);
162 IO.enumCase(
Value,
"None", FormatStyle::BFCS_None);
163 IO.enumCase(
Value,
"Before", FormatStyle::BFCS_Before);
164 IO.enumCase(
Value,
"After", FormatStyle::BFCS_After);
168template <>
struct ScalarEnumerationTraits<
FormatStyle::BraceBreakingStyle> {
170 IO.enumCase(
Value,
"Attach", FormatStyle::BS_Attach);
171 IO.enumCase(
Value,
"Linux", FormatStyle::BS_Linux);
172 IO.enumCase(
Value,
"Mozilla", FormatStyle::BS_Mozilla);
173 IO.enumCase(
Value,
"Stroustrup", FormatStyle::BS_Stroustrup);
174 IO.enumCase(
Value,
"Allman", FormatStyle::BS_Allman);
175 IO.enumCase(
Value,
"Whitesmiths", FormatStyle::BS_Whitesmiths);
176 IO.enumCase(
Value,
"GNU", FormatStyle::BS_GNU);
177 IO.enumCase(
Value,
"WebKit", FormatStyle::BS_WebKit);
178 IO.enumCase(
Value,
"Custom", FormatStyle::BS_Custom);
182template <>
struct MappingTraits<
FormatStyle::BraceWrappingFlags> {
183 static void mapping(IO &IO, FormatStyle::BraceWrappingFlags &Wrapping) {
184 IO.mapOptional(
"AfterCaseLabel", Wrapping.AfterCaseLabel);
185 IO.mapOptional(
"AfterClass", Wrapping.AfterClass);
186 IO.mapOptional(
"AfterControlStatement", Wrapping.AfterControlStatement);
187 IO.mapOptional(
"AfterEnum", Wrapping.AfterEnum);
188 IO.mapOptional(
"AfterExternBlock", Wrapping.AfterExternBlock);
189 IO.mapOptional(
"AfterFunction", Wrapping.AfterFunction);
190 IO.mapOptional(
"AfterNamespace", Wrapping.AfterNamespace);
191 IO.mapOptional(
"AfterObjCDeclaration", Wrapping.AfterObjCDeclaration);
192 IO.mapOptional(
"AfterStruct", Wrapping.AfterStruct);
193 IO.mapOptional(
"AfterUnion", Wrapping.AfterUnion);
194 IO.mapOptional(
"BeforeCatch", Wrapping.BeforeCatch);
195 IO.mapOptional(
"BeforeElse", Wrapping.BeforeElse);
196 IO.mapOptional(
"BeforeLambdaBody", Wrapping.BeforeLambdaBody);
197 IO.mapOptional(
"BeforeWhile", Wrapping.BeforeWhile);
198 IO.mapOptional(
"IndentBraces", Wrapping.IndentBraces);
199 IO.mapOptional(
"SplitEmptyFunction", Wrapping.SplitEmptyFunction);
200 IO.mapOptional(
"SplitEmptyRecord", Wrapping.SplitEmptyRecord);
201 IO.mapOptional(
"SplitEmptyNamespace", Wrapping.SplitEmptyNamespace);
205template <>
struct ScalarEnumerationTraits<
FormatStyle::BracketAlignmentStyle> {
207 IO.enumCase(
Value,
"Align", FormatStyle::BAS_Align);
208 IO.enumCase(
Value,
"DontAlign", FormatStyle::BAS_DontAlign);
209 IO.enumCase(
Value,
"AlwaysBreak", FormatStyle::BAS_AlwaysBreak);
210 IO.enumCase(
Value,
"BlockIndent", FormatStyle::BAS_BlockIndent);
213 IO.enumCase(
Value,
"true", FormatStyle::BAS_Align);
214 IO.enumCase(
Value,
"false", FormatStyle::BAS_DontAlign);
219struct ScalarEnumerationTraits<
220 FormatStyle::BraceWrappingAfterControlStatementStyle> {
223 FormatStyle::BraceWrappingAfterControlStatementStyle &
Value) {
224 IO.enumCase(
Value,
"Never", FormatStyle::BWACS_Never);
225 IO.enumCase(
Value,
"MultiLine", FormatStyle::BWACS_MultiLine);
226 IO.enumCase(
Value,
"Always", FormatStyle::BWACS_Always);
229 IO.enumCase(
Value,
"false", FormatStyle::BWACS_Never);
230 IO.enumCase(
Value,
"true", FormatStyle::BWACS_Always);
235struct ScalarEnumerationTraits<
236 FormatStyle::BreakBeforeConceptDeclarationsStyle> {
239 IO.enumCase(
Value,
"Never", FormatStyle::BBCDS_Never);
240 IO.enumCase(
Value,
"Allowed", FormatStyle::BBCDS_Allowed);
241 IO.enumCase(
Value,
"Always", FormatStyle::BBCDS_Always);
244 IO.enumCase(
Value,
"true", FormatStyle::BBCDS_Always);
245 IO.enumCase(
Value,
"false", FormatStyle::BBCDS_Allowed);
250struct ScalarEnumerationTraits<
FormatStyle::BreakBeforeInlineASMColonStyle> {
252 FormatStyle::BreakBeforeInlineASMColonStyle &
Value) {
253 IO.enumCase(
Value,
"Never", FormatStyle::BBIAS_Never);
254 IO.enumCase(
Value,
"OnlyMultiline", FormatStyle::BBIAS_OnlyMultiline);
255 IO.enumCase(
Value,
"Always", FormatStyle::BBIAS_Always);
260struct ScalarEnumerationTraits<
FormatStyle::BreakBinaryOperationsStyle> {
262 FormatStyle::BreakBinaryOperationsStyle &
Value) {
263 IO.enumCase(
Value,
"Never", FormatStyle::BBO_Never);
264 IO.enumCase(
Value,
"OnePerLine", FormatStyle::BBO_OnePerLine);
265 IO.enumCase(
Value,
"RespectPrecedence", FormatStyle::BBO_RespectPrecedence);
270struct ScalarEnumerationTraits<
FormatStyle::BreakConstructorInitializersStyle> {
273 IO.enumCase(
Value,
"BeforeColon", FormatStyle::BCIS_BeforeColon);
274 IO.enumCase(
Value,
"BeforeComma", FormatStyle::BCIS_BeforeComma);
275 IO.enumCase(
Value,
"AfterColon", FormatStyle::BCIS_AfterColon);
280struct ScalarEnumerationTraits<
FormatStyle::BreakInheritanceListStyle> {
282 FormatStyle::BreakInheritanceListStyle &
Value) {
283 IO.enumCase(
Value,
"BeforeColon", FormatStyle::BILS_BeforeColon);
284 IO.enumCase(
Value,
"BeforeComma", FormatStyle::BILS_BeforeComma);
285 IO.enumCase(
Value,
"AfterColon", FormatStyle::BILS_AfterColon);
286 IO.enumCase(
Value,
"AfterComma", FormatStyle::BILS_AfterComma);
291struct ScalarEnumerationTraits<
FormatStyle::BreakTemplateDeclarationsStyle> {
293 FormatStyle::BreakTemplateDeclarationsStyle &
Value) {
294 IO.enumCase(
Value,
"Leave", FormatStyle::BTDS_Leave);
295 IO.enumCase(
Value,
"No", FormatStyle::BTDS_No);
296 IO.enumCase(
Value,
"MultiLine", FormatStyle::BTDS_MultiLine);
297 IO.enumCase(
Value,
"Yes", FormatStyle::BTDS_Yes);
300 IO.enumCase(
Value,
"false", FormatStyle::BTDS_MultiLine);
301 IO.enumCase(
Value,
"true", FormatStyle::BTDS_Yes);
305template <>
struct ScalarEnumerationTraits<
FormatStyle::DAGArgStyle> {
307 IO.enumCase(
Value,
"DontBreak", FormatStyle::DAS_DontBreak);
308 IO.enumCase(
Value,
"BreakElements", FormatStyle::DAS_BreakElements);
309 IO.enumCase(
Value,
"BreakAll", FormatStyle::DAS_BreakAll);
314struct ScalarEnumerationTraits<
FormatStyle::DefinitionReturnTypeBreakingStyle> {
317 IO.enumCase(
Value,
"None", FormatStyle::DRTBS_None);
318 IO.enumCase(
Value,
"All", FormatStyle::DRTBS_All);
319 IO.enumCase(
Value,
"TopLevel", FormatStyle::DRTBS_TopLevel);
322 IO.enumCase(
Value,
"false", FormatStyle::DRTBS_None);
323 IO.enumCase(
Value,
"true", FormatStyle::DRTBS_All);
328struct ScalarEnumerationTraits<
FormatStyle::EscapedNewlineAlignmentStyle> {
330 FormatStyle::EscapedNewlineAlignmentStyle &
Value) {
331 IO.enumCase(
Value,
"DontAlign", FormatStyle::ENAS_DontAlign);
332 IO.enumCase(
Value,
"Left", FormatStyle::ENAS_Left);
333 IO.enumCase(
Value,
"LeftWithLastLine", FormatStyle::ENAS_LeftWithLastLine);
334 IO.enumCase(
Value,
"Right", FormatStyle::ENAS_Right);
337 IO.enumCase(
Value,
"true", FormatStyle::ENAS_Left);
338 IO.enumCase(
Value,
"false", FormatStyle::ENAS_Right);
343struct ScalarEnumerationTraits<
FormatStyle::EmptyLineAfterAccessModifierStyle> {
346 IO.enumCase(
Value,
"Never", FormatStyle::ELAAMS_Never);
347 IO.enumCase(
Value,
"Leave", FormatStyle::ELAAMS_Leave);
348 IO.enumCase(
Value,
"Always", FormatStyle::ELAAMS_Always);
353struct ScalarEnumerationTraits<
357 IO.enumCase(
Value,
"Never", FormatStyle::ELBAMS_Never);
358 IO.enumCase(
Value,
"Leave", FormatStyle::ELBAMS_Leave);
359 IO.enumCase(
Value,
"LogicalBlock", FormatStyle::ELBAMS_LogicalBlock);
360 IO.enumCase(
Value,
"Always", FormatStyle::ELBAMS_Always);
365struct ScalarEnumerationTraits<
FormatStyle::IndentExternBlockStyle> {
367 IO.enumCase(
Value,
"AfterExternBlock", FormatStyle::IEBS_AfterExternBlock);
368 IO.enumCase(
Value,
"Indent", FormatStyle::IEBS_Indent);
369 IO.enumCase(
Value,
"NoIndent", FormatStyle::IEBS_NoIndent);
370 IO.enumCase(
Value,
"true", FormatStyle::IEBS_Indent);
371 IO.enumCase(
Value,
"false", FormatStyle::IEBS_NoIndent);
375template <>
struct MappingTraits<
FormatStyle::IntegerLiteralSeparatorStyle> {
376 static void mapping(IO &IO, FormatStyle::IntegerLiteralSeparatorStyle &
Base) {
377 IO.mapOptional(
"Binary",
Base.Binary);
378 IO.mapOptional(
"BinaryMinDigits",
Base.BinaryMinDigits);
379 IO.mapOptional(
"Decimal",
Base.Decimal);
380 IO.mapOptional(
"DecimalMinDigits",
Base.DecimalMinDigits);
381 IO.mapOptional(
"Hex",
Base.Hex);
382 IO.mapOptional(
"HexMinDigits",
Base.HexMinDigits);
386template <>
struct ScalarEnumerationTraits<
FormatStyle::JavaScriptQuoteStyle> {
388 IO.enumCase(
Value,
"Leave", FormatStyle::JSQS_Leave);
389 IO.enumCase(
Value,
"Single", FormatStyle::JSQS_Single);
390 IO.enumCase(
Value,
"Double", FormatStyle::JSQS_Double);
394template <>
struct MappingTraits<
FormatStyle::KeepEmptyLinesStyle> {
396 IO.mapOptional(
"AtEndOfFile",
Value.AtEndOfFile);
397 IO.mapOptional(
"AtStartOfBlock",
Value.AtStartOfBlock);
398 IO.mapOptional(
"AtStartOfFile",
Value.AtStartOfFile);
402template <>
struct ScalarEnumerationTraits<
FormatStyle::LanguageKind> {
404 IO.enumCase(
Value,
"Cpp", FormatStyle::LK_Cpp);
405 IO.enumCase(
Value,
"Java", FormatStyle::LK_Java);
406 IO.enumCase(
Value,
"JavaScript", FormatStyle::LK_JavaScript);
407 IO.enumCase(
Value,
"ObjC", FormatStyle::LK_ObjC);
408 IO.enumCase(
Value,
"Proto", FormatStyle::LK_Proto);
409 IO.enumCase(
Value,
"TableGen", FormatStyle::LK_TableGen);
410 IO.enumCase(
Value,
"TextProto", FormatStyle::LK_TextProto);
411 IO.enumCase(
Value,
"CSharp", FormatStyle::LK_CSharp);
412 IO.enumCase(
Value,
"Json", FormatStyle::LK_Json);
413 IO.enumCase(
Value,
"Verilog", FormatStyle::LK_Verilog);
417template <>
struct ScalarEnumerationTraits<
FormatStyle::LanguageStandard> {
419 IO.enumCase(
Value,
"c++03", FormatStyle::LS_Cpp03);
420 IO.enumCase(
Value,
"C++03", FormatStyle::LS_Cpp03);
421 IO.enumCase(
Value,
"Cpp03", FormatStyle::LS_Cpp03);
423 IO.enumCase(
Value,
"c++11", FormatStyle::LS_Cpp11);
424 IO.enumCase(
Value,
"C++11", FormatStyle::LS_Cpp11);
426 IO.enumCase(
Value,
"c++14", FormatStyle::LS_Cpp14);
427 IO.enumCase(
Value,
"c++17", FormatStyle::LS_Cpp17);
428 IO.enumCase(
Value,
"c++20", FormatStyle::LS_Cpp20);
430 IO.enumCase(
Value,
"Latest", FormatStyle::LS_Latest);
431 IO.enumCase(
Value,
"Cpp11", FormatStyle::LS_Latest);
432 IO.enumCase(
Value,
"Auto", FormatStyle::LS_Auto);
437struct ScalarEnumerationTraits<
FormatStyle::LambdaBodyIndentationKind> {
439 FormatStyle::LambdaBodyIndentationKind &
Value) {
440 IO.enumCase(
Value,
"Signature", FormatStyle::LBI_Signature);
441 IO.enumCase(
Value,
"OuterScope", FormatStyle::LBI_OuterScope);
445template <>
struct ScalarEnumerationTraits<
FormatStyle::LineEndingStyle> {
447 IO.enumCase(
Value,
"LF", FormatStyle::LE_LF);
448 IO.enumCase(
Value,
"CRLF", FormatStyle::LE_CRLF);
449 IO.enumCase(
Value,
"DeriveLF", FormatStyle::LE_DeriveLF);
450 IO.enumCase(
Value,
"DeriveCRLF", FormatStyle::LE_DeriveCRLF);
455struct ScalarEnumerationTraits<
FormatStyle::NamespaceIndentationKind> {
457 FormatStyle::NamespaceIndentationKind &
Value) {
458 IO.enumCase(
Value,
"None", FormatStyle::NI_None);
459 IO.enumCase(
Value,
"Inner", FormatStyle::NI_Inner);
460 IO.enumCase(
Value,
"All", FormatStyle::NI_All);
464template <>
struct ScalarEnumerationTraits<
FormatStyle::OperandAlignmentStyle> {
466 IO.enumCase(
Value,
"DontAlign", FormatStyle::OAS_DontAlign);
467 IO.enumCase(
Value,
"Align", FormatStyle::OAS_Align);
468 IO.enumCase(
Value,
"AlignAfterOperator",
469 FormatStyle::OAS_AlignAfterOperator);
472 IO.enumCase(
Value,
"true", FormatStyle::OAS_Align);
473 IO.enumCase(
Value,
"false", FormatStyle::OAS_DontAlign);
478struct ScalarEnumerationTraits<
FormatStyle::PackConstructorInitializersStyle> {
481 IO.enumCase(
Value,
"Never", FormatStyle::PCIS_Never);
482 IO.enumCase(
Value,
"BinPack", FormatStyle::PCIS_BinPack);
483 IO.enumCase(
Value,
"CurrentLine", FormatStyle::PCIS_CurrentLine);
484 IO.enumCase(
Value,
"NextLine", FormatStyle::PCIS_NextLine);
485 IO.enumCase(
Value,
"NextLineOnly", FormatStyle::PCIS_NextLineOnly);
489template <>
struct ScalarEnumerationTraits<
FormatStyle::PointerAlignmentStyle> {
491 IO.enumCase(
Value,
"Middle", FormatStyle::PAS_Middle);
492 IO.enumCase(
Value,
"Left", FormatStyle::PAS_Left);
493 IO.enumCase(
Value,
"Right", FormatStyle::PAS_Right);
496 IO.enumCase(
Value,
"true", FormatStyle::PAS_Left);
497 IO.enumCase(
Value,
"false", FormatStyle::PAS_Right);
502struct ScalarEnumerationTraits<
FormatStyle::PPDirectiveIndentStyle> {
504 IO.enumCase(
Value,
"None", FormatStyle::PPDIS_None);
505 IO.enumCase(
Value,
"AfterHash", FormatStyle::PPDIS_AfterHash);
506 IO.enumCase(
Value,
"BeforeHash", FormatStyle::PPDIS_BeforeHash);
511struct ScalarEnumerationTraits<
FormatStyle::QualifierAlignmentStyle> {
513 IO.enumCase(
Value,
"Leave", FormatStyle::QAS_Leave);
514 IO.enumCase(
Value,
"Left", FormatStyle::QAS_Left);
515 IO.enumCase(
Value,
"Right", FormatStyle::QAS_Right);
516 IO.enumCase(
Value,
"Custom", FormatStyle::QAS_Custom);
521 static void mapping(IO &IO, FormatStyle::RawStringFormat &Format) {
522 IO.mapOptional(
"Language", Format.Language);
523 IO.mapOptional(
"Delimiters", Format.Delimiters);
524 IO.mapOptional(
"EnclosingFunctions", Format.EnclosingFunctions);
525 IO.mapOptional(
"CanonicalDelimiter", Format.CanonicalDelimiter);
526 IO.mapOptional(
"BasedOnStyle", Format.BasedOnStyle);
530template <>
struct ScalarEnumerationTraits<
FormatStyle::ReflowCommentsStyle> {
532 IO.enumCase(
Value,
"Never", FormatStyle::RCS_Never);
533 IO.enumCase(
Value,
"IndentOnly", FormatStyle::RCS_IndentOnly);
534 IO.enumCase(
Value,
"Always", FormatStyle::RCS_Always);
536 IO.enumCase(
Value,
"false", FormatStyle::RCS_Never);
537 IO.enumCase(
Value,
"true", FormatStyle::RCS_Always);
542struct ScalarEnumerationTraits<
FormatStyle::ReferenceAlignmentStyle> {
544 IO.enumCase(
Value,
"Pointer", FormatStyle::RAS_Pointer);
545 IO.enumCase(
Value,
"Middle", FormatStyle::RAS_Middle);
546 IO.enumCase(
Value,
"Left", FormatStyle::RAS_Left);
547 IO.enumCase(
Value,
"Right", FormatStyle::RAS_Right);
552struct ScalarEnumerationTraits<
FormatStyle::RemoveParenthesesStyle> {
554 IO.enumCase(
Value,
"Leave", FormatStyle::RPS_Leave);
555 IO.enumCase(
Value,
"MultipleParentheses",
556 FormatStyle::RPS_MultipleParentheses);
557 IO.enumCase(
Value,
"ReturnStatement", FormatStyle::RPS_ReturnStatement);
562struct ScalarEnumerationTraits<
FormatStyle::RequiresClausePositionStyle> {
564 FormatStyle::RequiresClausePositionStyle &
Value) {
565 IO.enumCase(
Value,
"OwnLine", FormatStyle::RCPS_OwnLine);
566 IO.enumCase(
Value,
"OwnLineWithBrace", FormatStyle::RCPS_OwnLineWithBrace);
567 IO.enumCase(
Value,
"WithPreceding", FormatStyle::RCPS_WithPreceding);
568 IO.enumCase(
Value,
"WithFollowing", FormatStyle::RCPS_WithFollowing);
569 IO.enumCase(
Value,
"SingleLine", FormatStyle::RCPS_SingleLine);
574struct ScalarEnumerationTraits<
FormatStyle::RequiresExpressionIndentationKind> {
577 IO.enumCase(
Value,
"Keyword", FormatStyle::REI_Keyword);
578 IO.enumCase(
Value,
"OuterScope", FormatStyle::REI_OuterScope);
583struct ScalarEnumerationTraits<
FormatStyle::ReturnTypeBreakingStyle> {
585 IO.enumCase(
Value,
"None", FormatStyle::RTBS_None);
586 IO.enumCase(
Value,
"Automatic", FormatStyle::RTBS_Automatic);
587 IO.enumCase(
Value,
"ExceptShortType", FormatStyle::RTBS_ExceptShortType);
588 IO.enumCase(
Value,
"All", FormatStyle::RTBS_All);
589 IO.enumCase(
Value,
"TopLevel", FormatStyle::RTBS_TopLevel);
590 IO.enumCase(
Value,
"TopLevelDefinitions",
591 FormatStyle::RTBS_TopLevelDefinitions);
592 IO.enumCase(
Value,
"AllDefinitions", FormatStyle::RTBS_AllDefinitions);
597struct ScalarEnumerationTraits<
FormatStyle::SeparateDefinitionStyle> {
599 IO.enumCase(
Value,
"Leave", FormatStyle::SDS_Leave);
600 IO.enumCase(
Value,
"Always", FormatStyle::SDS_Always);
601 IO.enumCase(
Value,
"Never", FormatStyle::SDS_Never);
605template <>
struct ScalarEnumerationTraits<
FormatStyle::ShortBlockStyle> {
607 IO.enumCase(
Value,
"Never", FormatStyle::SBS_Never);
608 IO.enumCase(
Value,
"false", FormatStyle::SBS_Never);
609 IO.enumCase(
Value,
"Always", FormatStyle::SBS_Always);
610 IO.enumCase(
Value,
"true", FormatStyle::SBS_Always);
611 IO.enumCase(
Value,
"Empty", FormatStyle::SBS_Empty);
615template <>
struct ScalarEnumerationTraits<
FormatStyle::ShortFunctionStyle> {
617 IO.enumCase(
Value,
"None", FormatStyle::SFS_None);
618 IO.enumCase(
Value,
"false", FormatStyle::SFS_None);
619 IO.enumCase(
Value,
"All", FormatStyle::SFS_All);
620 IO.enumCase(
Value,
"true", FormatStyle::SFS_All);
621 IO.enumCase(
Value,
"Inline", FormatStyle::SFS_Inline);
622 IO.enumCase(
Value,
"InlineOnly", FormatStyle::SFS_InlineOnly);
623 IO.enumCase(
Value,
"Empty", FormatStyle::SFS_Empty);
627template <>
struct ScalarEnumerationTraits<
FormatStyle::ShortIfStyle> {
629 IO.enumCase(
Value,
"Never", FormatStyle::SIS_Never);
630 IO.enumCase(
Value,
"WithoutElse", FormatStyle::SIS_WithoutElse);
631 IO.enumCase(
Value,
"OnlyFirstIf", FormatStyle::SIS_OnlyFirstIf);
632 IO.enumCase(
Value,
"AllIfsAndElse", FormatStyle::SIS_AllIfsAndElse);
635 IO.enumCase(
Value,
"Always", FormatStyle::SIS_OnlyFirstIf);
636 IO.enumCase(
Value,
"false", FormatStyle::SIS_Never);
637 IO.enumCase(
Value,
"true", FormatStyle::SIS_WithoutElse);
641template <>
struct ScalarEnumerationTraits<
FormatStyle::ShortLambdaStyle> {
643 IO.enumCase(
Value,
"None", FormatStyle::SLS_None);
644 IO.enumCase(
Value,
"false", FormatStyle::SLS_None);
645 IO.enumCase(
Value,
"Empty", FormatStyle::SLS_Empty);
646 IO.enumCase(
Value,
"Inline", FormatStyle::SLS_Inline);
647 IO.enumCase(
Value,
"All", FormatStyle::SLS_All);
648 IO.enumCase(
Value,
"true", FormatStyle::SLS_All);
652template <>
struct ScalarEnumerationTraits<
FormatStyle::SortIncludesOptions> {
654 IO.enumCase(
Value,
"Never", FormatStyle::SI_Never);
655 IO.enumCase(
Value,
"CaseInsensitive", FormatStyle::SI_CaseInsensitive);
656 IO.enumCase(
Value,
"CaseSensitive", FormatStyle::SI_CaseSensitive);
659 IO.enumCase(
Value,
"false", FormatStyle::SI_Never);
660 IO.enumCase(
Value,
"true", FormatStyle::SI_CaseSensitive);
665struct ScalarEnumerationTraits<
FormatStyle::SortJavaStaticImportOptions> {
667 FormatStyle::SortJavaStaticImportOptions &
Value) {
668 IO.enumCase(
Value,
"Before", FormatStyle::SJSIO_Before);
669 IO.enumCase(
Value,
"After", FormatStyle::SJSIO_After);
674struct ScalarEnumerationTraits<
FormatStyle::SortUsingDeclarationsOptions> {
676 FormatStyle::SortUsingDeclarationsOptions &
Value) {
677 IO.enumCase(
Value,
"Never", FormatStyle::SUD_Never);
678 IO.enumCase(
Value,
"Lexicographic", FormatStyle::SUD_Lexicographic);
679 IO.enumCase(
Value,
"LexicographicNumeric",
680 FormatStyle::SUD_LexicographicNumeric);
683 IO.enumCase(
Value,
"false", FormatStyle::SUD_Never);
684 IO.enumCase(
Value,
"true", FormatStyle::SUD_LexicographicNumeric);
689struct ScalarEnumerationTraits<
FormatStyle::SpaceAroundPointerQualifiersStyle> {
692 IO.enumCase(
Value,
"Default", FormatStyle::SAPQ_Default);
693 IO.enumCase(
Value,
"Before", FormatStyle::SAPQ_Before);
694 IO.enumCase(
Value,
"After", FormatStyle::SAPQ_After);
695 IO.enumCase(
Value,
"Both", FormatStyle::SAPQ_Both);
699template <>
struct MappingTraits<
FormatStyle::SpaceBeforeParensCustom> {
700 static void mapping(IO &IO, FormatStyle::SpaceBeforeParensCustom &Spacing) {
701 IO.mapOptional(
"AfterControlStatements", Spacing.AfterControlStatements);
702 IO.mapOptional(
"AfterForeachMacros", Spacing.AfterForeachMacros);
703 IO.mapOptional(
"AfterFunctionDefinitionName",
704 Spacing.AfterFunctionDefinitionName);
705 IO.mapOptional(
"AfterFunctionDeclarationName",
706 Spacing.AfterFunctionDeclarationName);
707 IO.mapOptional(
"AfterIfMacros", Spacing.AfterIfMacros);
708 IO.mapOptional(
"AfterOverloadedOperator", Spacing.AfterOverloadedOperator);
709 IO.mapOptional(
"AfterPlacementOperator", Spacing.AfterPlacementOperator);
710 IO.mapOptional(
"AfterRequiresInClause", Spacing.AfterRequiresInClause);
711 IO.mapOptional(
"AfterRequiresInExpression",
712 Spacing.AfterRequiresInExpression);
713 IO.mapOptional(
"BeforeNonEmptyParentheses",
714 Spacing.BeforeNonEmptyParentheses);
719struct ScalarEnumerationTraits<
FormatStyle::SpaceBeforeParensStyle> {
721 IO.enumCase(
Value,
"Never", FormatStyle::SBPO_Never);
722 IO.enumCase(
Value,
"ControlStatements",
723 FormatStyle::SBPO_ControlStatements);
724 IO.enumCase(
Value,
"ControlStatementsExceptControlMacros",
725 FormatStyle::SBPO_ControlStatementsExceptControlMacros);
726 IO.enumCase(
Value,
"NonEmptyParentheses",
727 FormatStyle::SBPO_NonEmptyParentheses);
728 IO.enumCase(
Value,
"Always", FormatStyle::SBPO_Always);
729 IO.enumCase(
Value,
"Custom", FormatStyle::SBPO_Custom);
732 IO.enumCase(
Value,
"false", FormatStyle::SBPO_Never);
733 IO.enumCase(
Value,
"true", FormatStyle::SBPO_ControlStatements);
734 IO.enumCase(
Value,
"ControlStatementsExceptForEachMacros",
735 FormatStyle::SBPO_ControlStatementsExceptControlMacros);
739template <>
struct ScalarEnumerationTraits<
FormatStyle::SpacesInAnglesStyle> {
741 IO.enumCase(
Value,
"Never", FormatStyle::SIAS_Never);
742 IO.enumCase(
Value,
"Always", FormatStyle::SIAS_Always);
743 IO.enumCase(
Value,
"Leave", FormatStyle::SIAS_Leave);
746 IO.enumCase(
Value,
"false", FormatStyle::SIAS_Never);
747 IO.enumCase(
Value,
"true", FormatStyle::SIAS_Always);
751template <>
struct MappingTraits<
FormatStyle::SpacesInLineComment> {
752 static void mapping(IO &IO, FormatStyle::SpacesInLineComment &Space) {
754 int signedMaximum =
static_cast<int>(Space.Maximum);
755 IO.mapOptional(
"Minimum", Space.Minimum);
756 IO.mapOptional(
"Maximum", signedMaximum);
757 Space.Maximum =
static_cast<unsigned>(signedMaximum);
759 if (Space.Maximum != -1u)
760 Space.Minimum = std::min(Space.Minimum, Space.Maximum);
764template <>
struct MappingTraits<
FormatStyle::SpacesInParensCustom> {
765 static void mapping(IO &IO, FormatStyle::SpacesInParensCustom &Spaces) {
766 IO.mapOptional(
"ExceptDoubleParentheses", Spaces.ExceptDoubleParentheses);
767 IO.mapOptional(
"InCStyleCasts", Spaces.InCStyleCasts);
768 IO.mapOptional(
"InConditionalStatements", Spaces.InConditionalStatements);
769 IO.mapOptional(
"InEmptyParentheses", Spaces.InEmptyParentheses);
770 IO.mapOptional(
"Other", Spaces.Other);
774template <>
struct ScalarEnumerationTraits<
FormatStyle::SpacesInParensStyle> {
776 IO.enumCase(
Value,
"Never", FormatStyle::SIPO_Never);
777 IO.enumCase(
Value,
"Custom", FormatStyle::SIPO_Custom);
781template <>
struct ScalarEnumerationTraits<
FormatStyle::TrailingCommaStyle> {
783 IO.enumCase(
Value,
"None", FormatStyle::TCS_None);
784 IO.enumCase(
Value,
"Wrapped", FormatStyle::TCS_Wrapped);
789struct ScalarEnumerationTraits<
FormatStyle::TrailingCommentsAlignmentKinds> {
791 FormatStyle::TrailingCommentsAlignmentKinds &
Value) {
792 IO.enumCase(
Value,
"Leave", FormatStyle::TCAS_Leave);
793 IO.enumCase(
Value,
"Always", FormatStyle::TCAS_Always);
794 IO.enumCase(
Value,
"Never", FormatStyle::TCAS_Never);
798template <>
struct MappingTraits<
FormatStyle::TrailingCommentsAlignmentStyle> {
800 FormatStyle::TrailingCommentsAlignmentStyle &
Value) {
801 IO.enumCase(
Value,
"Leave",
802 FormatStyle::TrailingCommentsAlignmentStyle(
803 {FormatStyle::TCAS_Leave, 0}));
805 IO.enumCase(
Value,
"Always",
806 FormatStyle::TrailingCommentsAlignmentStyle(
807 {FormatStyle::TCAS_Always, 0}));
809 IO.enumCase(
Value,
"Never",
810 FormatStyle::TrailingCommentsAlignmentStyle(
811 {FormatStyle::TCAS_Never, 0}));
814 IO.enumCase(
Value,
"true",
815 FormatStyle::TrailingCommentsAlignmentStyle(
816 {FormatStyle::TCAS_Always, 0}));
817 IO.enumCase(
Value,
"false",
818 FormatStyle::TrailingCommentsAlignmentStyle(
819 {FormatStyle::TCAS_Never, 0}));
823 FormatStyle::TrailingCommentsAlignmentStyle &
Value) {
824 IO.mapOptional(
"Kind",
Value.Kind);
825 IO.mapOptional(
"OverEmptyLines",
Value.OverEmptyLines);
829template <>
struct ScalarEnumerationTraits<
FormatStyle::UseTabStyle> {
831 IO.enumCase(
Value,
"Never", FormatStyle::UT_Never);
832 IO.enumCase(
Value,
"false", FormatStyle::UT_Never);
833 IO.enumCase(
Value,
"Always", FormatStyle::UT_Always);
834 IO.enumCase(
Value,
"true", FormatStyle::UT_Always);
835 IO.enumCase(
Value,
"ForIndentation", FormatStyle::UT_ForIndentation);
836 IO.enumCase(
Value,
"ForContinuationAndIndentation",
837 FormatStyle::UT_ForContinuationAndIndentation);
838 IO.enumCase(
Value,
"AlignWithSpaces", FormatStyle::UT_AlignWithSpaces);
845 IO.mapOptional(
"Language", Style.
Language);
847 StringRef BasedOnStyle;
848 if (IO.outputting()) {
849 StringRef Styles[] = {
"LLVM",
"Google",
"Chromium",
"Mozilla",
850 "WebKit",
"GNU",
"Microsoft",
"clang-format"};
851 for (StringRef StyleName : Styles) {
853 if (getPredefinedStyle(StyleName, Style.
Language, &PredefinedStyle) &&
854 Style == PredefinedStyle) {
855 BasedOnStyle = StyleName;
860 IO.mapOptional(
"BasedOnStyle", BasedOnStyle);
861 if (!BasedOnStyle.empty()) {
862 FormatStyle::LanguageKind OldLanguage = Style.
Language;
863 FormatStyle::LanguageKind Language =
865 if (!getPredefinedStyle(BasedOnStyle, Language, &Style)) {
866 IO.setError(Twine(
"Unknown value for BasedOnStyle: ", BasedOnStyle));
884 const bool IsGoogleOrChromium = BasedOnStyle.equals_insensitive(
"google") ||
885 BasedOnStyle.equals_insensitive(
"chromium");
886 bool OnCurrentLine = IsGoogleOrChromium;
887 bool OnNextLine =
true;
889 bool BreakBeforeInheritanceComma =
false;
890 bool BreakConstructorInitializersBeforeComma =
false;
892 bool DeriveLineEnding =
true;
893 bool UseCRLF =
false;
895 bool SpaceInEmptyParentheses =
false;
896 bool SpacesInConditionalStatement =
false;
897 bool SpacesInCStyleCastParentheses =
false;
898 bool SpacesInParentheses =
false;
901 if (!IO.outputting()) {
903 IO.mapOptional(
"AllowAllConstructorInitializersOnNextLine", OnNextLine);
905 IO.mapOptional(
"AlwaysBreakTemplateDeclarations",
907 IO.mapOptional(
"BreakBeforeInheritanceComma",
908 BreakBeforeInheritanceComma);
909 IO.mapOptional(
"BreakConstructorInitializersBeforeComma",
910 BreakConstructorInitializersBeforeComma);
911 IO.mapOptional(
"ConstructorInitializerAllOnOneLineOrOnePerLine",
913 IO.mapOptional(
"DeriveLineEnding", DeriveLineEnding);
916 IO.mapOptional(
"KeepEmptyLinesAtTheStartOfBlocks",
918 IO.mapOptional(
"IndentFunctionDeclarationAfterType",
922 IO.mapOptional(
"SpaceAfterControlStatementKeyword",
924 IO.mapOptional(
"SpaceInEmptyParentheses", SpaceInEmptyParentheses);
925 IO.mapOptional(
"SpacesInConditionalStatement",
926 SpacesInConditionalStatement);
927 IO.mapOptional(
"SpacesInCStyleCastParentheses",
928 SpacesInCStyleCastParentheses);
929 IO.mapOptional(
"SpacesInParentheses", SpacesInParentheses);
930 IO.mapOptional(
"UseCRLF", UseCRLF);
936 IO.mapOptional(
"AlignConsecutiveAssignments",
938 IO.mapOptional(
"AlignConsecutiveBitFields",
940 IO.mapOptional(
"AlignConsecutiveDeclarations",
943 IO.mapOptional(
"AlignConsecutiveShortCaseStatements",
945 IO.mapOptional(
"AlignConsecutiveTableGenBreakingDAGArgColons",
947 IO.mapOptional(
"AlignConsecutiveTableGenCondOperatorColons",
949 IO.mapOptional(
"AlignConsecutiveTableGenDefinitionColons",
954 IO.mapOptional(
"AllowAllArgumentsOnNextLine",
956 IO.mapOptional(
"AllowAllParametersOfDeclarationOnNextLine",
958 IO.mapOptional(
"AllowBreakBeforeNoexceptSpecifier",
960 IO.mapOptional(
"AllowShortBlocksOnASingleLine",
962 IO.mapOptional(
"AllowShortCaseExpressionOnASingleLine",
964 IO.mapOptional(
"AllowShortCaseLabelsOnASingleLine",
966 IO.mapOptional(
"AllowShortCompoundRequirementOnASingleLine",
968 IO.mapOptional(
"AllowShortEnumsOnASingleLine",
970 IO.mapOptional(
"AllowShortFunctionsOnASingleLine",
972 IO.mapOptional(
"AllowShortIfStatementsOnASingleLine",
974 IO.mapOptional(
"AllowShortLambdasOnASingleLine",
976 IO.mapOptional(
"AllowShortLoopsOnASingleLine",
978 IO.mapOptional(
"AlwaysBreakAfterDefinitionReturnType",
980 IO.mapOptional(
"AlwaysBreakBeforeMultilineStrings",
986 IO.mapOptional(
"BracedInitializerIndentWidth",
989 IO.mapOptional(
"BreakAdjacentStringLiterals",
992 IO.mapOptional(
"BreakAfterJavaFieldAnnotations",
996 IO.mapOptional(
"BreakBeforeBinaryOperators",
998 IO.mapOptional(
"BreakBeforeConceptDeclarations",
1001 IO.mapOptional(
"BreakBeforeInlineASMColon",
1003 IO.mapOptional(
"BreakBeforeTernaryOperators",
1006 IO.mapOptional(
"BreakConstructorInitializers",
1008 IO.mapOptional(
"BreakFunctionDefinitionParameters",
1012 IO.mapOptional(
"BreakTemplateDeclarations",
1017 IO.mapOptional(
"ConstructorInitializerIndentWidth",
1023 IO.mapOptional(
"EmptyLineAfterAccessModifier",
1025 IO.mapOptional(
"EmptyLineBeforeAccessModifier",
1027 IO.mapOptional(
"ExperimentalAutoDetectBinPacking",
1031 IO.mapOptional(
"IfMacros", Style.
IfMacros);
1035 IO.mapOptional(
"IncludeIsMainSourceRegex",
1045 IO.mapOptional(
"IndentWrappedFunctionNames",
1057 IO.mapOptional(
"LineEnding", Style.
LineEnding);
1060 IO.mapOptional(
"Macros", Style.
Macros);
1067 IO.mapOptional(
"ObjCBreakBeforeNestedBlockParam",
1069 IO.mapOptional(
"ObjCPropertyAttributeOrder",
1072 IO.mapOptional(
"ObjCSpaceBeforeProtocolList",
1074 IO.mapOptional(
"PackConstructorInitializers",
1077 IO.mapOptional(
"PenaltyBreakBeforeFirstCallParameter",
1080 IO.mapOptional(
"PenaltyBreakFirstLessLess",
1082 IO.mapOptional(
"PenaltyBreakOpenParenthesis",
1084 IO.mapOptional(
"PenaltyBreakScopeResolution",
1087 IO.mapOptional(
"PenaltyBreakTemplateDeclaration",
1090 IO.mapOptional(
"PenaltyIndentedWhitespace",
1092 IO.mapOptional(
"PenaltyReturnTypeOnItsOwnLine",
1108 IO.mapOptional(
"RemoveEmptyLinesInUnwrappedLines",
1113 IO.mapOptional(
"RequiresExpressionIndentation",
1123 IO.mapOptional(
"SpaceAfterTemplateKeyword",
1125 IO.mapOptional(
"SpaceAroundPointerQualifiers",
1127 IO.mapOptional(
"SpaceBeforeAssignmentOperators",
1130 IO.mapOptional(
"SpaceBeforeCpp11BracedList",
1132 IO.mapOptional(
"SpaceBeforeCtorInitializerColon",
1134 IO.mapOptional(
"SpaceBeforeInheritanceColon",
1139 IO.mapOptional(
"SpaceBeforeRangeBasedForLoopColon",
1141 IO.mapOptional(
"SpaceBeforeSquareBrackets",
1144 IO.mapOptional(
"SpacesBeforeTrailingComments",
1147 IO.mapOptional(
"SpacesInContainerLiterals",
1149 IO.mapOptional(
"SpacesInLineCommentPrefix",
1154 IO.mapOptional(
"Standard", Style.
Standard);
1155 IO.mapOptional(
"StatementAttributeLikeMacros",
1158 IO.mapOptional(
"TableGenBreakingDAGArgOperators",
1160 IO.mapOptional(
"TableGenBreakInsideDAGArg",
1162 IO.mapOptional(
"TabWidth", Style.
TabWidth);
1164 IO.mapOptional(
"TypeNames", Style.
TypeNames);
1166 IO.mapOptional(
"UseTab", Style.
UseTab);
1167 IO.mapOptional(
"VerilogBreakBetweenInstancePorts",
1169 IO.mapOptional(
"WhitespaceSensitiveMacros",
1178 FormatStyle::DRTBS_All) {
1181 FormatStyle::DRTBS_TopLevel) {
1188 if (BreakBeforeInheritanceComma &&
1196 if (BreakConstructorInitializersBeforeComma &&
1201 if (!IsGoogleOrChromium) {
1205 ? FormatStyle::PCIS_NextLine
1206 : FormatStyle::PCIS_CurrentLine;
1209 FormatStyle::PCIS_NextLine) {
1212 else if (!OnNextLine)
1216 if (Style.
LineEnding == FormatStyle::LE_DeriveLF) {
1217 if (!DeriveLineEnding)
1218 Style.
LineEnding = UseCRLF ? FormatStyle::LE_CRLF : FormatStyle::LE_LF;
1220 Style.
LineEnding = FormatStyle::LE_DeriveCRLF;
1224 (SpacesInParentheses || SpaceInEmptyParentheses ||
1225 SpacesInConditionalStatement || SpacesInCStyleCastParentheses)) {
1226 if (SpacesInParentheses) {
1231 SpacesInCStyleCastParentheses;
1233 SpaceInEmptyParentheses;
1238 SpacesInConditionalStatement;
1240 SpacesInCStyleCastParentheses;
1242 SpaceInEmptyParentheses;
1254template <>
struct DocumentListTraits<
std::vector<FormatStyle>> {
1255 static size_t size(IO &IO, std::vector<FormatStyle> &Seq) {
1260 if (Index >= Seq.size()) {
1261 assert(Index == Seq.size());
1263 if (!Seq.empty() && Seq[0].Language == FormatStyle::LK_None) {
1266 Template = *((
const FormatStyle *)IO.getContext());
1267 Template.
Language = FormatStyle::LK_None;
1269 Seq.resize(Index + 1, Template);
1289 return llvm::make_error<llvm::StringError>(Message,
1290 llvm::inconvertibleErrorCode());
1294 return "clang-format.parse_error";
1302 return "Invalid argument";
1304 return "Unsuitable";
1306 return "trailing comma insertion cannot be used with bin packing";
1308 return "Invalid qualifier specified in QualifierOrder";
1310 return "Duplicate qualifier specified in QualifierOrder";
1312 return "Missing type in QualifierOrder";
1314 return "Missing QualifierOrder";
1316 llvm_unreachable(
"unexpected parse error");
1539 LLVMStyle.
IfMacros.push_back(
"KJ_IF_MAYBE");
1542 {
"^\"(llvm|llvm-c|clang|clang-c)/", 2, 0,
false},
1543 {
"^(<|\"(gtest|gmock|isl|json)/)", 3, 0,
false},
1544 {
".*", 1, 0,
false}};
1690 {
"^<.*\\.h>", 1, 0,
false},
1691 {
"^<.*", 2, 0,
false},
1692 {
".*", 3, 0,
false}};
1732 "PARSE_PARTIAL_TEXT_PROTO",
1736 "ParseTextProtoOrDie",
1738 "ParsePartialTestProto",
1850 "com.google.android.apps.chrome",
1869 return ChromiumStyle;
1895 return MozillaStyle;
1990 if (Name.equals_insensitive(
"llvm"))
1992 else if (Name.equals_insensitive(
"chromium"))
1994 else if (Name.equals_insensitive(
"mozilla"))
1996 else if (Name.equals_insensitive(
"google"))
1998 else if (Name.equals_insensitive(
"webkit"))
2000 else if (Name.equals_insensitive(
"gnu"))
2002 else if (Name.equals_insensitive(
"microsoft"))
2004 else if (Name.equals_insensitive(
"clang-format"))
2006 else if (Name.equals_insensitive(
"none"))
2008 else if (Name.equals_insensitive(
"inheritparentconfig"))
2024 if (Qualifier ==
"type")
2028 if (token == tok::identifier)
2033 std::set<std::string> UniqueQualifiers(Style->
QualifierOrder.begin(),
2036 LLVM_DEBUG(llvm::dbgs()
2038 <<
" vs " << UniqueQualifiers.size() <<
"\n");
2051 llvm::SourceMgr::DiagHandlerTy DiagHandler,
2052 void *DiagHandlerCtxt) {
2056 if (Config.getBuffer().trim().empty())
2058 Style->StyleSet.
Clear();
2059 std::vector<FormatStyle> Styles;
2060 llvm::yaml::Input Input(Config,
nullptr, DiagHandler,
2066 Input.setContext(Style);
2067 Input.setAllowUnknownKeys(AllowUnknownOptions);
2070 return Input.error();
2072 for (
unsigned i = 0; i < Styles.size(); ++i) {
2077 for (
unsigned j = 0; j < i; ++j) {
2079 LLVM_DEBUG(llvm::dbgs()
2080 <<
"Duplicate languages in the config file on positions "
2081 << j <<
" and " << i <<
"\n");
2090 bool LanguageFound =
false;
2091 for (
const FormatStyle &Style : llvm::reverse(Styles)) {
2093 StyleSet.
Add(Style);
2095 LanguageFound =
true;
2097 if (!LanguageFound) {
2102 StyleSet.
Add(std::move(DefaultStyle));
2117 llvm::raw_string_ostream Stream(
Text);
2118 llvm::yaml::Output Output(Stream);
2125 Output << NonConstStyle;
2127 return Stream.str();
2130std::optional<FormatStyle>
2133 return std::nullopt;
2135 if (It == Styles->end())
2136 return std::nullopt;
2138 Style.StyleSet = *
this;
2144 "Cannot add a style for LK_None to a StyleSet");
2146 !Style.StyleSet.Styles &&
2147 "Cannot add a style associated with an existing StyleSet to a StyleSet");
2149 Styles = std::make_shared<MapType>();
2150 (*Styles)[Style.
Language] = std::move(Style);
2155std::optional<FormatStyle>
2167 std::pair<tooling::Replacements, unsigned>
2168 analyze(TokenAnnotator &Annotator,
2170 FormatTokenLexer &Tokens)
override {
2171 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2173 removeParens(AnnotatedLines, Result);
2178 void removeParens(SmallVectorImpl<AnnotatedLine *> &Lines,
2179 tooling::Replacements &Result) {
2180 const auto &SourceMgr =
Env.getSourceManager();
2181 for (
auto *Line : Lines) {
2182 if (!Line->Children.empty())
2183 removeParens(Line->Children, Result);
2184 if (!Line->Affected)
2186 for (
const auto *Token = Line->First; Token && !Token->Finalized;
2187 Token = Token->Next) {
2188 if (!Token->Optional || !Token->isOneOf(tok::l_paren, tok::r_paren))
2190 auto *Next = Token->Next;
2191 assert(Next && Next->isNot(tok::eof));
2192 SourceLocation Start;
2193 if (Next->NewlinesBefore == 0) {
2194 Start = Token->Tok.getLocation();
2195 Next->WhitespaceRange = Token->WhitespaceRange;
2197 Start = Token->WhitespaceRange.getBegin();
2200 CharSourceRange::getCharRange(Start, Token->Tok.getEndLoc());
2201 cantFail(Result.add(tooling::Replacement(SourceMgr,
Range,
" ")));
2207class BracesInserter :
public TokenAnalyzer {
2210 : TokenAnalyzer(
Env, Style) {}
2212 std::pair<tooling::Replacements, unsigned>
2213 analyze(TokenAnnotator &Annotator,
2214 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2215 FormatTokenLexer &Tokens)
override {
2216 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2217 tooling::Replacements Result;
2218 insertBraces(AnnotatedLines, Result);
2223 void insertBraces(SmallVectorImpl<AnnotatedLine *> &Lines,
2224 tooling::Replacements &Result) {
2225 const auto &SourceMgr =
Env.getSourceManager();
2226 int OpeningBraceSurplus = 0;
2227 for (AnnotatedLine *Line : Lines) {
2228 if (!Line->Children.empty())
2229 insertBraces(Line->Children, Result);
2230 if (!Line->Affected && OpeningBraceSurplus == 0)
2232 for (FormatToken *Token = Line->First; Token && !Token->Finalized;
2233 Token = Token->Next) {
2234 int BraceCount = Token->BraceCount;
2235 if (BraceCount == 0)
2238 if (BraceCount < 0) {
2239 assert(BraceCount == -1);
2240 if (!Line->Affected)
2242 Brace = Token->is(tok::comment) ?
"\n{" :
"{";
2243 ++OpeningBraceSurplus;
2245 if (OpeningBraceSurplus == 0)
2247 if (OpeningBraceSurplus < BraceCount)
2248 BraceCount = OpeningBraceSurplus;
2249 Brace =
'\n' + std::string(BraceCount,
'}');
2250 OpeningBraceSurplus -= BraceCount;
2252 Token->BraceCount = 0;
2253 const auto Start = Token->Tok.getEndLoc();
2254 cantFail(Result.add(tooling::Replacement(SourceMgr, Start, 0,
Brace)));
2257 assert(OpeningBraceSurplus == 0);
2261class BracesRemover :
public TokenAnalyzer {
2264 : TokenAnalyzer(
Env, Style) {}
2266 std::pair<tooling::Replacements, unsigned>
2267 analyze(TokenAnnotator &Annotator,
2268 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2269 FormatTokenLexer &Tokens)
override {
2270 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2271 tooling::Replacements Result;
2272 removeBraces(AnnotatedLines, Result);
2277 void removeBraces(SmallVectorImpl<AnnotatedLine *> &Lines,
2278 tooling::Replacements &Result) {
2279 const auto &SourceMgr =
Env.getSourceManager();
2280 const auto *End = Lines.end();
2281 for (
const auto *I = Lines.begin(); I != End; ++I) {
2282 const auto &Line = *I;
2283 if (!Line->Children.empty())
2284 removeBraces(Line->Children, Result);
2285 if (!Line->Affected)
2287 const auto *NextLine = I + 1 == End ? nullptr : I[1];
2288 for (
const auto *Token = Line->First; Token && !Token->Finalized;
2289 Token = Token->Next) {
2290 if (!Token->Optional)
2292 if (!Token->isOneOf(tok::l_brace, tok::r_brace))
2294 auto *Next = Token->Next;
2295 assert(Next || Token == Line->Last);
2296 if (!Next && NextLine)
2297 Next = NextLine->First;
2298 SourceLocation Start;
2299 if (Next && Next->NewlinesBefore == 0 && Next->isNot(tok::eof)) {
2300 Start = Token->Tok.getLocation();
2301 Next->WhitespaceRange = Token->WhitespaceRange;
2303 Start = Token->WhitespaceRange.getBegin();
2306 CharSourceRange::getCharRange(Start, Token->Tok.getEndLoc());
2307 cantFail(Result.add(tooling::Replacement(SourceMgr,
Range,
"")));
2313class SemiRemover :
public TokenAnalyzer {
2316 : TokenAnalyzer(
Env, Style) {}
2318 std::pair<tooling::Replacements, unsigned>
2319 analyze(TokenAnnotator &Annotator,
2320 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2321 FormatTokenLexer &Tokens)
override {
2322 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2323 tooling::Replacements Result;
2324 removeSemi(Annotator, AnnotatedLines, Result);
2329 void removeSemi(TokenAnnotator &Annotator,
2330 SmallVectorImpl<AnnotatedLine *> &Lines,
2331 tooling::Replacements &Result) {
2332 auto PrecededByFunctionRBrace = [](
const FormatToken &Tok) {
2333 const auto *Prev = Tok.Previous;
2334 if (!Prev || Prev->isNot(tok::r_brace))
2336 const auto *LBrace = Prev->MatchingParen;
2337 return LBrace && LBrace->is(TT_FunctionLBrace);
2339 const auto &SourceMgr =
Env.getSourceManager();
2340 const auto *End = Lines.end();
2341 for (
const auto *I = Lines.begin(); I != End; ++I) {
2342 const auto &Line = *I;
2343 if (!Line->Children.empty())
2344 removeSemi(Annotator, Line->Children, Result);
2345 if (!Line->Affected)
2347 Annotator.calculateFormattingInformation(*Line);
2348 const auto *NextLine = I + 1 == End ? nullptr : I[1];
2349 for (
const auto *Token = Line->First; Token && !Token->Finalized;
2350 Token = Token->Next) {
2351 if (Token->isNot(tok::semi) ||
2352 (!Token->Optional && !PrecededByFunctionRBrace(*Token))) {
2355 auto *Next = Token->Next;
2356 assert(Next || Token == Line->Last);
2357 if (!Next && NextLine)
2358 Next = NextLine->First;
2359 SourceLocation Start;
2360 if (Next && Next->NewlinesBefore == 0 && Next->isNot(tok::eof)) {
2361 Start = Token->Tok.getLocation();
2362 Next->WhitespaceRange = Token->WhitespaceRange;
2364 Start = Token->WhitespaceRange.getBegin();
2367 CharSourceRange::getCharRange(Start, Token->Tok.getEndLoc());
2368 cantFail(Result.add(tooling::Replacement(SourceMgr,
Range,
"")));
2374class JavaScriptRequoter :
public TokenAnalyzer {
2376 JavaScriptRequoter(
const Environment &
Env,
const FormatStyle &Style)
2377 : TokenAnalyzer(
Env, Style) {}
2379 std::pair<tooling::Replacements, unsigned>
2380 analyze(TokenAnnotator &Annotator,
2381 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2382 FormatTokenLexer &Tokens)
override {
2383 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2384 tooling::Replacements Result;
2385 requoteJSStringLiteral(AnnotatedLines, Result);
2392 void requoteJSStringLiteral(SmallVectorImpl<AnnotatedLine *> &Lines,
2393 tooling::Replacements &Result) {
2394 for (AnnotatedLine *Line : Lines) {
2395 requoteJSStringLiteral(Line->Children, Result);
2396 if (!Line->Affected)
2398 for (FormatToken *FormatTok = Line->First; FormatTok;
2399 FormatTok = FormatTok->Next) {
2400 StringRef Input = FormatTok->TokenText;
2401 if (FormatTok->Finalized || !FormatTok->isStringLiteral() ||
2405 !Input.starts_with(
"\"")) ||
2407 !Input.starts_with(
"\'"))) {
2413 SourceLocation Start = FormatTok->Tok.getLocation();
2414 auto Replace = [&](SourceLocation Start,
unsigned Length,
2415 StringRef ReplacementText) {
2416 auto Err = Result.add(tooling::Replacement(
2417 Env.getSourceManager(), Start, Length, ReplacementText));
2421 llvm::errs() <<
toString(std::move(Err)) <<
"\n";
2425 Replace(Start, 1, IsSingle ?
"'" :
"\"");
2426 Replace(FormatTok->Tok.getEndLoc().getLocWithOffset(-1), 1,
2427 IsSingle ?
"'" :
"\"");
2430 bool Escaped =
false;
2431 for (
size_t i = 1; i < Input.size() - 1; i++) {
2434 if (!Escaped && i + 1 < Input.size() &&
2435 ((IsSingle && Input[i + 1] ==
'"') ||
2436 (!IsSingle && Input[i + 1] ==
'\''))) {
2439 Replace(Start.getLocWithOffset(i), 1,
"");
2446 if (!Escaped && IsSingle == (Input[i] ==
'\'')) {
2448 Replace(Start.getLocWithOffset(i), 0,
"\\");
2462class Formatter :
public TokenAnalyzer {
2465 FormattingAttemptStatus *Status)
2466 : TokenAnalyzer(
Env, Style), Status(Status) {}
2468 std::pair<tooling::Replacements, unsigned>
2469 analyze(TokenAnnotator &Annotator,
2470 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2471 FormatTokenLexer &Tokens)
override {
2472 tooling::Replacements Result;
2473 deriveLocalStyle(AnnotatedLines);
2474 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2475 for (AnnotatedLine *Line : AnnotatedLines)
2476 Annotator.calculateFormattingInformation(*Line);
2477 Annotator.setCommentLineLevels(AnnotatedLines);
2479 WhitespaceManager Whitespaces(
2480 Env.getSourceManager(), Style,
2482 ? WhitespaceManager::inputUsesCRLF(
2483 Env.getSourceManager().getBufferData(
Env.getFileID()),
2484 Style.
LineEnding == FormatStyle::LE_DeriveCRLF)
2486 ContinuationIndenter
Indenter(Style, Tokens.getKeywords(),
2487 Env.getSourceManager(), Whitespaces, Encoding,
2488 BinPackInconclusiveFunctions);
2490 UnwrappedLineFormatter(&
Indenter, &Whitespaces, Style,
2491 Tokens.getKeywords(),
Env.getSourceManager(),
2493 .format(AnnotatedLines,
false,
2496 Env.getFirstStartColumn(),
2497 Env.getNextStartColumn(),
2498 Env.getLastStartColumn());
2499 for (
const auto &R : Whitespaces.generateReplacements())
2501 return std::make_pair(Result, 0);
2502 return std::make_pair(Result, Penalty);
2507 hasCpp03IncompatibleFormat(
const SmallVectorImpl<AnnotatedLine *> &Lines) {
2508 for (
const AnnotatedLine *Line : Lines) {
2509 if (hasCpp03IncompatibleFormat(Line->Children))
2511 for (FormatToken *Tok = Line->First->Next; Tok; Tok = Tok->Next) {
2512 if (!Tok->hasWhitespaceBefore()) {
2513 if (Tok->is(tok::coloncolon) && Tok->Previous->is(TT_TemplateOpener))
2515 if (Tok->is(TT_TemplateCloser) &&
2516 Tok->Previous->is(TT_TemplateCloser)) {
2525 int countVariableAlignments(
const SmallVectorImpl<AnnotatedLine *> &Lines) {
2526 int AlignmentDiff = 0;
2527 for (
const AnnotatedLine *Line : Lines) {
2528 AlignmentDiff += countVariableAlignments(Line->Children);
2529 for (FormatToken *Tok = Line->First; Tok && Tok->Next; Tok = Tok->Next) {
2530 if (Tok->isNot(TT_PointerOrReference))
2533 if (
const auto *Prev = Tok->getPreviousNonComment()) {
2534 if (Prev->is(tok::r_paren) && Prev->MatchingParen) {
2535 if (
const auto *Func =
2536 Prev->MatchingParen->getPreviousNonComment()) {
2537 if (
Func->isOneOf(TT_FunctionDeclarationName, TT_StartOfName,
2538 TT_OverloadedOperator)) {
2544 bool SpaceBefore = Tok->hasWhitespaceBefore();
2545 bool SpaceAfter = Tok->Next->hasWhitespaceBefore();
2546 if (SpaceBefore && !SpaceAfter)
2548 if (!SpaceBefore && SpaceAfter)
2552 return AlignmentDiff;
2556 deriveLocalStyle(
const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
2557 bool HasBinPackedFunction =
false;
2558 bool HasOnePerLineFunction =
false;
2559 for (AnnotatedLine *Line : AnnotatedLines) {
2560 if (!Line->First->Next)
2562 FormatToken *Tok = Line->First->Next;
2564 if (Tok->is(PPK_BinPacked))
2565 HasBinPackedFunction =
true;
2566 if (Tok->is(PPK_OnePerLine))
2567 HasOnePerLineFunction =
true;
2573 const auto NetRightCount = countVariableAlignments(AnnotatedLines);
2574 if (NetRightCount > 0)
2576 else if (NetRightCount < 0)
2580 if (Style.
Standard == FormatStyle::LS_Auto) {
2581 Style.
Standard = hasCpp03IncompatibleFormat(AnnotatedLines)
2582 ? FormatStyle::LS_Latest
2583 : FormatStyle::LS_Cpp03;
2585 BinPackInconclusiveFunctions =
2586 HasBinPackedFunction || !HasOnePerLineFunction;
2589 bool BinPackInconclusiveFunctions;
2590 FormattingAttemptStatus *Status;
2604class TrailingCommaInserter :
public TokenAnalyzer {
2606 TrailingCommaInserter(
const Environment &
Env,
const FormatStyle &Style)
2607 : TokenAnalyzer(
Env, Style) {}
2609 std::pair<tooling::Replacements, unsigned>
2610 analyze(TokenAnnotator &Annotator,
2611 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2612 FormatTokenLexer &Tokens)
override {
2613 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2614 tooling::Replacements Result;
2615 insertTrailingCommas(AnnotatedLines, Result);
2622 void insertTrailingCommas(SmallVectorImpl<AnnotatedLine *> &Lines,
2623 tooling::Replacements &Result) {
2624 for (AnnotatedLine *Line : Lines) {
2625 insertTrailingCommas(Line->Children, Result);
2626 if (!Line->Affected)
2628 for (FormatToken *FormatTok = Line->First; FormatTok;
2629 FormatTok = FormatTok->Next) {
2630 if (FormatTok->NewlinesBefore == 0)
2632 FormatToken *Matching = FormatTok->MatchingParen;
2633 if (!Matching || !FormatTok->getPreviousNonComment())
2635 if (!(FormatTok->is(tok::r_square) &&
2636 Matching->is(TT_ArrayInitializerLSquare)) &&
2637 !(FormatTok->is(tok::r_brace) && Matching->is(TT_DictLiteral))) {
2640 FormatToken *Prev = FormatTok->getPreviousNonComment();
2641 if (Prev->is(tok::comma) || Prev->is(tok::semi))
2645 SourceLocation Start =
2646 Prev->Tok.getLocation().getLocWithOffset(Prev->TokenText.size());
2650 unsigned ColumnNumber =
2651 Env.getSourceManager().getSpellingColumnNumber(Start);
2656 cantFail(Result.add(
2657 tooling::Replacement(
Env.getSourceManager(), Start, 0,
",")));
2665class Cleaner :
public TokenAnalyzer {
2668 : TokenAnalyzer(
Env, Style),
2669 DeletedTokens(FormatTokenLess(
Env.getSourceManager())) {}
2672 std::pair<tooling::Replacements, unsigned>
2673 analyze(TokenAnnotator &Annotator,
2674 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2675 FormatTokenLexer &Tokens)
override {
2683 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
2685 checkEmptyNamespace(AnnotatedLines);
2687 for (
auto *Line : AnnotatedLines)
2690 return {generateFixes(), 0};
2694 void cleanupLine(AnnotatedLine *Line) {
2695 for (
auto *Child : Line->Children)
2698 if (Line->Affected) {
2699 cleanupRight(Line->First, tok::comma, tok::comma);
2700 cleanupRight(Line->First, TT_CtorInitializerColon, tok::comma);
2701 cleanupRight(Line->First, tok::l_paren, tok::comma);
2702 cleanupLeft(Line->First, tok::comma, tok::r_paren);
2703 cleanupLeft(Line->First, TT_CtorInitializerComma, tok::l_brace);
2704 cleanupLeft(Line->First, TT_CtorInitializerColon, tok::l_brace);
2705 cleanupLeft(Line->First, TT_CtorInitializerColon, tok::equal);
2709 bool containsOnlyComments(
const AnnotatedLine &Line) {
2710 for (FormatToken *Tok = Line.First; Tok; Tok = Tok->Next)
2711 if (Tok->isNot(tok::comment))
2717 void checkEmptyNamespace(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
2718 std::set<unsigned> DeletedLines;
2719 for (
unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) {
2720 auto &Line = *AnnotatedLines[i];
2721 if (Line.startsWithNamespace())
2722 checkEmptyNamespace(AnnotatedLines, i, i, DeletedLines);
2725 for (
auto Line : DeletedLines) {
2726 FormatToken *Tok = AnnotatedLines[Line]->First;
2738 bool checkEmptyNamespace(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2739 unsigned CurrentLine,
unsigned &
NewLine,
2740 std::set<unsigned> &DeletedLines) {
2741 unsigned InitLine = CurrentLine, End = AnnotatedLines.size();
2746 if (!AnnotatedLines[++CurrentLine]->startsWith(tok::l_brace)) {
2750 }
else if (!AnnotatedLines[CurrentLine]->endsWith(tok::l_brace)) {
2753 while (++CurrentLine < End) {
2754 if (AnnotatedLines[CurrentLine]->startsWith(tok::r_brace))
2757 if (AnnotatedLines[CurrentLine]->startsWithNamespace()) {
2758 if (!checkEmptyNamespace(AnnotatedLines, CurrentLine,
NewLine,
2766 if (containsOnlyComments(*AnnotatedLines[CurrentLine]))
2776 if (CurrentLine >= End)
2780 if (!AffectedRangeMgr.affectsCharSourceRange(CharSourceRange::getCharRange(
2781 AnnotatedLines[InitLine]->First->Tok.getLocation(),
2782 AnnotatedLines[CurrentLine]->Last->Tok.getEndLoc()))) {
2786 for (
unsigned i = InitLine; i <= CurrentLine; ++i)
2787 DeletedLines.insert(i);
2796 template <
typename LeftKind,
typename RightKind>
2797 void cleanupPair(FormatToken *Start, LeftKind LK, RightKind RK,
2799 auto NextNotDeleted = [
this](
const FormatToken &Tok) -> FormatToken * {
2800 for (
auto *Res = Tok.Next; Res; Res = Res->Next) {
2801 if (Res->isNot(tok::comment) &&
2802 DeletedTokens.find(Res) == DeletedTokens.end()) {
2808 for (
auto *Left = Start;
Left;) {
2809 auto *
Right = NextNotDeleted(*Left);
2813 deleteToken(DeleteLeft ? Left : Right);
2814 for (
auto *Tok =
Left->Next; Tok && Tok != Right; Tok = Tok->Next)
2825 template <
typename LeftKind,
typename RightKind>
2826 void cleanupLeft(FormatToken *Start, LeftKind LK, RightKind RK) {
2827 cleanupPair(Start, LK, RK,
true);
2830 template <
typename LeftKind,
typename RightKind>
2831 void cleanupRight(FormatToken *Start, LeftKind LK, RightKind RK) {
2832 cleanupPair(Start, LK, RK,
false);
2836 inline void deleteToken(FormatToken *Tok) {
2838 DeletedTokens.insert(Tok);
2841 tooling::Replacements generateFixes() {
2842 tooling::Replacements Fixes;
2843 SmallVector<FormatToken *> Tokens;
2844 std::copy(DeletedTokens.begin(), DeletedTokens.end(),
2845 std::back_inserter(Tokens));
2851 while (Idx < Tokens.size()) {
2852 unsigned St = Idx, End = Idx;
2853 while ((End + 1) < Tokens.size() && Tokens[End]->Next == Tokens[End + 1])
2855 auto SR = CharSourceRange::getCharRange(Tokens[St]->Tok.getLocation(),
2856 Tokens[End]->Tok.getEndLoc());
2858 Fixes.add(tooling::Replacement(
Env.getSourceManager(), SR,
""));
2862 llvm::errs() <<
toString(std::move(Err)) <<
"\n";
2863 assert(
false &&
"Fixes must not conflict!");
2874 struct FormatTokenLess {
2875 FormatTokenLess(
const SourceManager &
SM) :
SM(
SM) {}
2877 bool operator()(
const FormatToken *LHS,
const FormatToken *RHS)
const {
2878 return SM.isBeforeInTranslationUnit(LHS->Tok.getLocation(),
2879 RHS->Tok.getLocation());
2885 std::set<FormatToken *, FormatTokenLess> DeletedTokens;
2888class ObjCHeaderStyleGuesser :
public TokenAnalyzer {
2890 ObjCHeaderStyleGuesser(
const Environment &
Env,
const FormatStyle &Style)
2891 : TokenAnalyzer(
Env, Style), IsObjC(
false) {}
2893 std::pair<tooling::Replacements, unsigned>
2894 analyze(TokenAnnotator &Annotator,
2895 SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2896 FormatTokenLexer &Tokens)
override {
2897 assert(Style.
Language == FormatStyle::LK_Cpp);
2898 IsObjC = guessIsObjC(
Env.getSourceManager(), AnnotatedLines,
2899 Tokens.getKeywords());
2900 tooling::Replacements Result;
2904 bool isObjC() {
return IsObjC; }
2908 guessIsObjC(
const SourceManager &SourceManager,
2909 const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
2910 const AdditionalKeywords &Keywords) {
2912 static constexpr llvm::StringLiteral FoundationIdentifiers[] = {
2927 "FOUNDATION_EXPORT",
2928 "FOUNDATION_EXTERN",
2929 "NSAffineTransform",
2931 "NSAttributedString",
2950 "NSInvocationOperation",
2954 "NSMutableAttributedString",
2955 "NSMutableCharacterSet",
2957 "NSMutableDictionary",
2958 "NSMutableIndexSet",
2959 "NSMutableOrderedSet",
2963 "NSNumberFormatter",
2967 "NSOperationQueuePriority",
2971 "NSQualityOfService",
2974 "NSRegularExpression",
2985 "NS_ASSUME_NONNULL_BEGIN",
2990 for (
auto *Line : AnnotatedLines) {
2991 if (Line->First && (Line->First->TokenText.starts_with(
"#") ||
2992 Line->First->TokenText ==
"__pragma" ||
2993 Line->First->TokenText ==
"_Pragma")) {
2996 for (
const FormatToken *FormatTok = Line->First; FormatTok;
2997 FormatTok = FormatTok->Next) {
2998 if ((FormatTok->Previous && FormatTok->Previous->is(tok::at) &&
2999 (FormatTok->Tok.getObjCKeywordID() != tok::objc_not_keyword ||
3000 FormatTok->isOneOf(tok::numeric_constant, tok::l_square,
3002 (FormatTok->Tok.isAnyIdentifier() &&
3003 std::binary_search(std::begin(FoundationIdentifiers),
3004 std::end(FoundationIdentifiers),
3005 FormatTok->TokenText)) ||
3006 FormatTok->is(TT_ObjCStringLiteral) ||
3007 FormatTok->isOneOf(Keywords.kw_NS_CLOSED_ENUM, Keywords.kw_NS_ENUM,
3008 Keywords.kw_NS_ERROR_ENUM,
3009 Keywords.kw_NS_OPTIONS, TT_ObjCBlockLBrace,
3010 TT_ObjCBlockLParen, TT_ObjCDecl, TT_ObjCForIn,
3011 TT_ObjCMethodExpr, TT_ObjCMethodSpecifier,
3013 LLVM_DEBUG(llvm::dbgs()
3014 <<
"Detected ObjC at location "
3015 << FormatTok->Tok.getLocation().printToString(
3017 <<
" token: " << FormatTok->TokenText <<
" token type: "
3022 if (guessIsObjC(SourceManager, Line->Children, Keywords))
3039struct JavaImportDirective {
3052 for (
const auto &
Range : Ranges) {
3053 if (
Range.getOffset() < End &&
3054 Range.getOffset() +
Range.getLength() > Start) {
3068static std::pair<unsigned, unsigned>
3072 unsigned OffsetToEOL = 0;
3073 for (
int i = 0, e = Includes.size(); i != e; ++i) {
3074 unsigned Start = Includes[Indices[i]].Offset;
3075 unsigned End = Start + Includes[Indices[i]].Text.size();
3076 if (!(Cursor >= Start && Cursor < End))
3078 CursorIndex = Indices[i];
3079 OffsetToEOL = End - Cursor;
3082 while (--i >= 0 && Includes[CursorIndex].
Text == Includes[Indices[i]].
Text)
3086 return std::make_pair(CursorIndex, OffsetToEOL);
3091 std::string NewCode;
3092 size_t Pos = 0, LastPos = 0;
3095 Pos = Code.find(
"\r\n", LastPos);
3096 if (Pos == LastPos) {
3100 if (Pos == std::string::npos) {
3101 NewCode += Code.substr(LastPos);
3104 NewCode += Code.substr(LastPos, Pos - LastPos) +
"\n";
3106 }
while (Pos != std::string::npos);
3124 const unsigned IncludesBeginOffset = Includes.front().Offset;
3125 const unsigned IncludesEndOffset =
3126 Includes.back().Offset + Includes.back().Text.size();
3127 const unsigned IncludesBlockSize = IncludesEndOffset - IncludesBeginOffset;
3128 if (!
affectsRange(Ranges, IncludesBeginOffset, IncludesEndOffset))
3131 llvm::to_vector<16>(llvm::seq<unsigned>(0, Includes.size()));
3134 stable_sort(Indices, [&](
unsigned LHSI,
unsigned RHSI) {
3135 const auto LHSFilenameLower = Includes[LHSI].Filename.lower();
3136 const auto RHSFilenameLower = Includes[RHSI].Filename.lower();
3137 return std::tie(Includes[LHSI].
Priority, LHSFilenameLower,
3139 std::tie(Includes[RHSI].
Priority, RHSFilenameLower,
3143 stable_sort(Indices, [&](
unsigned LHSI,
unsigned RHSI) {
3151 unsigned CursorIndex;
3153 unsigned CursorToEOLOffset;
3155 std::tie(CursorIndex, CursorToEOLOffset) =
3160 Indices.erase(std::unique(Indices.begin(), Indices.end(),
3161 [&](
unsigned LHSI,
unsigned RHSI) {
3162 return Includes[LHSI].Text.trim() ==
3163 Includes[RHSI].Text.trim();
3167 int CurrentCategory = Includes.front().Category;
3175 if (Indices.size() == Includes.size() && is_sorted(Indices) &&
3180 const auto OldCursor = Cursor ? *Cursor : 0;
3182 for (
unsigned Index : Indices) {
3183 if (!result.empty()) {
3187 CurrentCategory != Includes[Index].Category) {
3191 result += Includes[Index].Text;
3192 if (Cursor && CursorIndex == Index)
3193 *Cursor = IncludesBeginOffset + result.size() - CursorToEOLOffset;
3194 CurrentCategory = Includes[Index].Category;
3197 if (Cursor && *Cursor >= IncludesEndOffset)
3198 *Cursor += result.size() - IncludesBlockSize;
3203 IncludesBeginOffset, IncludesBlockSize)))) {
3205 *Cursor = OldCursor;
3210 FileName, Includes.front().Offset, IncludesBlockSize, result));
3214 llvm::errs() <<
toString(std::move(Err)) <<
"\n";
3224 unsigned Prev = llvm::StringSwitch<size_t>(Code)
3225 .StartsWith(
"\xEF\xBB\xBF", 3)
3227 unsigned SearchFrom = 0;
3239 bool FirstIncludeBlock =
true;
3240 bool MainIncludeFound =
false;
3241 bool FormattingOff =
false;
3244 llvm::Regex RawStringRegex(
3245 "R\"([][A-Za-z0-9_{}#<>%:;.?*+/^&\\$|~!=,'-]*)\\(");
3247 std::string RawStringTermination =
")\"";
3249 for (
const auto Size = Code.size(); SearchFrom < Size;) {
3250 size_t Pos = SearchFrom;
3251 if (Code[SearchFrom] !=
'\n') {
3254 Pos = Code.find(
'\n', Pos);
3255 }
while (Pos != StringRef::npos && Code[Pos - 1] ==
'\\');
3259 Code.substr(Prev, (Pos != StringRef::npos ? Pos : Code.size()) - Prev);
3261 StringRef Trimmed =
Line.trim();
3266 if (RawStringRegex.match(Trimmed, &RawStringMatches)) {
3267 std::string CharSequence = RawStringMatches[1].str();
3268 RawStringTermination =
")" + CharSequence +
"\"";
3269 FormattingOff =
true;
3272 if (Trimmed.contains(RawStringTermination))
3273 FormattingOff =
false;
3275 bool IsBlockComment =
false;
3278 FormattingOff =
true;
3280 FormattingOff =
false;
3281 }
else if (Trimmed.starts_with(
"/*")) {
3282 IsBlockComment =
true;
3283 Pos = Code.find(
"*/", SearchFrom + 2);
3286 const bool EmptyLineSkipped =
3292 bool MergeWithNextLine = Trimmed.ends_with(
"\\");
3293 if (!FormattingOff && !MergeWithNextLine) {
3294 if (!IsBlockComment &&
3296 StringRef IncludeName = Matches[2];
3297 if (Trimmed.contains(
"/*") && !Trimmed.contains(
"*/")) {
3302 Pos = Code.find(
"*/", SearchFrom);
3304 Prev, (Pos != StringRef::npos ? Pos + 2 : Code.size()) - Prev);
3308 !MainIncludeFound && FirstIncludeBlock);
3310 IncludeName, !MainIncludeFound && FirstIncludeBlock);
3312 MainIncludeFound =
true;
3313 IncludesInBlock.push_back(
3315 }
else if (!IncludesInBlock.empty() && !EmptyLineSkipped) {
3318 IncludesInBlock.clear();
3319 if (Trimmed.starts_with(
"#pragma hdrstop"))
3320 FirstIncludeBlock =
true;
3322 FirstIncludeBlock =
false;
3325 if (Pos == StringRef::npos || Pos + 1 == Code.size())
3328 if (!MergeWithNextLine)
3330 SearchFrom = Pos + 1;
3332 if (!IncludesInBlock.empty()) {
3342 StringRef ImportIdentifier) {
3343 unsigned LongestMatchIndex =
UINT_MAX;
3344 unsigned LongestMatchLength = 0;
3347 if (ImportIdentifier.starts_with(GroupPrefix) &&
3348 GroupPrefix.length() > LongestMatchLength) {
3349 LongestMatchIndex = I;
3350 LongestMatchLength = GroupPrefix.length();
3353 return LongestMatchIndex;
3365 unsigned ImportsBeginOffset = Imports.front().Offset;
3366 unsigned ImportsEndOffset =
3367 Imports.back().Offset + Imports.back().Text.size();
3368 unsigned ImportsBlockSize = ImportsEndOffset - ImportsBeginOffset;
3369 if (!
affectsRange(Ranges, ImportsBeginOffset, ImportsEndOffset))
3373 llvm::to_vector<16>(llvm::seq<unsigned>(0, Imports.size()));
3376 for (
const JavaImportDirective &Import : Imports)
3379 bool StaticImportAfterNormalImport =
3381 sort(Indices, [&](
unsigned LHSI,
unsigned RHSI) {
3383 return std::make_tuple(!Imports[LHSI].
IsStatic ^
3384 StaticImportAfterNormalImport,
3386 std::make_tuple(!Imports[RHSI].
IsStatic ^
3387 StaticImportAfterNormalImport,
3392 Indices.erase(std::unique(Indices.begin(), Indices.end(),
3393 [&](
unsigned LHSI,
unsigned RHSI) {
3394 return Imports[LHSI].Text == Imports[RHSI].Text;
3398 bool CurrentIsStatic = Imports[Indices.front()].IsStatic;
3402 for (
unsigned Index : Indices) {
3403 if (!result.empty()) {
3405 if (CurrentIsStatic != Imports[Index].
IsStatic ||
3411 result += CommentLine;
3414 result += Imports[Index].Text;
3415 CurrentIsStatic = Imports[Index].IsStatic;
3422 Imports.front().Offset, ImportsBlockSize)))) {
3427 ImportsBlockSize, result));
3431 llvm::errs() <<
toString(std::move(Err)) <<
"\n";
3438const char JavaImportRegexPattern[] =
3439 "^[\t ]*import[\t ]+(static[\t ]*)?([^\t ]*)[\t ]*;";
3448 unsigned SearchFrom = 0;
3449 llvm::Regex ImportRegex(JavaImportRegexPattern);
3454 bool FormattingOff =
false;
3457 auto Pos = Code.find(
'\n', SearchFrom);
3459 Code.substr(Prev, (Pos != StringRef::npos ? Pos : Code.size()) - Prev);
3461 StringRef Trimmed =
Line.trim();
3463 FormattingOff =
true;
3465 FormattingOff =
false;
3467 if (ImportRegex.match(
Line, &Matches)) {
3468 if (FormattingOff) {
3473 StringRef
Static = Matches[1];
3476 if (
Static.contains(
"static"))
3478 ImportsInBlock.push_back(
3481 }
else if (Trimmed.size() > 0 && !ImportsInBlock.empty()) {
3486 if (Pos == StringRef::npos || Pos + 1 == Code.size())
3488 SearchFrom = Pos + 1;
3490 if (!ImportsInBlock.empty())
3499 return Code.size() > 188 && Code[0] == 0x47 && Code[188] == 0x47;
3502bool isLikelyXml(StringRef Code) {
return Code.ltrim().starts_with(
"<"); }
3506 StringRef
FileName,
unsigned *Cursor) {
3524template <
typename T>
3529 if (Replaces.
empty())
3532 auto NewCode = applyAllReplacements(Code, Replaces);
3534 return NewCode.takeError();
3539 ProcessFunc(Style, *NewCode, ChangedRanges,
FileName);
3541 return Replaces.
merge(FormatReplaces);
3550 std::vector<tooling::Range> Ranges,
3554 auto SortedReplaces =
3556 if (!SortedReplaces)
3557 return SortedReplaces.takeError();
3561 auto Reformat = [](
const FormatStyle &Style, StringRef Code,
3562 std::vector<tooling::Range> Ranges,
3577inline bool isHeaderDeletion(
const tooling::Replacement &Replace) {
3578 return Replace.getOffset() ==
UINT_MAX && Replace.getLength() == 1;
3582tooling::Replacements
3583fixCppIncludeInsertions(StringRef Code,
const tooling::Replacements &Replaces,
3588 tooling::Replacements HeaderInsertions;
3589 std::set<StringRef> HeadersToDelete;
3590 tooling::Replacements
Result;
3591 for (
const auto &R : Replaces) {
3592 if (isHeaderInsertion(R)) {
3595 consumeError(HeaderInsertions.add(R));
3596 }
else if (isHeaderDeletion(R)) {
3597 HeadersToDelete.insert(R.getReplacementText());
3598 }
else if (R.getOffset() ==
UINT_MAX) {
3599 llvm::errs() <<
"Insertions other than header #include insertion are "
3601 << R.getReplacementText() <<
"\n";
3603 consumeError(
Result.add(R));
3606 if (HeaderInsertions.empty() && HeadersToDelete.empty())
3609 StringRef
FileName = Replaces.begin()->getFilePath();
3612 for (
const auto &Header : HeadersToDelete) {
3613 tooling::Replacements Replaces =
3614 Includes.remove(Header.trim(
"\"<>"), Header.starts_with(
"<"));
3615 for (
const auto &R : Replaces) {
3616 auto Err =
Result.add(R);
3619 llvm::errs() <<
"Failed to add header deletion replacement for "
3620 << Header <<
": " <<
toString(std::move(Err)) <<
"\n";
3625 SmallVector<StringRef, 4> Matches;
3626 for (
const auto &R : HeaderInsertions) {
3630 assert(Matched &&
"Header insertion replacement must have replacement text "
3633 auto IncludeName = Matches[2];
3635 Includes.insert(IncludeName.trim(
"\"<>"), IncludeName.starts_with(
"<"),
3638 auto Err =
Result.add(*Replace);
3640 consumeError(std::move(Err));
3641 unsigned NewOffset =
3642 Result.getShiftedCodePosition(Replace->getOffset());
3643 auto Shifted = tooling::Replacement(
FileName, NewOffset, 0,
3644 Replace->getReplacementText());
3654Expected<tooling::Replacements>
3659 auto Cleanup = [](
const FormatStyle &Style, StringRef Code,
3666 fixCppIncludeInsertions(Code, Replaces, Style);
3671std::pair<tooling::Replacements, unsigned>
3674 unsigned NextStartColumn,
unsigned LastStartColumn, StringRef FileName,
3685 case FormatStyle::RCPS_SingleLine:
3686 case FormatStyle::RCPS_WithPreceding:
3702 std::vector<tooling::Range> Ranges(1,
tooling::Range(0, Code.size()));
3703 auto Env = Environment::make(Code,
FileName, Ranges, FirstStartColumn,
3704 NextStartColumn, LastStartColumn);
3709 Formatter(*
Env, Style, Status).process().first;
3711 Replaces = Replaces.
merge(
3714 if (applyAllReplacements(Code, Replaces))
3715 return {Replaces, 0};
3719 auto Env = Environment::make(Code,
FileName, Ranges, FirstStartColumn,
3720 NextStartColumn, LastStartColumn);
3724 typedef std::function<std::pair<tooling::Replacements, unsigned>(
3734 if (Style.
isCpp()) {
3741 Passes.emplace_back([&, S = std::move(S)](
const Environment &
Env) {
3742 return ParensRemover(
Env, S).process(
true);
3748 S.InsertBraces =
true;
3749 Passes.emplace_back([&, S = std::move(S)](
const Environment &
Env) {
3750 return BracesInserter(
Env, S).process(
true);
3756 S.RemoveBracesLLVM =
true;
3757 Passes.emplace_back([&, S = std::move(S)](
const Environment &
Env) {
3758 return BracesRemover(
Env, S).process(
true);
3764 S.RemoveSemicolon =
true;
3765 Passes.emplace_back([&, S = std::move(S)](
const Environment &
Env) {
3766 return SemiRemover(
Env, S).process();
3789 if (Style.
Language == FormatStyle::LK_ObjC &&
3799 return JavaScriptRequoter(
Env, Expanded).process(
true);
3804 return Formatter(
Env, Expanded, Status).process();
3810 return TrailingCommaInserter(
Env, Expanded).process();
3814 std::optional<std::string> CurrentCode;
3816 unsigned Penalty = 0;
3817 for (
size_t I = 0,
E = Passes.size(); I <
E; ++I) {
3818 std::pair<tooling::Replacements, unsigned> PassFixes = Passes[I](*Env);
3819 auto NewCode = applyAllReplacements(
3820 CurrentCode ? StringRef(*CurrentCode) : Code, PassFixes.first);
3822 Fixes = Fixes.
merge(PassFixes.first);
3823 Penalty += PassFixes.second;
3825 CurrentCode = std::move(*NewCode);
3826 Env = Environment::make(
3828 tooling::calculateRangesAfterReplacements(Fixes, Ranges),
3829 FirstStartColumn, NextStartColumn, LastStartColumn);
3842 StringRef OriginalCode = Code.substr(Fix.getOffset(), Fix.getLength());
3843 if (OriginalCode != Fix.getReplacementText()) {
3844 auto Err = NonNoOpFixes.
add(Fix);
3846 llvm::errs() <<
"Error adding replacements : "
3847 <<
toString(std::move(Err)) <<
"\n";
3851 Fixes = std::move(NonNoOpFixes);
3854 return {Fixes, Penalty};
3878 return Cleaner(*
Env, Style).process().first;
3883 StringRef
FileName,
bool *IncompleteFormat) {
3886 if (!Status.FormatComplete)
3887 *IncompleteFormat =
true;
3919 LangOpts.CPlusPlus = 1;
3930 LangOpts.LineComment = 1;
3931 LangOpts.CXXOperatorNames = Style.
isCpp();
3934 LangOpts.MicrosoftExt = 1;
3935 LangOpts.DeclSpecKeyword = 1;
3941 "Set coding style. <string> can be:\n"
3942 "1. A preset: LLVM, GNU, Google, Chromium, Microsoft,\n"
3943 " Mozilla, WebKit.\n"
3944 "2. 'file' to load style configuration from a\n"
3945 " .clang-format file in one of the parent directories\n"
3946 " of the source file (for stdin, see --assume-filename).\n"
3947 " If no .clang-format file is found, falls back to\n"
3948 " --fallback-style.\n"
3949 " --style=file is the default.\n"
3950 "3. 'file:<format_file_path>' to explicitly specify\n"
3951 " the configuration file.\n"
3952 "4. \"{key: value, ...}\" to set specific parameters, e.g.:\n"
3953 " --style=\"{BasedOnStyle: llvm, IndentWidth: 8}\"";
3958 if (
FileName.ends_with_insensitive(
".js") ||
3959 FileName.ends_with_insensitive(
".mjs") ||
3960 FileName.ends_with_insensitive(
".cjs") ||
3961 FileName.ends_with_insensitive(
".ts")) {
3966 if (
FileName.ends_with_insensitive(
".proto") ||
3967 FileName.ends_with_insensitive(
".protodevel")) {
3973 if (
FileName.ends_with_insensitive(
".txtpb") ||
3974 FileName.ends_with_insensitive(
".textpb") ||
3975 FileName.ends_with_insensitive(
".pb.txt") ||
3976 FileName.ends_with_insensitive(
".textproto") ||
3977 FileName.ends_with_insensitive(
".asciipb")) {
3980 if (
FileName.ends_with_insensitive(
".td"))
3982 if (
FileName.ends_with_insensitive(
".cs"))
3984 if (
FileName.ends_with_insensitive(
".json"))
3986 if (
FileName.ends_with_insensitive(
".sv") ||
3987 FileName.ends_with_insensitive(
".svh") ||
3988 FileName.ends_with_insensitive(
".v") ||
3989 FileName.ends_with_insensitive(
".vh")) {
3998 auto Extension = llvm::sys::path::extension(
FileName);
4001 if (!Code.empty() && (Extension.empty() || Extension ==
".h")) {
4006 if (Guesser.isObjC())
4010 return GuessedLanguage;
4018llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
4021 llvm::SourceMgr::DiagHandlerTy DiagHandler) {
4022 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
Text =
4023 FS->getBufferForFile(ConfigFile.str());
4024 if (
auto EC =
Text.getError())
4034 StringRef FallbackStyleName, StringRef Code,
4035 llvm::vfs::FileSystem *FS,
4036 bool AllowUnknownOptions,
4037 llvm::SourceMgr::DiagHandlerTy DiagHandler) {
4045 if (StyleName.starts_with(
"{")) {
4047 StringRef Source =
"<command-line>";
4048 if (std::error_code ec =
4050 AllowUnknownOptions, DiagHandler)) {
4057 ChildFormatTextToApply.emplace_back(
4058 llvm::MemoryBuffer::getMemBuffer(StyleName, Source,
false));
4062 FS = llvm::vfs::getRealFileSystem().get();
4067 StyleName.starts_with_insensitive(
"file:")) {
4068 auto ConfigFile = StyleName.substr(5);
4069 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
Text =
4072 if (
auto EC =
Text.getError()) {
4077 LLVM_DEBUG(llvm::dbgs()
4078 <<
"Using configuration file " << ConfigFile <<
"\n");
4086 ChildFormatTextToApply.emplace_back(std::move(*
Text));
4100 if (std::error_code EC = FS->makeAbsolute(
Path))
4106 auto dropDiagnosticHandler = [](
const llvm::SMDiagnostic &,
void *) {};
4108 auto applyChildFormatTexts = [&](
FormatStyle *Style) {
4109 for (
const auto &MemBuf : llvm::reverse(ChildFormatTextToApply)) {
4112 DiagHandler ? DiagHandler : dropDiagnosticHandler);
4115 static_cast<void>(EC);
4121 FilesToLookFor.push_back(
".clang-format");
4122 FilesToLookFor.push_back(
"_clang-format");
4125 for (StringRef Directory =
Path; !Directory.empty();
4126 Directory = llvm::sys::path::parent_path(Directory)) {
4127 auto Status = FS->status(Directory);
4129 Status->getType() != llvm::sys::fs::file_type::directory_file) {
4133 for (
const auto &F : FilesToLookFor) {
4136 llvm::sys::path::append(ConfigFile, F);
4137 LLVM_DEBUG(llvm::dbgs() <<
"Trying " << ConfigFile <<
"...\n");
4139 Status = FS->status(ConfigFile);
4141 Status->getType() != llvm::sys::fs::file_type::regular_file) {
4145 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
Text =
4148 if (
auto EC =
Text.getError()) {
4153 if (!UnsuitableConfigFiles.empty())
4154 UnsuitableConfigFiles.append(
", ");
4155 UnsuitableConfigFiles.append(ConfigFile);
4159 LLVM_DEBUG(llvm::dbgs()
4160 <<
"Using configuration file " << ConfigFile <<
"\n");
4163 if (!ChildFormatTextToApply.empty()) {
4164 LLVM_DEBUG(llvm::dbgs() <<
"Applying child configurations\n");
4165 applyChildFormatTexts(&Style);
4170 LLVM_DEBUG(llvm::dbgs() <<
"Inherits parent configuration\n");
4175 ChildFormatTextToApply.emplace_back(std::move(*
Text));
4185 if (!UnsuitableConfigFiles.empty()) {
4188 UnsuitableConfigFiles);
4191 if (!ChildFormatTextToApply.empty()) {
4192 LLVM_DEBUG(llvm::dbgs()
4193 <<
"Applying child configurations on fallback style\n");
4194 applyChildFormatTexts(&FallbackStyle);
4197 return FallbackStyle;
4201 if (Comment == (On ?
"/* clang-format on */" :
"/* clang-format off */"))
4204 static const char ClangFormatOn[] =
"// clang-format on";
4205 static const char ClangFormatOff[] =
"// clang-format off";
4206 const unsigned Size = (On ?
sizeof ClangFormatOn :
sizeof ClangFormatOff) - 1;
4208 return Comment.starts_with(On ? ClangFormatOn : ClangFormatOff) &&
4209 (Comment.size() == Size || Comment[Size] ==
':');
This file declares DefinitionBlockSeparator, a TokenAnalyzer that inserts or removes empty lines sepa...
This file declares IntegerLiteralSeparatorFixer that fixes C++ integer literal separators.
This file declares ObjCPropertyAttributeOrderFixer, a TokenAnalyzer that adjusts the order of attribu...
This file declares QualifierAlignmentFixer, a TokenAnalyzer that enforces either east or west const d...
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file implements a sorter for JavaScript ES6 imports.
This file declares UsingDeclarationsSorter, a TokenAnalyzer that sorts consecutive using declarations...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
bool isObjC(ID Id)
isObjC - Is this an "ObjC" input (Obj-C and Obj-C++ sources and headers).
The JSON file list parser is used to communicate input to InstallAPI.
Language
The language for the input, used to select and validate the language standard and possible actions.
@ Result
The result type of a method or function.
const FunctionProtoType * T
Diagnostic wrappers for TextAPI types for error reporting.
static void enumeration(IO &IO, FormatStyle::IndentExternBlockStyle &Value)
static void enumeration(IO &IO, FormatStyle::LambdaBodyIndentationKind &Value)