Move code completion options to clang-cc

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@87050 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp
index 7181b7c..bedf852 100644
--- a/tools/clang-cc/Options.cpp
+++ b/tools/clang-cc/Options.cpp
@@ -293,6 +293,20 @@
 
 namespace frontendoptions {
 
+static llvm::cl::opt<ParsedSourceLocation>
+CodeCompletionAt("code-completion-at",
+                 llvm::cl::value_desc("file:line:column"),
+              llvm::cl::desc("Dump code-completion information at a location"));
+
+static llvm::cl::opt<bool>
+CodeCompletionDebugPrinter("code-completion-debug-printer",
+                      llvm::cl::desc("Use the \"debug\" code-completion print"),
+                           llvm::cl::init(true));
+
+static llvm::cl::opt<bool>
+CodeCompletionWantsMacros("code-completion-macros",
+                 llvm::cl::desc("Include macros in code-completion results"));
+
 static llvm::cl::opt<bool>
 DisableFree("disable-free",
            llvm::cl::desc("Disable freeing of memory on exit"),
@@ -758,15 +772,18 @@
 void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
   using namespace frontendoptions;
 
+  Opts.CodeCompletionAt = CodeCompletionAt;
+  Opts.DebugCodeCompletionPrinter = CodeCompletionDebugPrinter;
   Opts.DisableFree = DisableFree;
   Opts.EmptyInputOnly = EmptyInputOnly;
   Opts.FixItAll = FixItAll;
   Opts.FixItLocations = FixItAtLocations;
-  Opts.RelocatablePCH = RelocatablePCH;
-  Opts.ShowStats = Stats;
-  Opts.ShowTimers = TimeReport;
   Opts.InputFilenames = InputFilenames;
   Opts.OutputFile = OutputFile;
+  Opts.RelocatablePCH = RelocatablePCH;
+  Opts.ShowMacrosInCodeCompletion = CodeCompletionWantsMacros;
+  Opts.ShowStats = Stats;
+  Opts.ShowTimers = TimeReport;
   Opts.ViewClassInheritance = InheritanceViewCls;
 
   // '-' is the default input if none is given.
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 1b9578c..8081cee 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -76,51 +76,6 @@
 using namespace clang;
 
 //===----------------------------------------------------------------------===//
-// Code Completion Options
-//===----------------------------------------------------------------------===//
-
-enum CodeCompletionPrinter {
-  CCP_Debug,
-  CCP_CIndex
-};
-
-static llvm::cl::opt<ParsedSourceLocation>
-CodeCompletionAt("code-completion-at",
-                 llvm::cl::value_desc("file:line:column"),
-              llvm::cl::desc("Dump code-completion information at a location"));
-
-static llvm::cl::opt<CodeCompletionPrinter>
-CodeCompletionPrinter("code-completion-printer",
-                      llvm::cl::desc("Choose output type:"),
-                      llvm::cl::init(CCP_Debug),
-                      llvm::cl::values(
-                        clEnumValN(CCP_Debug, "debug",
-                          "Debug code-completion results"),
-                        clEnumValN(CCP_CIndex, "cindex",
-                          "Code-completion results for the CIndex library"),
-                        clEnumValEnd));
-
-static llvm::cl::opt<bool>
-CodeCompletionWantsMacros("code-completion-macros",
-                 llvm::cl::desc("Include macros in code-completion results"));
-
-/// \brief Buld a new code-completion consumer that prints the results of
-/// code completion to standard output.
-static CodeCompleteConsumer *BuildPrintingCodeCompleter(Sema &S, void *) {
-  switch (CodeCompletionPrinter.getValue()) {
-  case CCP_Debug:
-    return new PrintingCodeCompleteConsumer(S, CodeCompletionWantsMacros,
-                                            llvm::outs());
-
-  case CCP_CIndex:
-    return new CIndexCodeCompleteConsumer(S, CodeCompletionWantsMacros,
-                                          llvm::outs());
-  };
-
-  return 0;
-}
-
-//===----------------------------------------------------------------------===//
 // Frontend Actions
 //===----------------------------------------------------------------------===//
 
@@ -253,7 +208,7 @@
           llvm::cl::desc("Target a particular ABI type"));
 
 //===----------------------------------------------------------------------===//
-// SourceManager initialization.
+// Utility Methods
 //===----------------------------------------------------------------------===//
 
 static bool InitializeSourceManager(Preprocessor &PP,
@@ -287,10 +242,6 @@
   return false;
 }
 
-//===----------------------------------------------------------------------===//
-// Preprocessor construction
-//===----------------------------------------------------------------------===//
-
 std::string GetBuiltinIncludePath(const char *Argv0) {
   llvm::sys::Path P =
     llvm::sys::Path::GetMainExecutable(Argv0,
@@ -349,6 +300,19 @@
   return PP;
 }
 
+/// \brief Buld a new code-completion consumer that prints the results of
+/// code completion to standard output.
+static CodeCompleteConsumer *BuildPrintingCodeCompleter(Sema &S,
+                                                        void *UserData) {
+  const FrontendOptions &Opts = *(FrontendOptions*)UserData;
+  if (Opts.DebugCodeCompletionPrinter)
+    return new PrintingCodeCompleteConsumer(S, Opts.ShowMacrosInCodeCompletion,
+                                            llvm::outs());
+
+  return new CIndexCodeCompleteConsumer(S, Opts.ShowMacrosInCodeCompletion,
+                                        llvm::outs());
+}
+
 //===----------------------------------------------------------------------===//
 // Basic Parser driver
 //===----------------------------------------------------------------------===//
@@ -696,22 +660,23 @@
       return;
 
     CodeCompleteConsumer *(*CreateCodeCompleter)(Sema &, void *) = 0;
-    void *CreateCodeCompleterData = 0;
+    void *CreateCodeCompleterData = (void*) &FEOpts;
 
-    if (!CodeCompletionAt.FileName.empty()) {
+    if (!FEOpts.CodeCompletionAt.FileName.empty()) {
       // Tell the source manager to chop off the given file at a specific
       // line and column.
       if (const FileEntry *Entry
-            = PP.getFileManager().getFile(CodeCompletionAt.FileName)) {
+            = PP.getFileManager().getFile(FEOpts.CodeCompletionAt.FileName)) {
         // Truncate the named file at the given line/column.
-        PP.getSourceManager().truncateFileAt(Entry, CodeCompletionAt.Line,
-                                             CodeCompletionAt.Column);
+        PP.getSourceManager().truncateFileAt(Entry,
+                                             FEOpts.CodeCompletionAt.Line,
+                                             FEOpts.CodeCompletionAt.Column);
 
         // Set up the creation routine for code-completion.
         CreateCodeCompleter = BuildPrintingCodeCompleter;
       } else {
         PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file)
-          << CodeCompletionAt.FileName;
+          << FEOpts.CodeCompletionAt.FileName;
       }
     }