Move the command line source location parsing from clang-cc.cpp into "include/Frontend/CommandLineSourceLoc.h".

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74012 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 39d839e..f38b7ff 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -33,6 +33,7 @@
 #include "clang/Frontend/PCHReader.h"
 #include "clang/Frontend/TextDiagnosticBuffer.h"
 #include "clang/Frontend/TextDiagnosticPrinter.h"
+#include "clang/Frontend/CommandLineSourceLoc.h"
 #include "clang/Frontend/Utils.h"
 #include "clang/Analysis/PathDiagnostic.h"
 #include "clang/CodeGen/ModuleBuilder.h"
@@ -79,85 +80,19 @@
 // Source Location Parser
 //===----------------------------------------------------------------------===//
 
-/// \brief A source location that has been parsed on the command line.
-struct ParsedSourceLocation {
-  std::string FileName;
-  unsigned Line;
-  unsigned Column;
-
-  /// \brief Try to resolve the file name of a parsed source location.
-  ///
-  /// \returns true if there was an error, false otherwise.
-  bool ResolveLocation(FileManager &FileMgr, RequestedSourceLocation &Result);
-};
-
-bool
-ParsedSourceLocation::ResolveLocation(FileManager &FileMgr, 
-                                      RequestedSourceLocation &Result) {
-  const FileEntry *File = FileMgr.getFile(FileName);
+static bool ResolveParsedLocation(ParsedSourceLocation &ParsedLoc,
+                                  FileManager &FileMgr,
+                                  RequestedSourceLocation &Result) {
+  const FileEntry *File = FileMgr.getFile(ParsedLoc.FileName);
   if (!File)
     return true;
 
   Result.File = File;
-  Result.Line = Line;
-  Result.Column = Column;
+  Result.Line = ParsedLoc.Line;
+  Result.Column = ParsedLoc.Column;
   return false;
 }
 
-namespace llvm {
-  namespace cl {
-    /// \brief Command-line option parser that parses source locations.
-    ///
-    /// Source locations are of the form filename:line:column.
-    template<>
-    class parser<ParsedSourceLocation> 
-      : public basic_parser<ParsedSourceLocation> {
-    public:
-      bool parse(Option &O, const char *ArgName, 
-                 const std::string &ArgValue,
-                 ParsedSourceLocation &Val);
-    };
-
-    bool 
-    parser<ParsedSourceLocation>::
-    parse(Option &O, const char *ArgName, const std::string &ArgValue, 
-          ParsedSourceLocation &Val) {
-      using namespace clang;
-
-      const char *ExpectedFormat 
-        = "source location must be of the form filename:line:column";
-      std::string::size_type SecondColon = ArgValue.rfind(':');
-      if (SecondColon == std::string::npos) {
-        std::fprintf(stderr, "%s\n", ExpectedFormat);
-        return true;
-      }
-      char *EndPtr;
-      long Column 
-        = std::strtol(ArgValue.c_str() + SecondColon + 1, &EndPtr, 10);
-      if (EndPtr != ArgValue.c_str() + ArgValue.size()) {
-        std::fprintf(stderr, "%s\n", ExpectedFormat);
-        return true;
-      }
-
-      std::string::size_type FirstColon = ArgValue.rfind(':', SecondColon-1);
-      if (FirstColon == std::string::npos) {
-        std::fprintf(stderr, "%s\n", ExpectedFormat);
-        return true;
-      }
-      long Line = std::strtol(ArgValue.c_str() + FirstColon + 1, &EndPtr, 10);
-      if (EndPtr != ArgValue.c_str() + SecondColon) {
-        std::fprintf(stderr, "%s\n", ExpectedFormat);
-        return true;
-      }
-      
-      Val.FileName = ArgValue.substr(0, FirstColon);
-      Val.Line = Line;
-      Val.Column = Column;
-      return false;
-    }
-  }
-}
-
 //===----------------------------------------------------------------------===//
 // Global options.
 //===----------------------------------------------------------------------===//
@@ -1979,8 +1914,8 @@
     for (unsigned Idx = 0, Last = FixItAtLocations.size(); 
          Idx != Last; ++Idx) {
       RequestedSourceLocation Requested;
-      if (FixItAtLocations[Idx].ResolveLocation(PP.getFileManager(), 
-                                                Requested)) {
+      if (ResolveParsedLocation(FixItAtLocations[Idx],
+                                PP.getFileManager(), Requested)) {
         fprintf(stderr, "FIX-IT could not find file \"%s\"\n",
                 FixItAtLocations[Idx].FileName.c_str());
       } else {