1 //===--- Format.cpp - Format C++ code -------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file implements functions declared in Format.h. This will be
12 /// split into separate files as we go.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #include "clang/Format/Format.h"
17 #include "AffectedRangeManager.h"
18 #include "ContinuationIndenter.h"
19 #include "FormatTokenLexer.h"
20 #include "NamespaceEndCommentsFixer.h"
21 #include "SortJavaScriptImports.h"
22 #include "TokenAnalyzer.h"
23 #include "TokenAnnotator.h"
24 #include "UnwrappedLineFormatter.h"
25 #include "UnwrappedLineParser.h"
26 #include "UsingDeclarationsSorter.h"
27 #include "WhitespaceManager.h"
28 #include "clang/Basic/Diagnostic.h"
29 #include "clang/Basic/DiagnosticOptions.h"
30 #include "clang/Basic/SourceManager.h"
31 #include "clang/Basic/VirtualFileSystem.h"
32 #include "clang/Lex/Lexer.h"
33 #include "llvm/ADT/STLExtras.h"
34 #include "llvm/Support/Allocator.h"
35 #include "llvm/Support/Debug.h"
36 #include "llvm/Support/Path.h"
37 #include "llvm/Support/Regex.h"
38 #include "llvm/Support/YAMLTraits.h"
39 #include <algorithm>
40 #include <memory>
41 #include <string>
42 
43 #define DEBUG_TYPE "format-formatter"
44 
45 using clang::format::FormatStyle;
46 
47 LLVM_YAML_IS_SEQUENCE_VECTOR(clang::format::FormatStyle::IncludeCategory)
48 
49 namespace llvm {
50 namespace yaml {
51 template <> struct ScalarEnumerationTraits<FormatStyle::LanguageKind> {
52   static void enumeration(IO &IO, FormatStyle::LanguageKind &Value) {
53     IO.enumCase(Value, "Cpp", FormatStyle::LK_Cpp);
54     IO.enumCase(Value, "Java", FormatStyle::LK_Java);
55     IO.enumCase(Value, "JavaScript", FormatStyle::LK_JavaScript);
56     IO.enumCase(Value, "ObjC", FormatStyle::LK_ObjC);
57     IO.enumCase(Value, "Proto", FormatStyle::LK_Proto);
58     IO.enumCase(Value, "TableGen", FormatStyle::LK_TableGen);
59   }
60 };
61 
62 template <> struct ScalarEnumerationTraits<FormatStyle::LanguageStandard> {
63   static void enumeration(IO &IO, FormatStyle::LanguageStandard &Value) {
64     IO.enumCase(Value, "Cpp03", FormatStyle::LS_Cpp03);
65     IO.enumCase(Value, "C++03", FormatStyle::LS_Cpp03);
66     IO.enumCase(Value, "Cpp11", FormatStyle::LS_Cpp11);
67     IO.enumCase(Value, "C++11", FormatStyle::LS_Cpp11);
68     IO.enumCase(Value, "Auto", FormatStyle::LS_Auto);
69   }
70 };
71 
72 template <> struct ScalarEnumerationTraits<FormatStyle::UseTabStyle> {
73   static void enumeration(IO &IO, FormatStyle::UseTabStyle &Value) {
74     IO.enumCase(Value, "Never", FormatStyle::UT_Never);
75     IO.enumCase(Value, "false", FormatStyle::UT_Never);
76     IO.enumCase(Value, "Always", FormatStyle::UT_Always);
77     IO.enumCase(Value, "true", FormatStyle::UT_Always);
78     IO.enumCase(Value, "ForIndentation", FormatStyle::UT_ForIndentation);
79     IO.enumCase(Value, "ForContinuationAndIndentation",
80                 FormatStyle::UT_ForContinuationAndIndentation);
81   }
82 };
83 
84 template <> struct ScalarEnumerationTraits<FormatStyle::JavaScriptQuoteStyle> {
85   static void enumeration(IO &IO, FormatStyle::JavaScriptQuoteStyle &Value) {
86     IO.enumCase(Value, "Leave", FormatStyle::JSQS_Leave);
87     IO.enumCase(Value, "Single", FormatStyle::JSQS_Single);
88     IO.enumCase(Value, "Double", FormatStyle::JSQS_Double);
89   }
90 };
91 
92 template <> struct ScalarEnumerationTraits<FormatStyle::ShortFunctionStyle> {
93   static void enumeration(IO &IO, FormatStyle::ShortFunctionStyle &Value) {
94     IO.enumCase(Value, "None", FormatStyle::SFS_None);
95     IO.enumCase(Value, "false", FormatStyle::SFS_None);
96     IO.enumCase(Value, "All", FormatStyle::SFS_All);
97     IO.enumCase(Value, "true", FormatStyle::SFS_All);
98     IO.enumCase(Value, "Inline", FormatStyle::SFS_Inline);
99     IO.enumCase(Value, "InlineOnly", FormatStyle::SFS_InlineOnly);
100     IO.enumCase(Value, "Empty", FormatStyle::SFS_Empty);
101   }
102 };
103 
104 template <> struct ScalarEnumerationTraits<FormatStyle::BinaryOperatorStyle> {
105   static void enumeration(IO &IO, FormatStyle::BinaryOperatorStyle &Value) {
106     IO.enumCase(Value, "All", FormatStyle::BOS_All);
107     IO.enumCase(Value, "true", FormatStyle::BOS_All);
108     IO.enumCase(Value, "None", FormatStyle::BOS_None);
109     IO.enumCase(Value, "false", FormatStyle::BOS_None);
110     IO.enumCase(Value, "NonAssignment", FormatStyle::BOS_NonAssignment);
111   }
112 };
113 
114 template <> struct ScalarEnumerationTraits<FormatStyle::BraceBreakingStyle> {
115   static void enumeration(IO &IO, FormatStyle::BraceBreakingStyle &Value) {
116     IO.enumCase(Value, "Attach", FormatStyle::BS_Attach);
117     IO.enumCase(Value, "Linux", FormatStyle::BS_Linux);
118     IO.enumCase(Value, "Mozilla", FormatStyle::BS_Mozilla);
119     IO.enumCase(Value, "Stroustrup", FormatStyle::BS_Stroustrup);
120     IO.enumCase(Value, "Allman", FormatStyle::BS_Allman);
121     IO.enumCase(Value, "GNU", FormatStyle::BS_GNU);
122     IO.enumCase(Value, "WebKit", FormatStyle::BS_WebKit);
123     IO.enumCase(Value, "Custom", FormatStyle::BS_Custom);
124   }
125 };
126 
127 template <> struct ScalarEnumerationTraits<FormatStyle::BreakConstructorInitializersStyle> {
128   static void enumeration(IO &IO, FormatStyle::BreakConstructorInitializersStyle &Value) {
129     IO.enumCase(Value, "BeforeColon", FormatStyle::BCIS_BeforeColon);
130     IO.enumCase(Value, "BeforeComma", FormatStyle::BCIS_BeforeComma);
131     IO.enumCase(Value, "AfterColon", FormatStyle::BCIS_AfterColon);
132   }
133 };
134 
135 template <>
136 struct ScalarEnumerationTraits<FormatStyle::ReturnTypeBreakingStyle> {
137   static void enumeration(IO &IO, FormatStyle::ReturnTypeBreakingStyle &Value) {
138     IO.enumCase(Value, "None", FormatStyle::RTBS_None);
139     IO.enumCase(Value, "All", FormatStyle::RTBS_All);
140     IO.enumCase(Value, "TopLevel", FormatStyle::RTBS_TopLevel);
141     IO.enumCase(Value, "TopLevelDefinitions",
142                 FormatStyle::RTBS_TopLevelDefinitions);
143     IO.enumCase(Value, "AllDefinitions", FormatStyle::RTBS_AllDefinitions);
144   }
145 };
146 
147 template <>
148 struct ScalarEnumerationTraits<FormatStyle::DefinitionReturnTypeBreakingStyle> {
149   static void
150   enumeration(IO &IO, FormatStyle::DefinitionReturnTypeBreakingStyle &Value) {
151     IO.enumCase(Value, "None", FormatStyle::DRTBS_None);
152     IO.enumCase(Value, "All", FormatStyle::DRTBS_All);
153     IO.enumCase(Value, "TopLevel", FormatStyle::DRTBS_TopLevel);
154 
155     // For backward compatibility.
156     IO.enumCase(Value, "false", FormatStyle::DRTBS_None);
157     IO.enumCase(Value, "true", FormatStyle::DRTBS_All);
158   }
159 };
160 
161 template <>
162 struct ScalarEnumerationTraits<FormatStyle::NamespaceIndentationKind> {
163   static void enumeration(IO &IO,
164                           FormatStyle::NamespaceIndentationKind &Value) {
165     IO.enumCase(Value, "None", FormatStyle::NI_None);
166     IO.enumCase(Value, "Inner", FormatStyle::NI_Inner);
167     IO.enumCase(Value, "All", FormatStyle::NI_All);
168   }
169 };
170 
171 template <> struct ScalarEnumerationTraits<FormatStyle::BracketAlignmentStyle> {
172   static void enumeration(IO &IO, FormatStyle::BracketAlignmentStyle &Value) {
173     IO.enumCase(Value, "Align", FormatStyle::BAS_Align);
174     IO.enumCase(Value, "DontAlign", FormatStyle::BAS_DontAlign);
175     IO.enumCase(Value, "AlwaysBreak", FormatStyle::BAS_AlwaysBreak);
176 
177     // For backward compatibility.
178     IO.enumCase(Value, "true", FormatStyle::BAS_Align);
179     IO.enumCase(Value, "false", FormatStyle::BAS_DontAlign);
180   }
181 };
182 
183 template <> struct ScalarEnumerationTraits<FormatStyle::EscapedNewlineAlignmentStyle> {
184   static void enumeration(IO &IO, FormatStyle::EscapedNewlineAlignmentStyle &Value) {
185     IO.enumCase(Value, "DontAlign", FormatStyle::ENAS_DontAlign);
186     IO.enumCase(Value, "Left", FormatStyle::ENAS_Left);
187     IO.enumCase(Value, "Right", FormatStyle::ENAS_Right);
188 
189     // For backward compatibility.
190     IO.enumCase(Value, "true", FormatStyle::ENAS_Left);
191     IO.enumCase(Value, "false", FormatStyle::ENAS_Right);
192   }
193 };
194 
195 template <> struct ScalarEnumerationTraits<FormatStyle::PointerAlignmentStyle> {
196   static void enumeration(IO &IO, FormatStyle::PointerAlignmentStyle &Value) {
197     IO.enumCase(Value, "Middle", FormatStyle::PAS_Middle);
198     IO.enumCase(Value, "Left", FormatStyle::PAS_Left);
199     IO.enumCase(Value, "Right", FormatStyle::PAS_Right);
200 
201     // For backward compatibility.
202     IO.enumCase(Value, "true", FormatStyle::PAS_Left);
203     IO.enumCase(Value, "false", FormatStyle::PAS_Right);
204   }
205 };
206 
207 template <>
208 struct ScalarEnumerationTraits<FormatStyle::SpaceBeforeParensOptions> {
209   static void enumeration(IO &IO,
210                           FormatStyle::SpaceBeforeParensOptions &Value) {
211     IO.enumCase(Value, "Never", FormatStyle::SBPO_Never);
212     IO.enumCase(Value, "ControlStatements",
213                 FormatStyle::SBPO_ControlStatements);
214     IO.enumCase(Value, "Always", FormatStyle::SBPO_Always);
215 
216     // For backward compatibility.
217     IO.enumCase(Value, "false", FormatStyle::SBPO_Never);
218     IO.enumCase(Value, "true", FormatStyle::SBPO_ControlStatements);
219   }
220 };
221 
222 template <> struct MappingTraits<FormatStyle> {
223   static void mapping(IO &IO, FormatStyle &Style) {
224     // When reading, read the language first, we need it for getPredefinedStyle.
225     IO.mapOptional("Language", Style.Language);
226 
227     if (IO.outputting()) {
228       StringRef StylesArray[] = {"LLVM",    "Google", "Chromium",
229                                  "Mozilla", "WebKit", "GNU"};
230       ArrayRef<StringRef> Styles(StylesArray);
231       for (size_t i = 0, e = Styles.size(); i < e; ++i) {
232         StringRef StyleName(Styles[i]);
233         FormatStyle PredefinedStyle;
234         if (getPredefinedStyle(StyleName, Style.Language, &PredefinedStyle) &&
235             Style == PredefinedStyle) {
236           IO.mapOptional("# BasedOnStyle", StyleName);
237           break;
238         }
239       }
240     } else {
241       StringRef BasedOnStyle;
242       IO.mapOptional("BasedOnStyle", BasedOnStyle);
243       if (!BasedOnStyle.empty()) {
244         FormatStyle::LanguageKind OldLanguage = Style.Language;
245         FormatStyle::LanguageKind Language =
246             ((FormatStyle *)IO.getContext())->Language;
247         if (!getPredefinedStyle(BasedOnStyle, Language, &Style)) {
248           IO.setError(Twine("Unknown value for BasedOnStyle: ", BasedOnStyle));
249           return;
250         }
251         Style.Language = OldLanguage;
252       }
253     }
254 
255     // For backward compatibility.
256     if (!IO.outputting()) {
257       IO.mapOptional("AlignEscapedNewlinesLeft", Style.AlignEscapedNewlines);
258       IO.mapOptional("DerivePointerBinding", Style.DerivePointerAlignment);
259       IO.mapOptional("IndentFunctionDeclarationAfterType",
260                      Style.IndentWrappedFunctionNames);
261       IO.mapOptional("PointerBindsToType", Style.PointerAlignment);
262       IO.mapOptional("SpaceAfterControlStatementKeyword",
263                      Style.SpaceBeforeParens);
264     }
265 
266     IO.mapOptional("AccessModifierOffset", Style.AccessModifierOffset);
267     IO.mapOptional("AlignAfterOpenBracket", Style.AlignAfterOpenBracket);
268     IO.mapOptional("AlignConsecutiveAssignments",
269                    Style.AlignConsecutiveAssignments);
270     IO.mapOptional("AlignConsecutiveDeclarations",
271                    Style.AlignConsecutiveDeclarations);
272     IO.mapOptional("AlignEscapedNewlines", Style.AlignEscapedNewlines);
273     IO.mapOptional("AlignOperands", Style.AlignOperands);
274     IO.mapOptional("AlignTrailingComments", Style.AlignTrailingComments);
275     IO.mapOptional("AllowAllParametersOfDeclarationOnNextLine",
276                    Style.AllowAllParametersOfDeclarationOnNextLine);
277     IO.mapOptional("AllowShortBlocksOnASingleLine",
278                    Style.AllowShortBlocksOnASingleLine);
279     IO.mapOptional("AllowShortCaseLabelsOnASingleLine",
280                    Style.AllowShortCaseLabelsOnASingleLine);
281     IO.mapOptional("AllowShortFunctionsOnASingleLine",
282                    Style.AllowShortFunctionsOnASingleLine);
283     IO.mapOptional("AllowShortIfStatementsOnASingleLine",
284                    Style.AllowShortIfStatementsOnASingleLine);
285     IO.mapOptional("AllowShortLoopsOnASingleLine",
286                    Style.AllowShortLoopsOnASingleLine);
287     IO.mapOptional("AlwaysBreakAfterDefinitionReturnType",
288                    Style.AlwaysBreakAfterDefinitionReturnType);
289     IO.mapOptional("AlwaysBreakAfterReturnType",
290                    Style.AlwaysBreakAfterReturnType);
291     // If AlwaysBreakAfterDefinitionReturnType was specified but
292     // AlwaysBreakAfterReturnType was not, initialize the latter from the
293     // former for backwards compatibility.
294     if (Style.AlwaysBreakAfterDefinitionReturnType != FormatStyle::DRTBS_None &&
295         Style.AlwaysBreakAfterReturnType == FormatStyle::RTBS_None) {
296       if (Style.AlwaysBreakAfterDefinitionReturnType == FormatStyle::DRTBS_All)
297         Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
298       else if (Style.AlwaysBreakAfterDefinitionReturnType ==
299                FormatStyle::DRTBS_TopLevel)
300         Style.AlwaysBreakAfterReturnType =
301             FormatStyle::RTBS_TopLevelDefinitions;
302     }
303 
304     IO.mapOptional("AlwaysBreakBeforeMultilineStrings",
305                    Style.AlwaysBreakBeforeMultilineStrings);
306     IO.mapOptional("AlwaysBreakTemplateDeclarations",
307                    Style.AlwaysBreakTemplateDeclarations);
308     IO.mapOptional("BinPackArguments", Style.BinPackArguments);
309     IO.mapOptional("BinPackParameters", Style.BinPackParameters);
310     IO.mapOptional("BraceWrapping", Style.BraceWrapping);
311     IO.mapOptional("BreakBeforeBinaryOperators",
312                    Style.BreakBeforeBinaryOperators);
313     IO.mapOptional("BreakBeforeBraces", Style.BreakBeforeBraces);
314     IO.mapOptional("BreakBeforeInheritanceComma",
315                    Style.BreakBeforeInheritanceComma);
316     IO.mapOptional("BreakBeforeTernaryOperators",
317                    Style.BreakBeforeTernaryOperators);
318 
319     bool BreakConstructorInitializersBeforeComma = false;
320     IO.mapOptional("BreakConstructorInitializersBeforeComma",
321                    BreakConstructorInitializersBeforeComma);
322     IO.mapOptional("BreakConstructorInitializers",
323                    Style.BreakConstructorInitializers);
324     // If BreakConstructorInitializersBeforeComma was specified but
325     // BreakConstructorInitializers was not, initialize the latter from the
326     // former for backwards compatibility.
327     if (BreakConstructorInitializersBeforeComma &&
328         Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeColon)
329       Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
330 
331     IO.mapOptional("BreakAfterJavaFieldAnnotations",
332                    Style.BreakAfterJavaFieldAnnotations);
333     IO.mapOptional("BreakStringLiterals", Style.BreakStringLiterals);
334     IO.mapOptional("ColumnLimit", Style.ColumnLimit);
335     IO.mapOptional("CommentPragmas", Style.CommentPragmas);
336     IO.mapOptional("CompactNamespaces", Style.CompactNamespaces);
337     IO.mapOptional("ConstructorInitializerAllOnOneLineOrOnePerLine",
338                    Style.ConstructorInitializerAllOnOneLineOrOnePerLine);
339     IO.mapOptional("ConstructorInitializerIndentWidth",
340                    Style.ConstructorInitializerIndentWidth);
341     IO.mapOptional("ContinuationIndentWidth", Style.ContinuationIndentWidth);
342     IO.mapOptional("Cpp11BracedListStyle", Style.Cpp11BracedListStyle);
343     IO.mapOptional("DerivePointerAlignment", Style.DerivePointerAlignment);
344     IO.mapOptional("DisableFormat", Style.DisableFormat);
345     IO.mapOptional("ExperimentalAutoDetectBinPacking",
346                    Style.ExperimentalAutoDetectBinPacking);
347     IO.mapOptional("FixNamespaceComments", Style.FixNamespaceComments);
348     IO.mapOptional("ForEachMacros", Style.ForEachMacros);
349     IO.mapOptional("IncludeCategories", Style.IncludeCategories);
350     IO.mapOptional("IncludeIsMainRegex", Style.IncludeIsMainRegex);
351     IO.mapOptional("IndentCaseLabels", Style.IndentCaseLabels);
352     IO.mapOptional("IndentWidth", Style.IndentWidth);
353     IO.mapOptional("IndentWrappedFunctionNames",
354                    Style.IndentWrappedFunctionNames);
355     IO.mapOptional("JavaScriptQuotes", Style.JavaScriptQuotes);
356     IO.mapOptional("JavaScriptWrapImports", Style.JavaScriptWrapImports);
357     IO.mapOptional("KeepEmptyLinesAtTheStartOfBlocks",
358                    Style.KeepEmptyLinesAtTheStartOfBlocks);
359     IO.mapOptional("MacroBlockBegin", Style.MacroBlockBegin);
360     IO.mapOptional("MacroBlockEnd", Style.MacroBlockEnd);
361     IO.mapOptional("MaxEmptyLinesToKeep", Style.MaxEmptyLinesToKeep);
362     IO.mapOptional("NamespaceIndentation", Style.NamespaceIndentation);
363     IO.mapOptional("ObjCBlockIndentWidth", Style.ObjCBlockIndentWidth);
364     IO.mapOptional("ObjCSpaceAfterProperty", Style.ObjCSpaceAfterProperty);
365     IO.mapOptional("ObjCSpaceBeforeProtocolList",
366                    Style.ObjCSpaceBeforeProtocolList);
367     IO.mapOptional("PenaltyBreakAssignment",
368                    Style.PenaltyBreakAssignment);
369     IO.mapOptional("PenaltyBreakBeforeFirstCallParameter",
370                    Style.PenaltyBreakBeforeFirstCallParameter);
371     IO.mapOptional("PenaltyBreakComment", Style.PenaltyBreakComment);
372     IO.mapOptional("PenaltyBreakFirstLessLess",
373                    Style.PenaltyBreakFirstLessLess);
374     IO.mapOptional("PenaltyBreakString", Style.PenaltyBreakString);
375     IO.mapOptional("PenaltyExcessCharacter", Style.PenaltyExcessCharacter);
376     IO.mapOptional("PenaltyReturnTypeOnItsOwnLine",
377                    Style.PenaltyReturnTypeOnItsOwnLine);
378     IO.mapOptional("PointerAlignment", Style.PointerAlignment);
379     IO.mapOptional("ReflowComments", Style.ReflowComments);
380     IO.mapOptional("SortIncludes", Style.SortIncludes);
381     IO.mapOptional("SortUsingDeclarations", Style.SortUsingDeclarations);
382     IO.mapOptional("SpaceAfterCStyleCast", Style.SpaceAfterCStyleCast);
383     IO.mapOptional("SpaceAfterTemplateKeyword", Style.SpaceAfterTemplateKeyword);
384     IO.mapOptional("SpaceBeforeAssignmentOperators",
385                    Style.SpaceBeforeAssignmentOperators);
386     IO.mapOptional("SpaceBeforeParens", Style.SpaceBeforeParens);
387     IO.mapOptional("SpaceInEmptyParentheses", Style.SpaceInEmptyParentheses);
388     IO.mapOptional("SpacesBeforeTrailingComments",
389                    Style.SpacesBeforeTrailingComments);
390     IO.mapOptional("SpacesInAngles", Style.SpacesInAngles);
391     IO.mapOptional("SpacesInContainerLiterals",
392                    Style.SpacesInContainerLiterals);
393     IO.mapOptional("SpacesInCStyleCastParentheses",
394                    Style.SpacesInCStyleCastParentheses);
395     IO.mapOptional("SpacesInParentheses", Style.SpacesInParentheses);
396     IO.mapOptional("SpacesInSquareBrackets", Style.SpacesInSquareBrackets);
397     IO.mapOptional("Standard", Style.Standard);
398     IO.mapOptional("TabWidth", Style.TabWidth);
399     IO.mapOptional("UseTab", Style.UseTab);
400   }
401 };
402 
403 template <> struct MappingTraits<FormatStyle::BraceWrappingFlags> {
404   static void mapping(IO &IO, FormatStyle::BraceWrappingFlags &Wrapping) {
405     IO.mapOptional("AfterClass", Wrapping.AfterClass);
406     IO.mapOptional("AfterControlStatement", Wrapping.AfterControlStatement);
407     IO.mapOptional("AfterEnum", Wrapping.AfterEnum);
408     IO.mapOptional("AfterFunction", Wrapping.AfterFunction);
409     IO.mapOptional("AfterNamespace", Wrapping.AfterNamespace);
410     IO.mapOptional("AfterObjCDeclaration", Wrapping.AfterObjCDeclaration);
411     IO.mapOptional("AfterStruct", Wrapping.AfterStruct);
412     IO.mapOptional("AfterUnion", Wrapping.AfterUnion);
413     IO.mapOptional("BeforeCatch", Wrapping.BeforeCatch);
414     IO.mapOptional("BeforeElse", Wrapping.BeforeElse);
415     IO.mapOptional("IndentBraces", Wrapping.IndentBraces);
416     IO.mapOptional("SplitEmptyFunction", Wrapping.SplitEmptyFunction);
417     IO.mapOptional("SplitEmptyRecord", Wrapping.SplitEmptyRecord);
418     IO.mapOptional("SplitEmptyNamespace", Wrapping.SplitEmptyNamespace);
419   }
420 };
421 
422 template <> struct MappingTraits<FormatStyle::IncludeCategory> {
423   static void mapping(IO &IO, FormatStyle::IncludeCategory &Category) {
424     IO.mapOptional("Regex", Category.Regex);
425     IO.mapOptional("Priority", Category.Priority);
426   }
427 };
428 
429 // Allows to read vector<FormatStyle> while keeping default values.
430 // IO.getContext() should contain a pointer to the FormatStyle structure, that
431 // will be used to get default values for missing keys.
432 // If the first element has no Language specified, it will be treated as the
433 // default one for the following elements.
434 template <> struct DocumentListTraits<std::vector<FormatStyle>> {
435   static size_t size(IO &IO, std::vector<FormatStyle> &Seq) {
436     return Seq.size();
437   }
438   static FormatStyle &element(IO &IO, std::vector<FormatStyle> &Seq,
439                               size_t Index) {
440     if (Index >= Seq.size()) {
441       assert(Index == Seq.size());
442       FormatStyle Template;
443       if (Seq.size() > 0 && Seq[0].Language == FormatStyle::LK_None) {
444         Template = Seq[0];
445       } else {
446         Template = *((const FormatStyle *)IO.getContext());
447         Template.Language = FormatStyle::LK_None;
448       }
449       Seq.resize(Index + 1, Template);
450     }
451     return Seq[Index];
452   }
453 };
454 } // namespace yaml
455 } // namespace llvm
456 
457 namespace clang {
458 namespace format {
459 
460 const std::error_category &getParseCategory() {
461   static ParseErrorCategory C;
462   return C;
463 }
464 std::error_code make_error_code(ParseError e) {
465   return std::error_code(static_cast<int>(e), getParseCategory());
466 }
467 
468 inline llvm::Error make_string_error(const llvm::Twine &Message) {
469   return llvm::make_error<llvm::StringError>(Message,
470                                              llvm::inconvertibleErrorCode());
471 }
472 
473 const char *ParseErrorCategory::name() const noexcept {
474   return "clang-format.parse_error";
475 }
476 
477 std::string ParseErrorCategory::message(int EV) const {
478   switch (static_cast<ParseError>(EV)) {
479   case ParseError::Success:
480     return "Success";
481   case ParseError::Error:
482     return "Invalid argument";
483   case ParseError::Unsuitable:
484     return "Unsuitable";
485   }
486   llvm_unreachable("unexpected parse error");
487 }
488 
489 static FormatStyle expandPresets(const FormatStyle &Style) {
490   if (Style.BreakBeforeBraces == FormatStyle::BS_Custom)
491     return Style;
492   FormatStyle Expanded = Style;
493   Expanded.BraceWrapping = {false, false, false, false, false, false,
494                             false, false, false, false, false, true,
495                             true,  true};
496   switch (Style.BreakBeforeBraces) {
497   case FormatStyle::BS_Linux:
498     Expanded.BraceWrapping.AfterClass = true;
499     Expanded.BraceWrapping.AfterFunction = true;
500     Expanded.BraceWrapping.AfterNamespace = true;
501     break;
502   case FormatStyle::BS_Mozilla:
503     Expanded.BraceWrapping.AfterClass = true;
504     Expanded.BraceWrapping.AfterEnum = true;
505     Expanded.BraceWrapping.AfterFunction = true;
506     Expanded.BraceWrapping.AfterStruct = true;
507     Expanded.BraceWrapping.AfterUnion = true;
508     Expanded.BraceWrapping.SplitEmptyFunction = false;
509     Expanded.BraceWrapping.SplitEmptyRecord = false;
510     break;
511   case FormatStyle::BS_Stroustrup:
512     Expanded.BraceWrapping.AfterFunction = true;
513     Expanded.BraceWrapping.BeforeCatch = true;
514     Expanded.BraceWrapping.BeforeElse = true;
515     break;
516   case FormatStyle::BS_Allman:
517     Expanded.BraceWrapping.AfterClass = true;
518     Expanded.BraceWrapping.AfterControlStatement = true;
519     Expanded.BraceWrapping.AfterEnum = true;
520     Expanded.BraceWrapping.AfterFunction = true;
521     Expanded.BraceWrapping.AfterNamespace = true;
522     Expanded.BraceWrapping.AfterObjCDeclaration = true;
523     Expanded.BraceWrapping.AfterStruct = true;
524     Expanded.BraceWrapping.BeforeCatch = true;
525     Expanded.BraceWrapping.BeforeElse = true;
526     break;
527   case FormatStyle::BS_GNU:
528     Expanded.BraceWrapping = {true, true, true, true, true, true,
529                               true, true, true, true, true, true,
530                               true, true};
531     break;
532   case FormatStyle::BS_WebKit:
533     Expanded.BraceWrapping.AfterFunction = true;
534     break;
535   default:
536     break;
537   }
538   return Expanded;
539 }
540 
541 FormatStyle getLLVMStyle() {
542   FormatStyle LLVMStyle;
543   LLVMStyle.Language = FormatStyle::LK_Cpp;
544   LLVMStyle.AccessModifierOffset = -2;
545   LLVMStyle.AlignEscapedNewlines = FormatStyle::ENAS_Right;
546   LLVMStyle.AlignAfterOpenBracket = FormatStyle::BAS_Align;
547   LLVMStyle.AlignOperands = true;
548   LLVMStyle.AlignTrailingComments = true;
549   LLVMStyle.AlignConsecutiveAssignments = false;
550   LLVMStyle.AlignConsecutiveDeclarations = false;
551   LLVMStyle.AllowAllParametersOfDeclarationOnNextLine = true;
552   LLVMStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_All;
553   LLVMStyle.AllowShortBlocksOnASingleLine = false;
554   LLVMStyle.AllowShortCaseLabelsOnASingleLine = false;
555   LLVMStyle.AllowShortIfStatementsOnASingleLine = false;
556   LLVMStyle.AllowShortLoopsOnASingleLine = false;
557   LLVMStyle.AlwaysBreakAfterReturnType = FormatStyle::RTBS_None;
558   LLVMStyle.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_None;
559   LLVMStyle.AlwaysBreakBeforeMultilineStrings = false;
560   LLVMStyle.AlwaysBreakTemplateDeclarations = false;
561   LLVMStyle.BinPackArguments = true;
562   LLVMStyle.BinPackParameters = true;
563   LLVMStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
564   LLVMStyle.BreakBeforeTernaryOperators = true;
565   LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach;
566   LLVMStyle.BraceWrapping = {false, false, false, false, false, false,
567                              false, false, false, false, false, true,
568                              true,  true};
569   LLVMStyle.BreakAfterJavaFieldAnnotations = false;
570   LLVMStyle.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
571   LLVMStyle.BreakBeforeInheritanceComma = false;
572   LLVMStyle.BreakStringLiterals = true;
573   LLVMStyle.ColumnLimit = 80;
574   LLVMStyle.CommentPragmas = "^ IWYU pragma:";
575   LLVMStyle.CompactNamespaces = false;
576   LLVMStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = false;
577   LLVMStyle.ConstructorInitializerIndentWidth = 4;
578   LLVMStyle.ContinuationIndentWidth = 4;
579   LLVMStyle.Cpp11BracedListStyle = true;
580   LLVMStyle.DerivePointerAlignment = false;
581   LLVMStyle.ExperimentalAutoDetectBinPacking = false;
582   LLVMStyle.FixNamespaceComments = true;
583   LLVMStyle.ForEachMacros.push_back("foreach");
584   LLVMStyle.ForEachMacros.push_back("Q_FOREACH");
585   LLVMStyle.ForEachMacros.push_back("BOOST_FOREACH");
586   LLVMStyle.IncludeCategories = {{"^\"(llvm|llvm-c|clang|clang-c)/", 2},
587                                  {"^(<|\"(gtest|gmock|isl|json)/)", 3},
588                                  {".*", 1}};
589   LLVMStyle.IncludeIsMainRegex = "(Test)?$";
590   LLVMStyle.IndentCaseLabels = false;
591   LLVMStyle.IndentWrappedFunctionNames = false;
592   LLVMStyle.IndentWidth = 2;
593   LLVMStyle.JavaScriptQuotes = FormatStyle::JSQS_Leave;
594   LLVMStyle.JavaScriptWrapImports = true;
595   LLVMStyle.TabWidth = 8;
596   LLVMStyle.MaxEmptyLinesToKeep = 1;
597   LLVMStyle.KeepEmptyLinesAtTheStartOfBlocks = true;
598   LLVMStyle.NamespaceIndentation = FormatStyle::NI_None;
599   LLVMStyle.ObjCBlockIndentWidth = 2;
600   LLVMStyle.ObjCSpaceAfterProperty = false;
601   LLVMStyle.ObjCSpaceBeforeProtocolList = true;
602   LLVMStyle.PointerAlignment = FormatStyle::PAS_Right;
603   LLVMStyle.SpacesBeforeTrailingComments = 1;
604   LLVMStyle.Standard = FormatStyle::LS_Cpp11;
605   LLVMStyle.UseTab = FormatStyle::UT_Never;
606   LLVMStyle.ReflowComments = true;
607   LLVMStyle.SpacesInParentheses = false;
608   LLVMStyle.SpacesInSquareBrackets = false;
609   LLVMStyle.SpaceInEmptyParentheses = false;
610   LLVMStyle.SpacesInContainerLiterals = true;
611   LLVMStyle.SpacesInCStyleCastParentheses = false;
612   LLVMStyle.SpaceAfterCStyleCast = false;
613   LLVMStyle.SpaceAfterTemplateKeyword = true;
614   LLVMStyle.SpaceBeforeParens = FormatStyle::SBPO_ControlStatements;
615   LLVMStyle.SpaceBeforeAssignmentOperators = true;
616   LLVMStyle.SpacesInAngles = false;
617 
618   LLVMStyle.PenaltyBreakAssignment = prec::Assignment;
619   LLVMStyle.PenaltyBreakComment = 300;
620   LLVMStyle.PenaltyBreakFirstLessLess = 120;
621   LLVMStyle.PenaltyBreakString = 1000;
622   LLVMStyle.PenaltyExcessCharacter = 1000000;
623   LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60;
624   LLVMStyle.PenaltyBreakBeforeFirstCallParameter = 19;
625 
626   LLVMStyle.DisableFormat = false;
627   LLVMStyle.SortIncludes = true;
628   LLVMStyle.SortUsingDeclarations = true;
629 
630   return LLVMStyle;
631 }
632 
633 FormatStyle getGoogleStyle(FormatStyle::LanguageKind Language) {
634   FormatStyle GoogleStyle = getLLVMStyle();
635   GoogleStyle.Language = Language;
636 
637   GoogleStyle.AccessModifierOffset = -1;
638   GoogleStyle.AlignEscapedNewlines = FormatStyle::ENAS_Left;
639   GoogleStyle.AllowShortIfStatementsOnASingleLine = true;
640   GoogleStyle.AllowShortLoopsOnASingleLine = true;
641   GoogleStyle.AlwaysBreakBeforeMultilineStrings = true;
642   GoogleStyle.AlwaysBreakTemplateDeclarations = true;
643   GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true;
644   GoogleStyle.DerivePointerAlignment = true;
645   GoogleStyle.IncludeCategories = {{"^<.*\\.h>", 1}, {"^<.*", 2}, {".*", 3}};
646   GoogleStyle.IncludeIsMainRegex = "([-_](test|unittest))?$";
647   GoogleStyle.IndentCaseLabels = true;
648   GoogleStyle.KeepEmptyLinesAtTheStartOfBlocks = false;
649   GoogleStyle.ObjCSpaceAfterProperty = false;
650   GoogleStyle.ObjCSpaceBeforeProtocolList = false;
651   GoogleStyle.PointerAlignment = FormatStyle::PAS_Left;
652   GoogleStyle.SpacesBeforeTrailingComments = 2;
653   GoogleStyle.Standard = FormatStyle::LS_Auto;
654 
655   GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200;
656   GoogleStyle.PenaltyBreakBeforeFirstCallParameter = 1;
657 
658   if (Language == FormatStyle::LK_Java) {
659     GoogleStyle.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
660     GoogleStyle.AlignOperands = false;
661     GoogleStyle.AlignTrailingComments = false;
662     GoogleStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
663     GoogleStyle.AllowShortIfStatementsOnASingleLine = false;
664     GoogleStyle.AlwaysBreakBeforeMultilineStrings = false;
665     GoogleStyle.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
666     GoogleStyle.ColumnLimit = 100;
667     GoogleStyle.SpaceAfterCStyleCast = true;
668     GoogleStyle.SpacesBeforeTrailingComments = 1;
669   } else if (Language == FormatStyle::LK_JavaScript) {
670     GoogleStyle.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
671     GoogleStyle.AlignOperands = false;
672     GoogleStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
673     GoogleStyle.AlwaysBreakBeforeMultilineStrings = false;
674     GoogleStyle.BreakBeforeTernaryOperators = false;
675     // taze:, triple slash directives (`/// <...`), @tag followed by { for a lot
676     // of JSDoc tags, and @see, which is commonly followed by overlong URLs.
677     GoogleStyle.CommentPragmas =
678         "(taze:|^/[ \t]*<|(@[A-Za-z_0-9-]+[ \\t]*{)|@see)";
679     GoogleStyle.MaxEmptyLinesToKeep = 3;
680     GoogleStyle.NamespaceIndentation = FormatStyle::NI_All;
681     GoogleStyle.SpacesInContainerLiterals = false;
682     GoogleStyle.JavaScriptQuotes = FormatStyle::JSQS_Single;
683     GoogleStyle.JavaScriptWrapImports = false;
684   } else if (Language == FormatStyle::LK_Proto) {
685     GoogleStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
686     GoogleStyle.SpacesInContainerLiterals = false;
687   } else if (Language == FormatStyle::LK_ObjC) {
688     GoogleStyle.ColumnLimit = 100;
689   }
690 
691   return GoogleStyle;
692 }
693 
694 FormatStyle getChromiumStyle(FormatStyle::LanguageKind Language) {
695   FormatStyle ChromiumStyle = getGoogleStyle(Language);
696   if (Language == FormatStyle::LK_Java) {
697     ChromiumStyle.AllowShortIfStatementsOnASingleLine = true;
698     ChromiumStyle.BreakAfterJavaFieldAnnotations = true;
699     ChromiumStyle.ContinuationIndentWidth = 8;
700     ChromiumStyle.IndentWidth = 4;
701   } else if (Language == FormatStyle::LK_JavaScript) {
702     ChromiumStyle.AllowShortIfStatementsOnASingleLine = false;
703     ChromiumStyle.AllowShortLoopsOnASingleLine = false;
704   } else {
705     ChromiumStyle.AllowAllParametersOfDeclarationOnNextLine = false;
706     ChromiumStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
707     ChromiumStyle.AllowShortIfStatementsOnASingleLine = false;
708     ChromiumStyle.AllowShortLoopsOnASingleLine = false;
709     ChromiumStyle.BinPackParameters = false;
710     ChromiumStyle.DerivePointerAlignment = false;
711     if (Language == FormatStyle::LK_ObjC)
712       ChromiumStyle.ColumnLimit = 80;
713   }
714   return ChromiumStyle;
715 }
716 
717 FormatStyle getMozillaStyle() {
718   FormatStyle MozillaStyle = getLLVMStyle();
719   MozillaStyle.AllowAllParametersOfDeclarationOnNextLine = false;
720   MozillaStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
721   MozillaStyle.AlwaysBreakAfterReturnType =
722       FormatStyle::RTBS_TopLevel;
723   MozillaStyle.AlwaysBreakAfterDefinitionReturnType =
724       FormatStyle::DRTBS_TopLevel;
725   MozillaStyle.AlwaysBreakTemplateDeclarations = true;
726   MozillaStyle.BinPackParameters = false;
727   MozillaStyle.BinPackArguments = false;
728   MozillaStyle.BreakBeforeBraces = FormatStyle::BS_Mozilla;
729   MozillaStyle.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
730   MozillaStyle.BreakBeforeInheritanceComma = true;
731   MozillaStyle.ConstructorInitializerIndentWidth = 2;
732   MozillaStyle.ContinuationIndentWidth = 2;
733   MozillaStyle.Cpp11BracedListStyle = false;
734   MozillaStyle.FixNamespaceComments = false;
735   MozillaStyle.IndentCaseLabels = true;
736   MozillaStyle.ObjCSpaceAfterProperty = true;
737   MozillaStyle.ObjCSpaceBeforeProtocolList = false;
738   MozillaStyle.PenaltyReturnTypeOnItsOwnLine = 200;
739   MozillaStyle.PointerAlignment = FormatStyle::PAS_Left;
740   MozillaStyle.SpaceAfterTemplateKeyword = false;
741   return MozillaStyle;
742 }
743 
744 FormatStyle getWebKitStyle() {
745   FormatStyle Style = getLLVMStyle();
746   Style.AccessModifierOffset = -4;
747   Style.AlignAfterOpenBracket = FormatStyle::BAS_DontAlign;
748   Style.AlignOperands = false;
749   Style.AlignTrailingComments = false;
750   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
751   Style.BreakBeforeBraces = FormatStyle::BS_WebKit;
752   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeComma;
753   Style.Cpp11BracedListStyle = false;
754   Style.ColumnLimit = 0;
755   Style.FixNamespaceComments = false;
756   Style.IndentWidth = 4;
757   Style.NamespaceIndentation = FormatStyle::NI_Inner;
758   Style.ObjCBlockIndentWidth = 4;
759   Style.ObjCSpaceAfterProperty = true;
760   Style.PointerAlignment = FormatStyle::PAS_Left;
761   return Style;
762 }
763 
764 FormatStyle getGNUStyle() {
765   FormatStyle Style = getLLVMStyle();
766   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
767   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_AllDefinitions;
768   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
769   Style.BreakBeforeBraces = FormatStyle::BS_GNU;
770   Style.BreakBeforeTernaryOperators = true;
771   Style.Cpp11BracedListStyle = false;
772   Style.ColumnLimit = 79;
773   Style.FixNamespaceComments = false;
774   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
775   Style.Standard = FormatStyle::LS_Cpp03;
776   return Style;
777 }
778 
779 FormatStyle getNoStyle() {
780   FormatStyle NoStyle = getLLVMStyle();
781   NoStyle.DisableFormat = true;
782   NoStyle.SortIncludes = false;
783   NoStyle.SortUsingDeclarations = false;
784   return NoStyle;
785 }
786 
787 bool getPredefinedStyle(StringRef Name, FormatStyle::LanguageKind Language,
788                         FormatStyle *Style) {
789   if (Name.equals_lower("llvm")) {
790     *Style = getLLVMStyle();
791   } else if (Name.equals_lower("chromium")) {
792     *Style = getChromiumStyle(Language);
793   } else if (Name.equals_lower("mozilla")) {
794     *Style = getMozillaStyle();
795   } else if (Name.equals_lower("google")) {
796     *Style = getGoogleStyle(Language);
797   } else if (Name.equals_lower("webkit")) {
798     *Style = getWebKitStyle();
799   } else if (Name.equals_lower("gnu")) {
800     *Style = getGNUStyle();
801   } else if (Name.equals_lower("none")) {
802     *Style = getNoStyle();
803   } else {
804     return false;
805   }
806 
807   Style->Language = Language;
808   return true;
809 }
810 
811 std::error_code parseConfiguration(StringRef Text, FormatStyle *Style) {
812   assert(Style);
813   FormatStyle::LanguageKind Language = Style->Language;
814   assert(Language != FormatStyle::LK_None);
815   if (Text.trim().empty())
816     return make_error_code(ParseError::Error);
817 
818   std::vector<FormatStyle> Styles;
819   llvm::yaml::Input Input(Text);
820   // DocumentListTraits<vector<FormatStyle>> uses the context to get default
821   // values for the fields, keys for which are missing from the configuration.
822   // Mapping also uses the context to get the language to find the correct
823   // base style.
824   Input.setContext(Style);
825   Input >> Styles;
826   if (Input.error())
827     return Input.error();
828 
829   for (unsigned i = 0; i < Styles.size(); ++i) {
830     // Ensures that only the first configuration can skip the Language option.
831     if (Styles[i].Language == FormatStyle::LK_None && i != 0)
832       return make_error_code(ParseError::Error);
833     // Ensure that each language is configured at most once.
834     for (unsigned j = 0; j < i; ++j) {
835       if (Styles[i].Language == Styles[j].Language) {
836         DEBUG(llvm::dbgs()
837               << "Duplicate languages in the config file on positions " << j
838               << " and " << i << "\n");
839         return make_error_code(ParseError::Error);
840       }
841     }
842   }
843   // Look for a suitable configuration starting from the end, so we can
844   // find the configuration for the specific language first, and the default
845   // configuration (which can only be at slot 0) after it.
846   for (int i = Styles.size() - 1; i >= 0; --i) {
847     if (Styles[i].Language == Language ||
848         Styles[i].Language == FormatStyle::LK_None) {
849       *Style = Styles[i];
850       Style->Language = Language;
851       return make_error_code(ParseError::Success);
852     }
853   }
854   return make_error_code(ParseError::Unsuitable);
855 }
856 
857 std::string configurationAsText(const FormatStyle &Style) {
858   std::string Text;
859   llvm::raw_string_ostream Stream(Text);
860   llvm::yaml::Output Output(Stream);
861   // We use the same mapping method for input and output, so we need a non-const
862   // reference here.
863   FormatStyle NonConstStyle = expandPresets(Style);
864   Output << NonConstStyle;
865   return Stream.str();
866 }
867 
868 namespace {
869 
870 class JavaScriptRequoter : public TokenAnalyzer {
871 public:
872   JavaScriptRequoter(const Environment &Env, const FormatStyle &Style)
873       : TokenAnalyzer(Env, Style) {}
874 
875   tooling::Replacements
876   analyze(TokenAnnotator &Annotator,
877           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
878           FormatTokenLexer &Tokens) override {
879     AffectedRangeMgr.computeAffectedLines(AnnotatedLines.begin(),
880                                           AnnotatedLines.end());
881     tooling::Replacements Result;
882     requoteJSStringLiteral(AnnotatedLines, Result);
883     return Result;
884   }
885 
886 private:
887   // Replaces double/single-quoted string literal as appropriate, re-escaping
888   // the contents in the process.
889   void requoteJSStringLiteral(SmallVectorImpl<AnnotatedLine *> &Lines,
890                               tooling::Replacements &Result) {
891     for (AnnotatedLine *Line : Lines) {
892       requoteJSStringLiteral(Line->Children, Result);
893       if (!Line->Affected)
894         continue;
895       for (FormatToken *FormatTok = Line->First; FormatTok;
896            FormatTok = FormatTok->Next) {
897         StringRef Input = FormatTok->TokenText;
898         if (FormatTok->Finalized || !FormatTok->isStringLiteral() ||
899             // NB: testing for not starting with a double quote to avoid
900             // breaking `template strings`.
901             (Style.JavaScriptQuotes == FormatStyle::JSQS_Single &&
902              !Input.startswith("\"")) ||
903             (Style.JavaScriptQuotes == FormatStyle::JSQS_Double &&
904              !Input.startswith("\'")))
905           continue;
906 
907         // Change start and end quote.
908         bool IsSingle = Style.JavaScriptQuotes == FormatStyle::JSQS_Single;
909         SourceLocation Start = FormatTok->Tok.getLocation();
910         auto Replace = [&](SourceLocation Start, unsigned Length,
911                            StringRef ReplacementText) {
912           auto Err = Result.add(tooling::Replacement(
913               Env.getSourceManager(), Start, Length, ReplacementText));
914           // FIXME: handle error. For now, print error message and skip the
915           // replacement for release version.
916           if (Err) {
917             llvm::errs() << llvm::toString(std::move(Err)) << "\n";
918             assert(false);
919           }
920         };
921         Replace(Start, 1, IsSingle ? "'" : "\"");
922         Replace(FormatTok->Tok.getEndLoc().getLocWithOffset(-1), 1,
923                 IsSingle ? "'" : "\"");
924 
925         // Escape internal quotes.
926         bool Escaped = false;
927         for (size_t i = 1; i < Input.size() - 1; i++) {
928           switch (Input[i]) {
929           case '\\':
930             if (!Escaped && i + 1 < Input.size() &&
931                 ((IsSingle && Input[i + 1] == '"') ||
932                  (!IsSingle && Input[i + 1] == '\''))) {
933               // Remove this \, it's escaping a " or ' that no longer needs
934               // escaping
935               Replace(Start.getLocWithOffset(i), 1, "");
936               continue;
937             }
938             Escaped = !Escaped;
939             break;
940           case '\"':
941           case '\'':
942             if (!Escaped && IsSingle == (Input[i] == '\'')) {
943               // Escape the quote.
944               Replace(Start.getLocWithOffset(i), 0, "\\");
945             }
946             Escaped = false;
947             break;
948           default:
949             Escaped = false;
950             break;
951           }
952         }
953       }
954     }
955   }
956 };
957 
958 class Formatter : public TokenAnalyzer {
959 public:
960   Formatter(const Environment &Env, const FormatStyle &Style,
961             FormattingAttemptStatus *Status)
962       : TokenAnalyzer(Env, Style), Status(Status) {}
963 
964   tooling::Replacements
965   analyze(TokenAnnotator &Annotator,
966           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
967           FormatTokenLexer &Tokens) override {
968     tooling::Replacements Result;
969     deriveLocalStyle(AnnotatedLines);
970     AffectedRangeMgr.computeAffectedLines(AnnotatedLines.begin(),
971                                           AnnotatedLines.end());
972     for (unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) {
973       Annotator.calculateFormattingInformation(*AnnotatedLines[i]);
974     }
975     Annotator.setCommentLineLevels(AnnotatedLines);
976 
977     WhitespaceManager Whitespaces(
978         Env.getSourceManager(), Style,
979         inputUsesCRLF(Env.getSourceManager().getBufferData(Env.getFileID())));
980     ContinuationIndenter Indenter(Style, Tokens.getKeywords(),
981                                   Env.getSourceManager(), Whitespaces, Encoding,
982                                   BinPackInconclusiveFunctions);
983     UnwrappedLineFormatter(&Indenter, &Whitespaces, Style, Tokens.getKeywords(),
984                            Env.getSourceManager(), Status)
985         .format(AnnotatedLines);
986     for (const auto &R : Whitespaces.generateReplacements())
987       if (Result.add(R))
988         return Result;
989     return Result;
990   }
991 
992 private:
993 
994   static bool inputUsesCRLF(StringRef Text) {
995     return Text.count('\r') * 2 > Text.count('\n');
996   }
997 
998   bool
999   hasCpp03IncompatibleFormat(const SmallVectorImpl<AnnotatedLine *> &Lines) {
1000     for (const AnnotatedLine *Line : Lines) {
1001       if (hasCpp03IncompatibleFormat(Line->Children))
1002         return true;
1003       for (FormatToken *Tok = Line->First->Next; Tok; Tok = Tok->Next) {
1004         if (Tok->WhitespaceRange.getBegin() == Tok->WhitespaceRange.getEnd()) {
1005           if (Tok->is(tok::coloncolon) && Tok->Previous->is(TT_TemplateOpener))
1006             return true;
1007           if (Tok->is(TT_TemplateCloser) &&
1008               Tok->Previous->is(TT_TemplateCloser))
1009             return true;
1010         }
1011       }
1012     }
1013     return false;
1014   }
1015 
1016   int countVariableAlignments(const SmallVectorImpl<AnnotatedLine *> &Lines) {
1017     int AlignmentDiff = 0;
1018     for (const AnnotatedLine *Line : Lines) {
1019       AlignmentDiff += countVariableAlignments(Line->Children);
1020       for (FormatToken *Tok = Line->First; Tok && Tok->Next; Tok = Tok->Next) {
1021         if (!Tok->is(TT_PointerOrReference))
1022           continue;
1023         bool SpaceBefore =
1024             Tok->WhitespaceRange.getBegin() != Tok->WhitespaceRange.getEnd();
1025         bool SpaceAfter = Tok->Next->WhitespaceRange.getBegin() !=
1026                           Tok->Next->WhitespaceRange.getEnd();
1027         if (SpaceBefore && !SpaceAfter)
1028           ++AlignmentDiff;
1029         if (!SpaceBefore && SpaceAfter)
1030           --AlignmentDiff;
1031       }
1032     }
1033     return AlignmentDiff;
1034   }
1035 
1036   void
1037   deriveLocalStyle(const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
1038     bool HasBinPackedFunction = false;
1039     bool HasOnePerLineFunction = false;
1040     for (unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) {
1041       if (!AnnotatedLines[i]->First->Next)
1042         continue;
1043       FormatToken *Tok = AnnotatedLines[i]->First->Next;
1044       while (Tok->Next) {
1045         if (Tok->PackingKind == PPK_BinPacked)
1046           HasBinPackedFunction = true;
1047         if (Tok->PackingKind == PPK_OnePerLine)
1048           HasOnePerLineFunction = true;
1049 
1050         Tok = Tok->Next;
1051       }
1052     }
1053     if (Style.DerivePointerAlignment)
1054       Style.PointerAlignment = countVariableAlignments(AnnotatedLines) <= 0
1055                                    ? FormatStyle::PAS_Left
1056                                    : FormatStyle::PAS_Right;
1057     if (Style.Standard == FormatStyle::LS_Auto)
1058       Style.Standard = hasCpp03IncompatibleFormat(AnnotatedLines)
1059                            ? FormatStyle::LS_Cpp11
1060                            : FormatStyle::LS_Cpp03;
1061     BinPackInconclusiveFunctions =
1062         HasBinPackedFunction || !HasOnePerLineFunction;
1063   }
1064 
1065   bool BinPackInconclusiveFunctions;
1066   FormattingAttemptStatus *Status;
1067 };
1068 
1069 // This class clean up the erroneous/redundant code around the given ranges in
1070 // file.
1071 class Cleaner : public TokenAnalyzer {
1072 public:
1073   Cleaner(const Environment &Env, const FormatStyle &Style)
1074       : TokenAnalyzer(Env, Style),
1075         DeletedTokens(FormatTokenLess(Env.getSourceManager())) {}
1076 
1077   // FIXME: eliminate unused parameters.
1078   tooling::Replacements
1079   analyze(TokenAnnotator &Annotator,
1080           SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
1081           FormatTokenLexer &Tokens) override {
1082     // FIXME: in the current implementation the granularity of affected range
1083     // is an annotated line. However, this is not sufficient. Furthermore,
1084     // redundant code introduced by replacements does not necessarily
1085     // intercept with ranges of replacements that result in the redundancy.
1086     // To determine if some redundant code is actually introduced by
1087     // replacements(e.g. deletions), we need to come up with a more
1088     // sophisticated way of computing affected ranges.
1089     AffectedRangeMgr.computeAffectedLines(AnnotatedLines.begin(),
1090                                           AnnotatedLines.end());
1091 
1092     checkEmptyNamespace(AnnotatedLines);
1093 
1094     for (auto &Line : AnnotatedLines) {
1095       if (Line->Affected) {
1096         cleanupRight(Line->First, tok::comma, tok::comma);
1097         cleanupRight(Line->First, TT_CtorInitializerColon, tok::comma);
1098         cleanupRight(Line->First, tok::l_paren, tok::comma);
1099         cleanupLeft(Line->First, tok::comma, tok::r_paren);
1100         cleanupLeft(Line->First, TT_CtorInitializerComma, tok::l_brace);
1101         cleanupLeft(Line->First, TT_CtorInitializerColon, tok::l_brace);
1102         cleanupLeft(Line->First, TT_CtorInitializerColon, tok::equal);
1103       }
1104     }
1105 
1106     return generateFixes();
1107   }
1108 
1109 private:
1110   bool containsOnlyComments(const AnnotatedLine &Line) {
1111     for (FormatToken *Tok = Line.First; Tok != nullptr; Tok = Tok->Next) {
1112       if (Tok->isNot(tok::comment))
1113         return false;
1114     }
1115     return true;
1116   }
1117 
1118   // Iterate through all lines and remove any empty (nested) namespaces.
1119   void checkEmptyNamespace(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
1120     std::set<unsigned> DeletedLines;
1121     for (unsigned i = 0, e = AnnotatedLines.size(); i != e; ++i) {
1122       auto &Line = *AnnotatedLines[i];
1123       if (Line.startsWith(tok::kw_namespace) ||
1124           Line.startsWith(tok::kw_inline, tok::kw_namespace)) {
1125         checkEmptyNamespace(AnnotatedLines, i, i, DeletedLines);
1126       }
1127     }
1128 
1129     for (auto Line : DeletedLines) {
1130       FormatToken *Tok = AnnotatedLines[Line]->First;
1131       while (Tok) {
1132         deleteToken(Tok);
1133         Tok = Tok->Next;
1134       }
1135     }
1136   }
1137 
1138   // The function checks if the namespace, which starts from \p CurrentLine, and
1139   // its nested namespaces are empty and delete them if they are empty. It also
1140   // sets \p NewLine to the last line checked.
1141   // Returns true if the current namespace is empty.
1142   bool checkEmptyNamespace(SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
1143                            unsigned CurrentLine, unsigned &NewLine,
1144                            std::set<unsigned> &DeletedLines) {
1145     unsigned InitLine = CurrentLine, End = AnnotatedLines.size();
1146     if (Style.BraceWrapping.AfterNamespace) {
1147       // If the left brace is in a new line, we should consume it first so that
1148       // it does not make the namespace non-empty.
1149       // FIXME: error handling if there is no left brace.
1150       if (!AnnotatedLines[++CurrentLine]->startsWith(tok::l_brace)) {
1151         NewLine = CurrentLine;
1152         return false;
1153       }
1154     } else if (!AnnotatedLines[CurrentLine]->endsWith(tok::l_brace)) {
1155       return false;
1156     }
1157     while (++CurrentLine < End) {
1158       if (AnnotatedLines[CurrentLine]->startsWith(tok::r_brace))
1159         break;
1160 
1161       if (AnnotatedLines[CurrentLine]->startsWith(tok::kw_namespace) ||
1162           AnnotatedLines[CurrentLine]->startsWith(tok::kw_inline,
1163                                                   tok::kw_namespace)) {
1164         if (!checkEmptyNamespace(AnnotatedLines, CurrentLine, NewLine,
1165                                  DeletedLines))
1166           return false;
1167         CurrentLine = NewLine;
1168         continue;
1169       }
1170 
1171       if (containsOnlyComments(*AnnotatedLines[CurrentLine]))
1172         continue;
1173 
1174       // If there is anything other than comments or nested namespaces in the
1175       // current namespace, the namespace cannot be empty.
1176       NewLine = CurrentLine;
1177       return false;
1178     }
1179 
1180     NewLine = CurrentLine;
1181     if (CurrentLine >= End)
1182       return false;
1183 
1184     // Check if the empty namespace is actually affected by changed ranges.
1185     if (!AffectedRangeMgr.affectsCharSourceRange(CharSourceRange::getCharRange(
1186             AnnotatedLines[InitLine]->First->Tok.getLocation(),
1187             AnnotatedLines[CurrentLine]->Last->Tok.getEndLoc())))
1188       return false;
1189 
1190     for (unsigned i = InitLine; i <= CurrentLine; ++i) {
1191       DeletedLines.insert(i);
1192     }
1193 
1194     return true;
1195   }
1196 
1197   // Checks pairs {start, start->next},..., {end->previous, end} and deletes one
1198   // of the token in the pair if the left token has \p LK token kind and the
1199   // right token has \p RK token kind. If \p DeleteLeft is true, the left token
1200   // is deleted on match; otherwise, the right token is deleted.
1201   template <typename LeftKind, typename RightKind>
1202   void cleanupPair(FormatToken *Start, LeftKind LK, RightKind RK,
1203                    bool DeleteLeft) {
1204     auto NextNotDeleted = [this](const FormatToken &Tok) -> FormatToken * {
1205       for (auto *Res = Tok.Next; Res; Res = Res->Next)
1206         if (!Res->is(tok::comment) &&
1207             DeletedTokens.find(Res) == DeletedTokens.end())
1208           return Res;
1209       return nullptr;
1210     };
1211     for (auto *Left = Start; Left;) {
1212       auto *Right = NextNotDeleted(*Left);
1213       if (!Right)
1214         break;
1215       if (Left->is(LK) && Right->is(RK)) {
1216         deleteToken(DeleteLeft ? Left : Right);
1217         for (auto *Tok = Left->Next; Tok && Tok != Right; Tok = Tok->Next)
1218           deleteToken(Tok);
1219         // If the right token is deleted, we should keep the left token
1220         // unchanged and pair it with the new right token.
1221         if (!DeleteLeft)
1222           continue;
1223       }
1224       Left = Right;
1225     }
1226   }
1227 
1228   template <typename LeftKind, typename RightKind>
1229   void cleanupLeft(FormatToken *Start, LeftKind LK, RightKind RK) {
1230     cleanupPair(Start, LK, RK, /*DeleteLeft=*/true);
1231   }
1232 
1233   template <typename LeftKind, typename RightKind>
1234   void cleanupRight(FormatToken *Start, LeftKind LK, RightKind RK) {
1235     cleanupPair(Start, LK, RK, /*DeleteLeft=*/false);
1236   }
1237 
1238   // Delete the given token.
1239   inline void deleteToken(FormatToken *Tok) {
1240     if (Tok)
1241       DeletedTokens.insert(Tok);
1242   }
1243 
1244   tooling::Replacements generateFixes() {
1245     tooling::Replacements Fixes;
1246     std::vector<FormatToken *> Tokens;
1247     std::copy(DeletedTokens.begin(), DeletedTokens.end(),
1248               std::back_inserter(Tokens));
1249 
1250     // Merge multiple continuous token deletions into one big deletion so that
1251     // the number of replacements can be reduced. This makes computing affected
1252     // ranges more efficient when we run reformat on the changed code.
1253     unsigned Idx = 0;
1254     while (Idx < Tokens.size()) {
1255       unsigned St = Idx, End = Idx;
1256       while ((End + 1) < Tokens.size() &&
1257              Tokens[End]->Next == Tokens[End + 1]) {
1258         End++;
1259       }
1260       auto SR = CharSourceRange::getCharRange(Tokens[St]->Tok.getLocation(),
1261                                               Tokens[End]->Tok.getEndLoc());
1262       auto Err =
1263           Fixes.add(tooling::Replacement(Env.getSourceManager(), SR, ""));
1264       // FIXME: better error handling. for now just print error message and skip
1265       // for the release version.
1266       if (Err) {
1267         llvm::errs() << llvm::toString(std::move(Err)) << "\n";
1268         assert(false && "Fixes must not conflict!");
1269       }
1270       Idx = End + 1;
1271     }
1272 
1273     return Fixes;
1274   }
1275 
1276   // Class for less-than inequality comparason for the set `RedundantTokens`.
1277   // We store tokens in the order they appear in the translation unit so that
1278   // we do not need to sort them in `generateFixes()`.
1279   struct FormatTokenLess {
1280     FormatTokenLess(const SourceManager &SM) : SM(SM) {}
1281 
1282     bool operator()(const FormatToken *LHS, const FormatToken *RHS) const {
1283       return SM.isBeforeInTranslationUnit(LHS->Tok.getLocation(),
1284                                           RHS->Tok.getLocation());
1285     }
1286     const SourceManager &SM;
1287   };
1288 
1289   // Tokens to be deleted.
1290   std::set<FormatToken *, FormatTokenLess> DeletedTokens;
1291 };
1292 
1293 struct IncludeDirective {
1294   StringRef Filename;
1295   StringRef Text;
1296   unsigned Offset;
1297   int Category;
1298 };
1299 
1300 } // end anonymous namespace
1301 
1302 // Determines whether 'Ranges' intersects with ('Start', 'End').
1303 static bool affectsRange(ArrayRef<tooling::Range> Ranges, unsigned Start,
1304                          unsigned End) {
1305   for (auto Range : Ranges) {
1306     if (Range.getOffset() < End &&
1307         Range.getOffset() + Range.getLength() > Start)
1308       return true;
1309   }
1310   return false;
1311 }
1312 
1313 // Returns a pair (Index, OffsetToEOL) describing the position of the cursor
1314 // before sorting/deduplicating. Index is the index of the include under the
1315 // cursor in the original set of includes. If this include has duplicates, it is
1316 // the index of the first of the duplicates as the others are going to be
1317 // removed. OffsetToEOL describes the cursor's position relative to the end of
1318 // its current line.
1319 // If `Cursor` is not on any #include, `Index` will be UINT_MAX.
1320 static std::pair<unsigned, unsigned>
1321 FindCursorIndex(const SmallVectorImpl<IncludeDirective> &Includes,
1322                 const SmallVectorImpl<unsigned> &Indices, unsigned Cursor) {
1323   unsigned CursorIndex = UINT_MAX;
1324   unsigned OffsetToEOL = 0;
1325   for (int i = 0, e = Includes.size(); i != e; ++i) {
1326     unsigned Start = Includes[Indices[i]].Offset;
1327     unsigned End = Start + Includes[Indices[i]].Text.size();
1328     if (!(Cursor >= Start && Cursor < End))
1329       continue;
1330     CursorIndex = Indices[i];
1331     OffsetToEOL = End - Cursor;
1332     // Put the cursor on the only remaining #include among the duplicate
1333     // #includes.
1334     while (--i >= 0 && Includes[CursorIndex].Text == Includes[Indices[i]].Text)
1335       CursorIndex = i;
1336     break;
1337   }
1338   return std::make_pair(CursorIndex, OffsetToEOL);
1339 }
1340 
1341 // Sorts and deduplicate a block of includes given by 'Includes' alphabetically
1342 // adding the necessary replacement to 'Replaces'. 'Includes' must be in strict
1343 // source order.
1344 // #include directives with the same text will be deduplicated, and only the
1345 // first #include in the duplicate #includes remains. If the `Cursor` is
1346 // provided and put on a deleted #include, it will be moved to the remaining
1347 // #include in the duplicate #includes.
1348 static void sortCppIncludes(const FormatStyle &Style,
1349                             const SmallVectorImpl<IncludeDirective> &Includes,
1350                             ArrayRef<tooling::Range> Ranges, StringRef FileName,
1351                             tooling::Replacements &Replaces, unsigned *Cursor) {
1352   unsigned IncludesBeginOffset = Includes.front().Offset;
1353   unsigned IncludesEndOffset =
1354       Includes.back().Offset + Includes.back().Text.size();
1355   unsigned IncludesBlockSize = IncludesEndOffset - IncludesBeginOffset;
1356   if (!affectsRange(Ranges, IncludesBeginOffset, IncludesEndOffset))
1357     return;
1358   SmallVector<unsigned, 16> Indices;
1359   for (unsigned i = 0, e = Includes.size(); i != e; ++i)
1360     Indices.push_back(i);
1361   std::stable_sort(
1362       Indices.begin(), Indices.end(), [&](unsigned LHSI, unsigned RHSI) {
1363         return std::tie(Includes[LHSI].Category, Includes[LHSI].Filename) <
1364                std::tie(Includes[RHSI].Category, Includes[RHSI].Filename);
1365       });
1366   // The index of the include on which the cursor will be put after
1367   // sorting/deduplicating.
1368   unsigned CursorIndex;
1369   // The offset from cursor to the end of line.
1370   unsigned CursorToEOLOffset;
1371   if (Cursor)
1372     std::tie(CursorIndex, CursorToEOLOffset) =
1373         FindCursorIndex(Includes, Indices, *Cursor);
1374 
1375   // Deduplicate #includes.
1376   Indices.erase(std::unique(Indices.begin(), Indices.end(),
1377                             [&](unsigned LHSI, unsigned RHSI) {
1378                               return Includes[LHSI].Text == Includes[RHSI].Text;
1379                             }),
1380                 Indices.end());
1381 
1382   // If the #includes are out of order, we generate a single replacement fixing
1383   // the entire block. Otherwise, no replacement is generated.
1384   if (Indices.size() == Includes.size() &&
1385       std::is_sorted(Indices.begin(), Indices.end()))
1386     return;
1387 
1388   std::string result;
1389   for (unsigned Index : Indices) {
1390     if (!result.empty())
1391       result += "\n";
1392     result += Includes[Index].Text;
1393     if (Cursor && CursorIndex == Index)
1394       *Cursor = IncludesBeginOffset + result.size() - CursorToEOLOffset;
1395   }
1396 
1397   auto Err = Replaces.add(tooling::Replacement(
1398       FileName, Includes.front().Offset, IncludesBlockSize, result));
1399   // FIXME: better error handling. For now, just skip the replacement for the
1400   // release version.
1401   if (Err) {
1402     llvm::errs() << llvm::toString(std::move(Err)) << "\n";
1403     assert(false);
1404   }
1405 }
1406 
1407 namespace {
1408 
1409 // This class manages priorities of #include categories and calculates
1410 // priorities for headers.
1411 class IncludeCategoryManager {
1412 public:
1413   IncludeCategoryManager(const FormatStyle &Style, StringRef FileName)
1414       : Style(Style), FileName(FileName) {
1415     FileStem = llvm::sys::path::stem(FileName);
1416     for (const auto &Category : Style.IncludeCategories)
1417       CategoryRegexs.emplace_back(Category.Regex, llvm::Regex::IgnoreCase);
1418     IsMainFile = FileName.endswith(".c") || FileName.endswith(".cc") ||
1419                  FileName.endswith(".cpp") || FileName.endswith(".c++") ||
1420                  FileName.endswith(".cxx") || FileName.endswith(".m") ||
1421                  FileName.endswith(".mm");
1422   }
1423 
1424   // Returns the priority of the category which \p IncludeName belongs to.
1425   // If \p CheckMainHeader is true and \p IncludeName is a main header, returns
1426   // 0. Otherwise, returns the priority of the matching category or INT_MAX.
1427   int getIncludePriority(StringRef IncludeName, bool CheckMainHeader) {
1428     int Ret = INT_MAX;
1429     for (unsigned i = 0, e = CategoryRegexs.size(); i != e; ++i)
1430       if (CategoryRegexs[i].match(IncludeName)) {
1431         Ret = Style.IncludeCategories[i].Priority;
1432         break;
1433       }
1434     if (CheckMainHeader && IsMainFile && Ret > 0 && isMainHeader(IncludeName))
1435       Ret = 0;
1436     return Ret;
1437   }
1438 
1439 private:
1440   bool isMainHeader(StringRef IncludeName) const {
1441     if (!IncludeName.startswith("\""))
1442       return false;
1443     StringRef HeaderStem =
1444         llvm::sys::path::stem(IncludeName.drop_front(1).drop_back(1));
1445     if (FileStem.startswith(HeaderStem) ||
1446         FileStem.startswith_lower(HeaderStem)) {
1447       llvm::Regex MainIncludeRegex(
1448           (HeaderStem + Style.IncludeIsMainRegex).str(),
1449           llvm::Regex::IgnoreCase);
1450       if (MainIncludeRegex.match(FileStem))
1451         return true;
1452     }
1453     return false;
1454   }
1455 
1456   const FormatStyle &Style;
1457   bool IsMainFile;
1458   StringRef FileName;
1459   StringRef FileStem;
1460   SmallVector<llvm::Regex, 4> CategoryRegexs;
1461 };
1462 
1463 const char IncludeRegexPattern[] =
1464     R"(^[\t\ ]*#[\t\ ]*(import|include)[^"<]*(["<][^">]*[">]))";
1465 
1466 } // anonymous namespace
1467 
1468 tooling::Replacements sortCppIncludes(const FormatStyle &Style, StringRef Code,
1469                                       ArrayRef<tooling::Range> Ranges,
1470                                       StringRef FileName,
1471                                       tooling::Replacements &Replaces,
1472                                       unsigned *Cursor) {
1473   unsigned Prev = 0;
1474   unsigned SearchFrom = 0;
1475   llvm::Regex IncludeRegex(IncludeRegexPattern);
1476   SmallVector<StringRef, 4> Matches;
1477   SmallVector<IncludeDirective, 16> IncludesInBlock;
1478 
1479   // In compiled files, consider the first #include to be the main #include of
1480   // the file if it is not a system #include. This ensures that the header
1481   // doesn't have hidden dependencies
1482   // (http://llvm.org/docs/CodingStandards.html#include-style).
1483   //
1484   // FIXME: Do some sanity checking, e.g. edit distance of the base name, to fix
1485   // cases where the first #include is unlikely to be the main header.
1486   IncludeCategoryManager Categories(Style, FileName);
1487   bool FirstIncludeBlock = true;
1488   bool MainIncludeFound = false;
1489   bool FormattingOff = false;
1490 
1491   for (;;) {
1492     auto Pos = Code.find('\n', SearchFrom);
1493     StringRef Line =
1494         Code.substr(Prev, (Pos != StringRef::npos ? Pos : Code.size()) - Prev);
1495 
1496     StringRef Trimmed = Line.trim();
1497     if (Trimmed == "// clang-format off")
1498       FormattingOff = true;
1499     else if (Trimmed == "// clang-format on")
1500       FormattingOff = false;
1501 
1502     if (!FormattingOff && !Line.endswith("\\")) {
1503       if (IncludeRegex.match(Line, &Matches)) {
1504         StringRef IncludeName = Matches[2];
1505         int Category = Categories.getIncludePriority(
1506             IncludeName,
1507             /*CheckMainHeader=*/!MainIncludeFound && FirstIncludeBlock);
1508         if (Category == 0)
1509           MainIncludeFound = true;
1510         IncludesInBlock.push_back({IncludeName, Line, Prev, Category});
1511       } else if (!IncludesInBlock.empty()) {
1512         sortCppIncludes(Style, IncludesInBlock, Ranges, FileName, Replaces,
1513                         Cursor);
1514         IncludesInBlock.clear();
1515         FirstIncludeBlock = false;
1516       }
1517       Prev = Pos + 1;
1518     }
1519     if (Pos == StringRef::npos || Pos + 1 == Code.size())
1520       break;
1521     SearchFrom = Pos + 1;
1522   }
1523   if (!IncludesInBlock.empty())
1524     sortCppIncludes(Style, IncludesInBlock, Ranges, FileName, Replaces, Cursor);
1525   return Replaces;
1526 }
1527 
1528 bool isMpegTS(StringRef Code) {
1529   // MPEG transport streams use the ".ts" file extension. clang-format should
1530   // not attempt to format those. MPEG TS' frame format starts with 0x47 every
1531   // 189 bytes - detect that and return.
1532   return Code.size() > 188 && Code[0] == 0x47 && Code[188] == 0x47;
1533 }
1534 
1535 tooling::Replacements sortIncludes(const FormatStyle &Style, StringRef Code,
1536                                    ArrayRef<tooling::Range> Ranges,
1537                                    StringRef FileName, unsigned *Cursor) {
1538   tooling::Replacements Replaces;
1539   if (!Style.SortIncludes)
1540     return Replaces;
1541   if (Style.Language == FormatStyle::LanguageKind::LK_JavaScript &&
1542       isMpegTS(Code))
1543     return Replaces;
1544   if (Style.Language == FormatStyle::LanguageKind::LK_JavaScript)
1545     return sortJavaScriptImports(Style, Code, Ranges, FileName);
1546   sortCppIncludes(Style, Code, Ranges, FileName, Replaces, Cursor);
1547   return Replaces;
1548 }
1549 
1550 template <typename T>
1551 static llvm::Expected<tooling::Replacements>
1552 processReplacements(T ProcessFunc, StringRef Code,
1553                     const tooling::Replacements &Replaces,
1554                     const FormatStyle &Style) {
1555   if (Replaces.empty())
1556     return tooling::Replacements();
1557 
1558   auto NewCode = applyAllReplacements(Code, Replaces);
1559   if (!NewCode)
1560     return NewCode.takeError();
1561   std::vector<tooling::Range> ChangedRanges = Replaces.getAffectedRanges();
1562   StringRef FileName = Replaces.begin()->getFilePath();
1563 
1564   tooling::Replacements FormatReplaces =
1565       ProcessFunc(Style, *NewCode, ChangedRanges, FileName);
1566 
1567   return Replaces.merge(FormatReplaces);
1568 }
1569 
1570 llvm::Expected<tooling::Replacements>
1571 formatReplacements(StringRef Code, const tooling::Replacements &Replaces,
1572                    const FormatStyle &Style) {
1573   // We need to use lambda function here since there are two versions of
1574   // `sortIncludes`.
1575   auto SortIncludes = [](const FormatStyle &Style, StringRef Code,
1576                          std::vector<tooling::Range> Ranges,
1577                          StringRef FileName) -> tooling::Replacements {
1578     return sortIncludes(Style, Code, Ranges, FileName);
1579   };
1580   auto SortedReplaces =
1581       processReplacements(SortIncludes, Code, Replaces, Style);
1582   if (!SortedReplaces)
1583     return SortedReplaces.takeError();
1584 
1585   // We need to use lambda function here since there are two versions of
1586   // `reformat`.
1587   auto Reformat = [](const FormatStyle &Style, StringRef Code,
1588                      std::vector<tooling::Range> Ranges,
1589                      StringRef FileName) -> tooling::Replacements {
1590     return reformat(Style, Code, Ranges, FileName);
1591   };
1592   return processReplacements(Reformat, Code, *SortedReplaces, Style);
1593 }
1594 
1595 namespace {
1596 
1597 inline bool isHeaderInsertion(const tooling::Replacement &Replace) {
1598   return Replace.getOffset() == UINT_MAX && Replace.getLength() == 0 &&
1599          llvm::Regex(IncludeRegexPattern).match(Replace.getReplacementText());
1600 }
1601 
1602 inline bool isHeaderDeletion(const tooling::Replacement &Replace) {
1603   return Replace.getOffset() == UINT_MAX && Replace.getLength() == 1;
1604 }
1605 
1606 // Returns the offset after skipping a sequence of tokens, matched by \p
1607 // GetOffsetAfterSequence, from the start of the code.
1608 // \p GetOffsetAfterSequence should be a function that matches a sequence of
1609 // tokens and returns an offset after the sequence.
1610 unsigned getOffsetAfterTokenSequence(
1611     StringRef FileName, StringRef Code, const FormatStyle &Style,
1612     llvm::function_ref<unsigned(const SourceManager &, Lexer &, Token &)>
1613         GetOffsetAfterSequence) {
1614   std::unique_ptr<Environment> Env =
1615       Environment::CreateVirtualEnvironment(Code, FileName, /*Ranges=*/{});
1616   const SourceManager &SourceMgr = Env->getSourceManager();
1617   Lexer Lex(Env->getFileID(), SourceMgr.getBuffer(Env->getFileID()), SourceMgr,
1618             getFormattingLangOpts(Style));
1619   Token Tok;
1620   // Get the first token.
1621   Lex.LexFromRawLexer(Tok);
1622   return GetOffsetAfterSequence(SourceMgr, Lex, Tok);
1623 }
1624 
1625 // Check if a sequence of tokens is like "#<Name> <raw_identifier>". If it is,
1626 // \p Tok will be the token after this directive; otherwise, it can be any token
1627 // after the given \p Tok (including \p Tok).
1628 bool checkAndConsumeDirectiveWithName(Lexer &Lex, StringRef Name, Token &Tok) {
1629   bool Matched = Tok.is(tok::hash) && !Lex.LexFromRawLexer(Tok) &&
1630                  Tok.is(tok::raw_identifier) &&
1631                  Tok.getRawIdentifier() == Name && !Lex.LexFromRawLexer(Tok) &&
1632                  Tok.is(tok::raw_identifier);
1633   if (Matched)
1634     Lex.LexFromRawLexer(Tok);
1635   return Matched;
1636 }
1637 
1638 void skipComments(Lexer &Lex, Token &Tok) {
1639   while (Tok.is(tok::comment))
1640     if (Lex.LexFromRawLexer(Tok))
1641       return;
1642 }
1643 
1644 // Returns the offset after header guard directives and any comments
1645 // before/after header guards. If no header guard presents in the code, this
1646 // will returns the offset after skipping all comments from the start of the
1647 // code.
1648 unsigned getOffsetAfterHeaderGuardsAndComments(StringRef FileName,
1649                                                StringRef Code,
1650                                                const FormatStyle &Style) {
1651   return getOffsetAfterTokenSequence(
1652       FileName, Code, Style,
1653       [](const SourceManager &SM, Lexer &Lex, Token Tok) {
1654         skipComments(Lex, Tok);
1655         unsigned InitialOffset = SM.getFileOffset(Tok.getLocation());
1656         if (checkAndConsumeDirectiveWithName(Lex, "ifndef", Tok)) {
1657           skipComments(Lex, Tok);
1658           if (checkAndConsumeDirectiveWithName(Lex, "define", Tok))
1659             return SM.getFileOffset(Tok.getLocation());
1660         }
1661         return InitialOffset;
1662       });
1663 }
1664 
1665 // Check if a sequence of tokens is like
1666 //    "#include ("header.h" | <header.h>)".
1667 // If it is, \p Tok will be the token after this directive; otherwise, it can be
1668 // any token after the given \p Tok (including \p Tok).
1669 bool checkAndConsumeInclusiveDirective(Lexer &Lex, Token &Tok) {
1670   auto Matched = [&]() {
1671     Lex.LexFromRawLexer(Tok);
1672     return true;
1673   };
1674   if (Tok.is(tok::hash) && !Lex.LexFromRawLexer(Tok) &&
1675       Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "include") {
1676     if (Lex.LexFromRawLexer(Tok))
1677       return false;
1678     if (Tok.is(tok::string_literal))
1679       return Matched();
1680     if (Tok.is(tok::less)) {
1681       while (!Lex.LexFromRawLexer(Tok) && Tok.isNot(tok::greater)) {
1682       }
1683       if (Tok.is(tok::greater))
1684         return Matched();
1685     }
1686   }
1687   return false;
1688 }
1689 
1690 // Returns the offset of the last #include directive after which a new
1691 // #include can be inserted. This ignores #include's after the #include block(s)
1692 // in the beginning of a file to avoid inserting headers into code sections
1693 // where new #include's should not be added by default.
1694 // These code sections include:
1695 //      - raw string literals (containing #include).
1696 //      - #if blocks.
1697 //      - Special #include's among declarations (e.g. functions).
1698 //
1699 // If no #include after which a new #include can be inserted, this returns the
1700 // offset after skipping all comments from the start of the code.
1701 // Inserting after an #include is not allowed if it comes after code that is not
1702 // #include (e.g. pre-processing directive that is not #include, declarations).
1703 unsigned getMaxHeaderInsertionOffset(StringRef FileName, StringRef Code,
1704                                      const FormatStyle &Style) {
1705   return getOffsetAfterTokenSequence(
1706       FileName, Code, Style,
1707       [](const SourceManager &SM, Lexer &Lex, Token Tok) {
1708         skipComments(Lex, Tok);
1709         unsigned MaxOffset = SM.getFileOffset(Tok.getLocation());
1710         while (checkAndConsumeInclusiveDirective(Lex, Tok))
1711           MaxOffset = SM.getFileOffset(Tok.getLocation());
1712         return MaxOffset;
1713       });
1714 }
1715 
1716 bool isDeletedHeader(llvm::StringRef HeaderName,
1717                      const std::set<llvm::StringRef> &HeadersToDelete) {
1718   return HeadersToDelete.count(HeaderName) ||
1719          HeadersToDelete.count(HeaderName.trim("\"<>"));
1720 }
1721 
1722 // FIXME: insert empty lines between newly created blocks.
1723 tooling::Replacements
1724 fixCppIncludeInsertions(StringRef Code, const tooling::Replacements &Replaces,
1725                         const FormatStyle &Style) {
1726   if (!Style.isCpp())
1727     return Replaces;
1728 
1729   tooling::Replacements HeaderInsertions;
1730   std::set<llvm::StringRef> HeadersToDelete;
1731   tooling::Replacements Result;
1732   for (const auto &R : Replaces) {
1733     if (isHeaderInsertion(R)) {
1734       // Replacements from \p Replaces must be conflict-free already, so we can
1735       // simply consume the error.
1736       llvm::consumeError(HeaderInsertions.add(R));
1737     } else if (isHeaderDeletion(R)) {
1738       HeadersToDelete.insert(R.getReplacementText());
1739     } else if (R.getOffset() == UINT_MAX) {
1740       llvm::errs() << "Insertions other than header #include insertion are "
1741                       "not supported! "
1742                    << R.getReplacementText() << "\n";
1743     } else {
1744       llvm::consumeError(Result.add(R));
1745     }
1746   }
1747   if (HeaderInsertions.empty() && HeadersToDelete.empty())
1748     return Replaces;
1749 
1750   llvm::Regex IncludeRegex(IncludeRegexPattern);
1751   llvm::Regex DefineRegex(R"(^[\t\ ]*#[\t\ ]*define[\t\ ]*[^\\]*$)");
1752   SmallVector<StringRef, 4> Matches;
1753 
1754   StringRef FileName = Replaces.begin()->getFilePath();
1755   IncludeCategoryManager Categories(Style, FileName);
1756 
1757   // Record the offset of the end of the last include in each category.
1758   std::map<int, int> CategoryEndOffsets;
1759   // All possible priorities.
1760   // Add 0 for main header and INT_MAX for headers that are not in any category.
1761   std::set<int> Priorities = {0, INT_MAX};
1762   for (const auto &Category : Style.IncludeCategories)
1763     Priorities.insert(Category.Priority);
1764   int FirstIncludeOffset = -1;
1765   // All new headers should be inserted after this offset.
1766   unsigned MinInsertOffset =
1767       getOffsetAfterHeaderGuardsAndComments(FileName, Code, Style);
1768   StringRef TrimmedCode = Code.drop_front(MinInsertOffset);
1769   // Max insertion offset in the original code.
1770   unsigned MaxInsertOffset =
1771       MinInsertOffset +
1772       getMaxHeaderInsertionOffset(FileName, TrimmedCode, Style);
1773   SmallVector<StringRef, 32> Lines;
1774   TrimmedCode.split(Lines, '\n');
1775   unsigned Offset = MinInsertOffset;
1776   unsigned NextLineOffset;
1777   std::set<StringRef> ExistingIncludes;
1778   for (auto Line : Lines) {
1779     NextLineOffset = std::min(Code.size(), Offset + Line.size() + 1);
1780     if (IncludeRegex.match(Line, &Matches)) {
1781       // The header name with quotes or angle brackets.
1782       StringRef IncludeName = Matches[2];
1783       ExistingIncludes.insert(IncludeName);
1784       // Only record the offset of current #include if we can insert after it.
1785       if (Offset <= MaxInsertOffset) {
1786         int Category = Categories.getIncludePriority(
1787             IncludeName, /*CheckMainHeader=*/FirstIncludeOffset < 0);
1788         CategoryEndOffsets[Category] = NextLineOffset;
1789         if (FirstIncludeOffset < 0)
1790           FirstIncludeOffset = Offset;
1791       }
1792       if (isDeletedHeader(IncludeName, HeadersToDelete)) {
1793         // If this is the last line without trailing newline, we need to make
1794         // sure we don't delete across the file boundary.
1795         unsigned Length = std::min(Line.size() + 1, Code.size() - Offset);
1796         llvm::Error Err =
1797             Result.add(tooling::Replacement(FileName, Offset, Length, ""));
1798         if (Err) {
1799           // Ignore the deletion on conflict.
1800           llvm::errs() << "Failed to add header deletion replacement for "
1801                        << IncludeName << ": " << llvm::toString(std::move(Err))
1802                        << "\n";
1803         }
1804       }
1805     }
1806     Offset = NextLineOffset;
1807   }
1808 
1809   // Populate CategoryEndOfssets:
1810   // - Ensure that CategoryEndOffset[Highest] is always populated.
1811   // - If CategoryEndOffset[Priority] isn't set, use the next higher value that
1812   //   is set, up to CategoryEndOffset[Highest].
1813   auto Highest = Priorities.begin();
1814   if (CategoryEndOffsets.find(*Highest) == CategoryEndOffsets.end()) {
1815     if (FirstIncludeOffset >= 0)
1816       CategoryEndOffsets[*Highest] = FirstIncludeOffset;
1817     else
1818       CategoryEndOffsets[*Highest] = MinInsertOffset;
1819   }
1820   // By this point, CategoryEndOffset[Highest] is always set appropriately:
1821   //  - to an appropriate location before/after existing #includes, or
1822   //  - to right after the header guard, or
1823   //  - to the beginning of the file.
1824   for (auto I = ++Priorities.begin(), E = Priorities.end(); I != E; ++I)
1825     if (CategoryEndOffsets.find(*I) == CategoryEndOffsets.end())
1826       CategoryEndOffsets[*I] = CategoryEndOffsets[*std::prev(I)];
1827 
1828   bool NeedNewLineAtEnd = !Code.empty() && Code.back() != '\n';
1829   for (const auto &R : HeaderInsertions) {
1830     auto IncludeDirective = R.getReplacementText();
1831     bool Matched = IncludeRegex.match(IncludeDirective, &Matches);
1832     assert(Matched && "Header insertion replacement must have replacement text "
1833                       "'#include ...'");
1834     (void)Matched;
1835     auto IncludeName = Matches[2];
1836     if (ExistingIncludes.find(IncludeName) != ExistingIncludes.end()) {
1837       DEBUG(llvm::dbgs() << "Skip adding existing include : " << IncludeName
1838                          << "\n");
1839       continue;
1840     }
1841     int Category =
1842         Categories.getIncludePriority(IncludeName, /*CheckMainHeader=*/true);
1843     Offset = CategoryEndOffsets[Category];
1844     std::string NewInclude = !IncludeDirective.endswith("\n")
1845                                  ? (IncludeDirective + "\n").str()
1846                                  : IncludeDirective.str();
1847     // When inserting headers at end of the code, also append '\n' to the code
1848     // if it does not end with '\n'.
1849     if (NeedNewLineAtEnd && Offset == Code.size()) {
1850       NewInclude = "\n" + NewInclude;
1851       NeedNewLineAtEnd = false;
1852     }
1853     auto NewReplace = tooling::Replacement(FileName, Offset, 0, NewInclude);
1854     auto Err = Result.add(NewReplace);
1855     if (Err) {
1856       llvm::consumeError(std::move(Err));
1857       unsigned NewOffset = Result.getShiftedCodePosition(Offset);
1858       NewReplace = tooling::Replacement(FileName, NewOffset, 0, NewInclude);
1859       Result = Result.merge(tooling::Replacements(NewReplace));
1860     }
1861   }
1862   return Result;
1863 }
1864 
1865 } // anonymous namespace
1866 
1867 llvm::Expected<tooling::Replacements>
1868 cleanupAroundReplacements(StringRef Code, const tooling::Replacements &Replaces,
1869                           const FormatStyle &Style) {
1870   // We need to use lambda function here since there are two versions of
1871   // `cleanup`.
1872   auto Cleanup = [](const FormatStyle &Style, StringRef Code,
1873                     std::vector<tooling::Range> Ranges,
1874                     StringRef FileName) -> tooling::Replacements {
1875     return cleanup(Style, Code, Ranges, FileName);
1876   };
1877   // Make header insertion replacements insert new headers into correct blocks.
1878   tooling::Replacements NewReplaces =
1879       fixCppIncludeInsertions(Code, Replaces, Style);
1880   return processReplacements(Cleanup, Code, NewReplaces, Style);
1881 }
1882 
1883 tooling::Replacements reformat(const FormatStyle &Style, StringRef Code,
1884                                ArrayRef<tooling::Range> Ranges,
1885                                StringRef FileName,
1886                                FormattingAttemptStatus *Status) {
1887   FormatStyle Expanded = expandPresets(Style);
1888   if (Expanded.DisableFormat)
1889     return tooling::Replacements();
1890   if (Expanded.Language == FormatStyle::LK_JavaScript && isMpegTS(Code))
1891     return tooling::Replacements();
1892 
1893   typedef std::function<tooling::Replacements(const Environment &)>
1894       AnalyzerPass;
1895   SmallVector<AnalyzerPass, 4> Passes;
1896 
1897   if (Style.Language == FormatStyle::LK_Cpp) {
1898     if (Style.FixNamespaceComments)
1899       Passes.emplace_back([&](const Environment &Env) {
1900         return NamespaceEndCommentsFixer(Env, Expanded).process();
1901       });
1902 
1903     if (Style.SortUsingDeclarations)
1904       Passes.emplace_back([&](const Environment &Env) {
1905         return UsingDeclarationsSorter(Env, Expanded).process();
1906       });
1907   }
1908 
1909   if (Style.Language == FormatStyle::LK_JavaScript &&
1910       Style.JavaScriptQuotes != FormatStyle::JSQS_Leave)
1911     Passes.emplace_back([&](const Environment &Env) {
1912       return JavaScriptRequoter(Env, Expanded).process();
1913     });
1914 
1915   Passes.emplace_back([&](const Environment &Env) {
1916     return Formatter(Env, Expanded, Status).process();
1917   });
1918 
1919   std::unique_ptr<Environment> Env =
1920       Environment::CreateVirtualEnvironment(Code, FileName, Ranges);
1921   llvm::Optional<std::string> CurrentCode = None;
1922   tooling::Replacements Fixes;
1923   for (size_t I = 0, E = Passes.size(); I < E; ++I) {
1924     tooling::Replacements PassFixes = Passes[I](*Env);
1925     auto NewCode = applyAllReplacements(
1926         CurrentCode ? StringRef(*CurrentCode) : Code, PassFixes);
1927     if (NewCode) {
1928       Fixes = Fixes.merge(PassFixes);
1929       if (I + 1 < E) {
1930         CurrentCode = std::move(*NewCode);
1931         Env = Environment::CreateVirtualEnvironment(
1932             *CurrentCode, FileName,
1933             tooling::calculateRangesAfterReplacements(Fixes, Ranges));
1934       }
1935     }
1936   }
1937 
1938   return Fixes;
1939 }
1940 
1941 tooling::Replacements cleanup(const FormatStyle &Style, StringRef Code,
1942                               ArrayRef<tooling::Range> Ranges,
1943                               StringRef FileName) {
1944   // cleanups only apply to C++ (they mostly concern ctor commas etc.)
1945   if (Style.Language != FormatStyle::LK_Cpp)
1946     return tooling::Replacements();
1947   std::unique_ptr<Environment> Env =
1948       Environment::CreateVirtualEnvironment(Code, FileName, Ranges);
1949   Cleaner Clean(*Env, Style);
1950   return Clean.process();
1951 }
1952 
1953 tooling::Replacements reformat(const FormatStyle &Style, StringRef Code,
1954                                ArrayRef<tooling::Range> Ranges,
1955                                StringRef FileName, bool *IncompleteFormat) {
1956   FormattingAttemptStatus Status;
1957   auto Result = reformat(Style, Code, Ranges, FileName, &Status);
1958   if (!Status.FormatComplete)
1959     *IncompleteFormat = true;
1960   return Result;
1961 }
1962 
1963 tooling::Replacements fixNamespaceEndComments(const FormatStyle &Style,
1964                                               StringRef Code,
1965                                               ArrayRef<tooling::Range> Ranges,
1966                                               StringRef FileName) {
1967   std::unique_ptr<Environment> Env =
1968       Environment::CreateVirtualEnvironment(Code, FileName, Ranges);
1969   NamespaceEndCommentsFixer Fix(*Env, Style);
1970   return Fix.process();
1971 }
1972 
1973 tooling::Replacements sortUsingDeclarations(const FormatStyle &Style,
1974                                             StringRef Code,
1975                                             ArrayRef<tooling::Range> Ranges,
1976                                             StringRef FileName) {
1977   std::unique_ptr<Environment> Env =
1978       Environment::CreateVirtualEnvironment(Code, FileName, Ranges);
1979   UsingDeclarationsSorter Sorter(*Env, Style);
1980   return Sorter.process();
1981 }
1982 
1983 LangOptions getFormattingLangOpts(const FormatStyle &Style) {
1984   LangOptions LangOpts;
1985   LangOpts.CPlusPlus = 1;
1986   LangOpts.CPlusPlus11 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
1987   LangOpts.CPlusPlus14 = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
1988   LangOpts.CPlusPlus1z = Style.Standard == FormatStyle::LS_Cpp03 ? 0 : 1;
1989   LangOpts.LineComment = 1;
1990   bool AlternativeOperators = Style.isCpp();
1991   LangOpts.CXXOperatorNames = AlternativeOperators ? 1 : 0;
1992   LangOpts.Bool = 1;
1993   LangOpts.ObjC1 = 1;
1994   LangOpts.ObjC2 = 1;
1995   LangOpts.MicrosoftExt = 1;    // To get kw___try, kw___finally.
1996   LangOpts.DeclSpecKeyword = 1; // To get __declspec.
1997   return LangOpts;
1998 }
1999 
2000 const char *StyleOptionHelpDescription =
2001     "Coding style, currently supports:\n"
2002     "  LLVM, Google, Chromium, Mozilla, WebKit.\n"
2003     "Use -style=file to load style configuration from\n"
2004     ".clang-format file located in one of the parent\n"
2005     "directories of the source file (or current\n"
2006     "directory for stdin).\n"
2007     "Use -style=\"{key: value, ...}\" to set specific\n"
2008     "parameters, e.g.:\n"
2009     "  -style=\"{BasedOnStyle: llvm, IndentWidth: 8}\"";
2010 
2011 static FormatStyle::LanguageKind getLanguageByFileName(StringRef FileName) {
2012   if (FileName.endswith(".java"))
2013     return FormatStyle::LK_Java;
2014   if (FileName.endswith_lower(".js") || FileName.endswith_lower(".ts"))
2015     return FormatStyle::LK_JavaScript; // JavaScript or TypeScript.
2016   if (FileName.endswith(".m") || FileName.endswith(".mm"))
2017     return FormatStyle::LK_ObjC;
2018   if (FileName.endswith_lower(".proto") ||
2019       FileName.endswith_lower(".protodevel"))
2020     return FormatStyle::LK_Proto;
2021   if (FileName.endswith_lower(".td"))
2022     return FormatStyle::LK_TableGen;
2023   return FormatStyle::LK_Cpp;
2024 }
2025 
2026 llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
2027                                      StringRef FallbackStyleName,
2028                                      StringRef Code, vfs::FileSystem *FS) {
2029   if (!FS) {
2030     FS = vfs::getRealFileSystem().get();
2031   }
2032   FormatStyle Style = getLLVMStyle();
2033   Style.Language = getLanguageByFileName(FileName);
2034 
2035   // This is a very crude detection of whether a header contains ObjC code that
2036   // should be improved over time and probably be done on tokens, not one the
2037   // bare content of the file.
2038   if (Style.Language == FormatStyle::LK_Cpp && FileName.endswith(".h") &&
2039       (Code.contains("\n- (") || Code.contains("\n+ (")))
2040     Style.Language = FormatStyle::LK_ObjC;
2041 
2042   FormatStyle FallbackStyle = getNoStyle();
2043   if (!getPredefinedStyle(FallbackStyleName, Style.Language, &FallbackStyle))
2044     return make_string_error("Invalid fallback style \"" + FallbackStyleName);
2045 
2046   if (StyleName.startswith("{")) {
2047     // Parse YAML/JSON style from the command line.
2048     if (std::error_code ec = parseConfiguration(StyleName, &Style))
2049       return make_string_error("Error parsing -style: " + ec.message());
2050     return Style;
2051   }
2052 
2053   if (!StyleName.equals_lower("file")) {
2054     if (!getPredefinedStyle(StyleName, Style.Language, &Style))
2055       return make_string_error("Invalid value for -style");
2056     return Style;
2057   }
2058 
2059   // Look for .clang-format/_clang-format file in the file's parent directories.
2060   SmallString<128> UnsuitableConfigFiles;
2061   SmallString<128> Path(FileName);
2062   if (std::error_code EC = FS->makeAbsolute(Path))
2063     return make_string_error(EC.message());
2064 
2065   for (StringRef Directory = Path; !Directory.empty();
2066        Directory = llvm::sys::path::parent_path(Directory)) {
2067 
2068     auto Status = FS->status(Directory);
2069     if (!Status ||
2070         Status->getType() != llvm::sys::fs::file_type::directory_file) {
2071       continue;
2072     }
2073 
2074     SmallString<128> ConfigFile(Directory);
2075 
2076     llvm::sys::path::append(ConfigFile, ".clang-format");
2077     DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
2078 
2079     Status = FS->status(ConfigFile.str());
2080     bool FoundConfigFile =
2081         Status && (Status->getType() == llvm::sys::fs::file_type::regular_file);
2082     if (!FoundConfigFile) {
2083       // Try _clang-format too, since dotfiles are not commonly used on Windows.
2084       ConfigFile = Directory;
2085       llvm::sys::path::append(ConfigFile, "_clang-format");
2086       DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
2087       Status = FS->status(ConfigFile.str());
2088       FoundConfigFile = Status && (Status->getType() ==
2089                                    llvm::sys::fs::file_type::regular_file);
2090     }
2091 
2092     if (FoundConfigFile) {
2093       llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
2094           FS->getBufferForFile(ConfigFile.str());
2095       if (std::error_code EC = Text.getError())
2096         return make_string_error(EC.message());
2097       if (std::error_code ec =
2098               parseConfiguration(Text.get()->getBuffer(), &Style)) {
2099         if (ec == ParseError::Unsuitable) {
2100           if (!UnsuitableConfigFiles.empty())
2101             UnsuitableConfigFiles.append(", ");
2102           UnsuitableConfigFiles.append(ConfigFile);
2103           continue;
2104         }
2105         return make_string_error("Error reading " + ConfigFile + ": " +
2106                                  ec.message());
2107       }
2108       DEBUG(llvm::dbgs() << "Using configuration file " << ConfigFile << "\n");
2109       return Style;
2110     }
2111   }
2112   if (!UnsuitableConfigFiles.empty())
2113     return make_string_error("Configuration file(s) do(es) not support " +
2114                              getLanguageName(Style.Language) + ": " +
2115                              UnsuitableConfigFiles);
2116   return FallbackStyle;
2117 }
2118 
2119 } // namespace format
2120 } // namespace clang
2121