Moving style option formatting to libFormat

The help text for clang-format's -style option and the function that processes
its value is moved to libFormat in this patch. The goal is to enable other
tools that use libFormat and also have a -style option to behave consistently
with clang-format.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191666 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-format/ClangFormat.cpp b/tools/clang-format/ClangFormat.cpp
index 71dcfc5..9334bb5 100644
--- a/tools/clang-format/ClangFormat.cpp
+++ b/tools/clang-format/ClangFormat.cpp
@@ -63,15 +63,7 @@
            cl::cat(ClangFormatCategory));
 static cl::opt<std::string>
     Style("style",
-          cl::desc("Coding style, currently supports:\n"
-                   "  LLVM, Google, Chromium, Mozilla, WebKit.\n"
-                   "Use -style=file to load style configuration from\n"
-                   ".clang-format file located in one of the parent\n"
-                   "directories of the source file (or current\n"
-                   "directory for stdin).\n"
-                   "Use -style=\"{key: value, ...}\" to set specific\n"
-                   "parameters, e.g.:\n"
-                   "  -style=\"{BasedOnStyle: llvm, IndentWidth: 8}\""),
+          cl::desc(clang::format::StyleOptionHelpDescription),
           cl::init("file"), cl::cat(ClangFormatCategory));
 
 static cl::opt<std::string>
@@ -114,72 +106,6 @@
   return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User);
 }
 
-FormatStyle getStyle(StringRef StyleName, StringRef FileName) {
-  FormatStyle Style;
-  getPredefinedStyle(FallbackStyle, &Style);
-
-  if (StyleName.startswith("{")) {
-    // Parse YAML/JSON style from the command line.
-    if (error_code ec = parseConfiguration(StyleName, &Style)) {
-      llvm::errs() << "Error parsing -style: " << ec.message()
-                   << ", using " << FallbackStyle << " style\n";
-    }
-    return Style;
-  }
-
-  if (!StyleName.equals_lower("file")) {
-    if (!getPredefinedStyle(StyleName, &Style))
-      llvm::errs() << "Invalid value for -style, using " << FallbackStyle
-                   << " style\n";
-    return Style;
-  }
-
-  if (FileName == "-")
-    FileName = AssumeFilename;
-  SmallString<128> Path(FileName);
-  llvm::sys::fs::make_absolute(Path);
-  for (StringRef Directory = Path;
-       !Directory.empty();
-       Directory = llvm::sys::path::parent_path(Directory)) {
-    if (!llvm::sys::fs::is_directory(Directory))
-      continue;
-    SmallString<128> ConfigFile(Directory);
-
-    llvm::sys::path::append(ConfigFile, ".clang-format");
-    DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
-    bool IsFile = false;
-    // Ignore errors from is_regular_file: we only need to know if we can read
-    // the file or not.
-    llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile);
-
-    if (!IsFile) {
-      // Try _clang-format too, since dotfiles are not commonly used on Windows.
-      ConfigFile = Directory;
-      llvm::sys::path::append(ConfigFile, "_clang-format");
-      DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");
-      llvm::sys::fs::is_regular_file(Twine(ConfigFile), IsFile);
-    }
-
-    if (IsFile) {
-      OwningPtr<MemoryBuffer> Text;
-      if (error_code ec = MemoryBuffer::getFile(ConfigFile, Text)) {
-        llvm::errs() << ec.message() << "\n";
-        continue;
-      }
-      if (error_code ec = parseConfiguration(Text->getBuffer(), &Style)) {
-        llvm::errs() << "Error reading " << ConfigFile << ": " << ec.message()
-                     << "\n";
-        continue;
-      }
-      DEBUG(llvm::dbgs() << "Using configuration file " << ConfigFile << "\n");
-      return Style;
-    }
-  }
-  llvm::errs() << "Can't find usable .clang-format, using " << FallbackStyle
-               << " style\n";
-  return Style;
-}
-
 // Parses <start line>:<end line> input to a pair of line numbers.
 // Returns true on error.
 static bool parseLineRange(StringRef Input, unsigned &FromLine,
@@ -269,7 +195,8 @@
   if (fillRanges(Sources, ID, Code.get(), Ranges))
     return true;
 
-  FormatStyle FormatStyle = getStyle(Style, FileName);
+  FormatStyle FormatStyle =
+      getStyle(Style, (FileName == "-") ? AssumeFilename : FileName);
   Lexer Lex(ID, Sources.getBuffer(ID), Sources,
             getFormattingLangOpts(FormatStyle.Standard));
   tooling::Replacements Replaces = reformat(FormatStyle, Lex, Sources, Ranges);
@@ -340,8 +267,9 @@
     cl::PrintHelpMessage();
 
   if (DumpConfig) {
-    std::string Config = clang::format::configurationAsText(
-        clang::format::getStyle(Style, FileNames.empty() ? "-" : FileNames[0]));
+    std::string Config =
+        clang::format::configurationAsText(clang::format::getStyle(
+            Style, FileNames.empty() ? AssumeFilename : FileNames[0]));
     llvm::outs() << Config << "\n";
     return 0;
   }