]> granicus.if.org Git - clang/commitdiff
Added an option to specify fallback style.
authorAlexander Kornienko <alexfh@google.com>
Mon, 2 Dec 2013 15:21:38 +0000 (15:21 +0000)
committerAlexander Kornienko <alexfh@google.com>
Mon, 2 Dec 2013 15:21:38 +0000 (15:21 +0000)
Summary:
Added -fallback-style option. Changed clang-format to stop searching
for .clang-format when an invalid file is found.

Reviewers: djasper, klimek

Reviewed By: djasper

CC: cfe-commits, klimek
Differential Revision: http://llvm-reviews.chandlerc.com/D2292

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196108 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Format/Format.h
lib/Format/Format.cpp
test/Format/style-on-command-line.cpp
tools/clang-format/ClangFormat.cpp

index 3ef429efa078abbf619a9004aeb965451f1f7dd1..05cdccb756cdb9da9a304d7e9c78b6ba755d4851 100644 (file)
@@ -402,10 +402,13 @@ extern const char *StyleOptionHelpDescription;
 /// above.
 /// \param[in] FileName Path to start search for .clang-format if \c StyleName
 /// == "file".
+/// \param[in] FallbackStyle The name of a predefined style used to fallback to
+/// in case the style can't be determined from \p StyleName.
 ///
 /// \returns FormatStyle as specified by \c StyleName. If no style could be
 /// determined, the default is LLVM Style (see getLLVMStyle()).
-FormatStyle getStyle(StringRef StyleName, StringRef FileName);
+FormatStyle getStyle(StringRef StyleName, StringRef FileName,
+                     StringRef FallbackStyle);
 
 } // end namespace format
 } // end namespace clang
index 28ef19e192f9cec7ef4c366569aac3f22de45f2a..ee9fe7625db609ee0dc625c4bd2def6eb9545cb5 100644 (file)
@@ -1661,12 +1661,14 @@ static void fillLanguageByFileName(StringRef FileName, FormatStyle *Style) {
   }
 }
 
-FormatStyle getStyle(StringRef StyleName, StringRef FileName) {
-  // FIXME: Configure fallback style from outside (add a command line option).
-  // Fallback style in case the rest of this function can't determine a style.
-  StringRef FallbackStyle = "LLVM";
+FormatStyle getStyle(StringRef StyleName, StringRef FileName,
+                     StringRef FallbackStyle) {
   FormatStyle Style;
-  getPredefinedStyle(FallbackStyle, &Style);
+  if (!getPredefinedStyle(FallbackStyle, &Style)) {
+    llvm::errs() << "Invalid fallback style \"" << FallbackStyle
+                 << "\" using LLVM style\n";
+    return getLLVMStyle();
+  }
   fillLanguageByFileName(FileName, &Style);
 
   if (StyleName.startswith("{")) {
@@ -1715,18 +1717,18 @@ FormatStyle getStyle(StringRef StyleName, StringRef FileName) {
       if (llvm::error_code ec =
               llvm::MemoryBuffer::getFile(ConfigFile.c_str(), Text)) {
         llvm::errs() << ec.message() << "\n";
-        continue;
+        break;
       }
       if (llvm::error_code ec = parseConfiguration(Text->getBuffer(), &Style)) {
         if (ec == llvm::errc::not_supported) {
           if (!UnsuitableConfigFiles.empty())
             UnsuitableConfigFiles.append(", ");
           UnsuitableConfigFiles.append(ConfigFile);
-        } else {
-          llvm::errs() << "Error reading " << ConfigFile << ": " << ec.message()
-                       << "\n";
+          continue;
         }
-        continue;
+        llvm::errs() << "Error reading " << ConfigFile << ": " << ec.message()
+                     << "\n";
+        break;
       }
       DEBUG(llvm::dbgs() << "Using configuration file " << ConfigFile << "\n");
       return Style;
index 22131a1ebe1bb0740490f19622e87a5471896a0b..554a67e264d74c8f34d270ea85a6a4453ff9dc70 100644 (file)
@@ -7,7 +7,7 @@
 // RUN: printf "BasedOnStyle: google\nIndentWidth: 5\n" > %T/.clang-format
 // RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK5 %s
 // RUN: printf "\n" > %T/.clang-format
-// RUN: clang-format -style=file %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK6 %s
+// RUN: clang-format -style=file -fallback-style=webkit %t.cpp 2>&1 | FileCheck -strict-whitespace -check-prefix=CHECK6 %s
 // RUN: [ ! -e %T/.clang-format ] || rm %T/.clang-format
 // RUN: [ ! -e %T/_clang-format ] || rm %T/_clang-format
 // RUN: printf "BasedOnStyle: google\nIndentWidth: 6\n" > %T/_clang-format
@@ -22,7 +22,8 @@ void f() {
 // CHECK4: {{^  int \*i;$}}
 // CHECK5: {{^     int\* i;$}}
 // CHECK6: {{^Error reading .*\.clang-format: Invalid argument}}
-// XCHECK6X: {{^  int \*i;$}}
+// CHECK6: {{^Can't find usable .clang-format, using webkit style$}}
+// CHECK6: {{^    int\* i;$}}
 // CHECK7: {{^      int\* i;$}}
 int*i;
 int j;
index 768165b92e9d59b225dfa1d777d9b4ed10e1ab9f..513439649d282c94591e78556701d4224b2522ce 100644 (file)
@@ -62,6 +62,12 @@ static cl::opt<std::string>
     Style("style",
           cl::desc(clang::format::StyleOptionHelpDescription),
           cl::init("file"), cl::cat(ClangFormatCategory));
+static cl::opt<std::string>
+FallbackStyle("fallback-style",
+              cl::desc("The name of the predefined style used as a fallback in "
+                       "case clang-format is invoked with -style=file, but can "
+                       "not find the .clang-format file to use."),
+              cl::init("LLVM"), cl::cat(ClangFormatCategory));
 
 static cl::opt<std::string>
 AssumeFilename("assume-filename",
@@ -192,8 +198,8 @@ static bool format(StringRef FileName) {
   if (fillRanges(Sources, ID, Code.get(), Ranges))
     return true;
 
-  FormatStyle FormatStyle =
-      getStyle(Style, (FileName == "-") ? AssumeFilename : FileName);
+  FormatStyle FormatStyle = getStyle(
+      Style, (FileName == "-") ? AssumeFilename : FileName, FallbackStyle);
   Lexer Lex(ID, Sources.getBuffer(ID), Sources,
             getFormattingLangOpts(FormatStyle.Standard));
   tooling::Replacements Replaces = reformat(FormatStyle, Lex, Sources, Ranges);
@@ -256,7 +262,8 @@ int main(int argc, const char **argv) {
   if (DumpConfig) {
     std::string Config =
         clang::format::configurationAsText(clang::format::getStyle(
-            Style, FileNames.empty() ? AssumeFilename : FileNames[0]));
+            Style, FileNames.empty() ? AssumeFilename : FileNames[0],
+            FallbackStyle));
     llvm::outs() << Config << "\n";
     return 0;
   }