Even better now: no macros, no include magic and no dependency on linkage order.<br><br><div class="gmail_quote">On Fri, Aug 17, 2012 at 5:21 AM, Alexander Kornienko <span dir="ltr"><<a href="mailto:alexfh@google.com" target="_blank">alexfh@google.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="gmail_quote"><div class="im">On Fri, Aug 17, 2012 at 11:41 AM, Chandler Carruth <span dir="ltr"><<a href="mailto:chandlerc@google.com" target="_blank">chandlerc@google.com</a>></span> wrote:<br></div><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Er, my suggestion was to make these *static* variables, yes, even though they are in a header file, and then to document thoroughly that this header file is *not* for use within a library, but for use directly within the file defining main.</blockquote>

</div><div>As Manuel already noted, there was an idea to make definition of these variables explicit via a macro. And I didn't find a better way to implement that. If you think that a special "include-once-per-binary" header is still better, I can switch to this approach. </div>
<div class="im">
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>The current patch is different from that, can you describe how? In general the comments weren't clear enough for me to be confident in how you expect this file to be used...</div>

</blockquote></div><div>Ok, I moved the usage example to the top and added some comments. Is it better?</div><div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 17, 2012 at 2:26 AM, Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

+using namespace llvm;<br>
<br>
Remove from header.<br>
<br>
Appart from that, lgtm, minus Chandler's approval of the general idea.<br>
<div><div><br>
On Thu, Aug 16, 2012 at 7:17 PM, Alexander Kornienko <<a href="mailto:alexfh@google.com" target="_blank">alexfh@google.com</a>> wrote:<br>
> On Thu, Aug 16, 2012 at 7:04 PM, Manuel Klimek <<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>> wrote:<br>
>><br>
>> On Thu, Aug 16, 2012 at 5:45 PM, Alexander Kornienko <<a href="mailto:alexfh@google.com" target="_blank">alexfh@google.com</a>><br>
>> wrote:<br>
>> > Now it's a bit uglier, but doesn't use CommandLine Library in an<br>
>> > unsupported<br>
>> > way.<br>
>> > Chandler, please take a look if it seems better to you.<br>
>><br>
>> After a short discussion off-list we came to the conclusion that<br>
>> tooling::CommonOptionsParser is a better name for the class, and<br>
>> especially makes the responsibilities clearer...<br>
><br>
> A new patch is attached.<br>
><br>
>><br>
>><br>
>> > BTW, we still have a number of alien options defined in some llvm<br>
>> > libraries<br>
>> > we link with. Should we try to avoid that by de-globalizing cl library<br>
>> > or is<br>
>> > someone working on its replacement/refactoring now?<br>
><br></div></div></blockquote></div></div></div></div></blockquote></div></div></div></blockquote></div><div><br></div>-- <br><div>Best regards,</div><div>Alexander Kornienko</div><br>
<div><div><font face="courier new, monospace">Index: tools/clang/include/clang/Tooling/CommandLineClangTool.h</font></div><div><font face="courier new, monospace">===================================================================</font></div>
<div><font face="courier new, monospace">--- tools/clang/include/clang/Tooling/CommandLineClangTool.h    (revision 162110)</font></div><div><font face="courier new, monospace">+++ tools/clang/include/clang/Tooling/CommandLineClangTool.h    (working copy)</font></div>
<div><font face="courier new, monospace">@@ -1,80 +0,0 @@</font></div><div><font face="courier new, monospace">-//===- CommandLineClangTool.h - command-line clang tools driver -*- C++ -*-===//</font></div><div><font face="courier new, monospace">-//</font></div>
<div><font face="courier new, monospace">-//                     The LLVM Compiler Infrastructure</font></div><div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-// This file is distributed under the University of Illinois Open Source</font></div>
<div><font face="courier new, monospace">-// License. See LICENSE.TXT for details.</font></div><div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//  This file implements the CommandLineClangTool class used to run clang</font></div><div><font face="courier new, monospace">-//  tools as separate command-line applications with a consistent common</font></div>
<div><font face="courier new, monospace">-//  interface for handling compilation database and input files.</font></div><div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//  It provides a common subset of command-line options, common algorithm</font></div>
<div><font face="courier new, monospace">-//  for locating a compilation database and source files, and help messages</font></div><div><font face="courier new, monospace">-//  for the basic command-line interface.</font></div>
<div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//  It creates a CompilationDatabase, initializes a ClangTool and runs a</font></div><div><font face="courier new, monospace">-//  user-specified FrontendAction over all TUs in which the given files are</font></div>
<div><font face="courier new, monospace">-//  compiled.</font></div><div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//  This class uses the Clang Tooling infrastructure, see</font></div>
<div><font face="courier new, monospace">-//    <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a></font></div><div><font face="courier new, monospace">-//  for details on setting it up with LLVM source tree.</font></div>
<div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//===----------------------------------------------------------------------===//</font></div><div><font face="courier new, monospace">-</font></div>
<div><font face="courier new, monospace">-#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H</font></div><div><font face="courier new, monospace">-#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-#include "llvm/Support/CommandLine.h"</font></div><div><font face="courier new, monospace">-#include "clang/Tooling/CompilationDatabase.h"</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-namespace clang {</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-namespace tooling {</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-class CompilationDatabase;</font></div><div><font face="courier new, monospace">-class FrontendActionFactory;</font></div><div>
<font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-/// \brief A common driver for command-line Clang tools.</font></div><div><font face="courier new, monospace">-///</font></div><div>
<font face="courier new, monospace">-/// Parses a common subset of command-line arguments, locates and loads a</font></div><div><font face="courier new, monospace">-/// compilation commands database, runs a tool with user-specified action. It</font></div>
<div><font face="courier new, monospace">-/// also contains a help message for the common command-line options.</font></div><div><font face="courier new, monospace">-/// An example of usage:</font></div><div><font face="courier new, monospace">-/// @code</font></div>
<div><font face="courier new, monospace">-/// int main(int argc, const char **argv) {</font></div><div><font face="courier new, monospace">-///   CommandLineClangTool Tool;</font></div><div><font face="courier new, monospace">-///   cl::extrahelp MoreHelp("\nMore help text...");</font></div>
<div><font face="courier new, monospace">-///   Tool.initialize(argc, argv);</font></div><div><font face="courier new, monospace">-///   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());</font></div>
<div><font face="courier new, monospace">-/// }</font></div><div><font face="courier new, monospace">-/// @endcode</font></div><div><font face="courier new, monospace">-///</font></div><div><font face="courier new, monospace">-class CommandLineClangTool {</font></div>
<div><font face="courier new, monospace">-public:</font></div><div><font face="courier new, monospace">-  /// Sets up command-line options and help messages.</font></div><div><font face="courier new, monospace">-  /// Add your own help messages after constructing this tool.</font></div>
<div><font face="courier new, monospace">-  CommandLineClangTool();</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-  /// Parses command-line, initializes a compilation database.</font></div>
<div><font face="courier new, monospace">-  /// This method exits program in case of error.</font></div><div><font face="courier new, monospace">-  void initialize(int argc, const char **argv);</font></div><div><font face="courier new, monospace">-</font></div>
<div><font face="courier new, monospace">-  /// Runs a clang tool with an action created by \c ActionFactory.</font></div><div><font face="courier new, monospace">-  int run(FrontendActionFactory *ActionFactory);</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-private:</font></div><div><font face="courier new, monospace">-  llvm::OwningPtr<CompilationDatabase> Compilations;</font></div>
<div><font face="courier new, monospace">-  llvm::cl::opt<std::string> BuildPath;</font></div><div><font face="courier new, monospace">-  llvm::cl::list<std::string> SourcePaths;</font></div><div><font face="courier new, monospace">-  llvm::cl::extrahelp MoreHelp;</font></div>
<div><font face="courier new, monospace">-};</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-} // namespace tooling</font></div><div><font face="courier new, monospace">-</font></div>
<div><font face="courier new, monospace">-} // namespace clang</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-#endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H</font></div>
<div><font face="courier new, monospace">Index: tools/clang/include/clang/Tooling/CommonOptionsParser.h</font></div><div><font face="courier new, monospace">===================================================================</font></div>
<div><font face="courier new, monospace">--- tools/clang/include/clang/Tooling/CommonOptionsParser.h     (revision 161861)</font></div><div><font face="courier new, monospace">+++ tools/clang/include/clang/Tooling/CommonOptionsParser.h     (working copy)</font></div>
<div><font face="courier new, monospace">@@ -1,4 +1,4 @@</font></div><div><font face="courier new, monospace">-//===- CommandLineClangTool.h - command-line clang tools driver -*- C++ -*-===//</font></div><div><font face="courier new, monospace">+//===- CommonOptionsParser.h - common options for clang tools -*- C++ -*-=====//</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //                     The LLVM Compiler Infrastructure</font></div><div><font face="courier new, monospace"> //</font></div>
<div><font face="courier new, monospace">@@ -7,74 +7,70 @@</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace">-//  This file implements the CommandLineClangTool class used to run clang</font></div><div><font face="courier new, monospace">-//  tools as separate command-line applications with a consistent common</font></div>
<div><font face="courier new, monospace">-//  interface for handling compilation database and input files.</font></div><div><font face="courier new, monospace">+//  This file implements the CommonOptionsParser class used to parse common</font></div>
<div><font face="courier new, monospace">+//  command-line options for clang tools, so that they can be run as separate</font></div><div><font face="courier new, monospace">+//  command-line applications with a consistent common interface for handling</font></div>
<div><font face="courier new, monospace">+//  compilation database and input files.</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //  It provides a common subset of command-line options, common algorithm</font></div>
<div><font face="courier new, monospace"> //  for locating a compilation database and source files, and help messages</font></div><div><font face="courier new, monospace"> //  for the basic command-line interface.</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace">-//  It creates a CompilationDatabase, initializes a ClangTool and runs a</font></div><div><font face="courier new, monospace">-//  user-specified FrontendAction over all TUs in which the given files are</font></div>
<div><font face="courier new, monospace">-//  compiled.</font></div><div><font face="courier new, monospace">+//  It creates a CompilationDatabase and reads common command-line options.</font></div><div><font face="courier new, monospace">+//  An example of usage:</font></div>
<div><font face="courier new, monospace">+//  @code</font></div><div><font face="courier new, monospace">+//  #include "llvm/Support/CommandLine.h"</font></div><div><font face="courier new, monospace">+//  #include "clang/Tooling/CommonOptionsParser.h"</font></div>
<div><font face="courier new, monospace">+//  using namespace clang::tooling;</font></div><div><font face="courier new, monospace">+//  using namespace llvm;</font></div><div><font face="courier new, monospace"> //</font></div>
<div><font face="courier new, monospace">+//  static cl::extrahelp CommonHelp(CommonHelpMessage);</font></div><div><font face="courier new, monospace">+//  static cl::extrahelp MoreHelp("\nMore help text...");</font></div>
<div><font face="courier new, monospace">+//  static cl:opt<bool> YourOwnOption(...);</font></div><div><font face="courier new, monospace">+//  ...</font></div><div><font face="courier new, monospace">+//</font></div>
<div><font face="courier new, monospace">+//  int main(int argc, const char **argv) {</font></div><div><font face="courier new, monospace">+//    CommonOptionsParser OptionsParser(argc, argv);</font></div><div><font face="courier new, monospace">+//    ClangTool Tool(*OptionsParser.Compilations, OptionsParser.SourcePathList);</font></div>
<div><font face="courier new, monospace">+//    return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());</font></div><div><font face="courier new, monospace">+//  }</font></div><div><font face="courier new, monospace">+//  @endcode</font></div>
<div><font face="courier new, monospace">+//</font></div><div><font face="courier new, monospace"> //  This class uses the Clang Tooling infrastructure, see</font></div><div><font face="courier new, monospace"> //    <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a></font></div>
<div><font face="courier new, monospace"> //  for details on setting it up with LLVM source tree.</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H</font></div><div><font face="courier new, monospace">-#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H</font></div>
<div><font face="courier new, monospace">+#ifndef LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H</font></div><div><font face="courier new, monospace">+#define LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-#include "llvm/Support/CommandLine.h"</font></div><div><font face="courier new, monospace"> #include "clang/Tooling/CompilationDatabase.h"</font></div>
<div><font face="courier new, monospace">+#include "clang/Frontend/FrontendActions.h"</font></div><div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace"> namespace clang {</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace"> namespace tooling {</font></div><div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-class CompilationDatabase;</font></div>
<div><font face="courier new, monospace">-class FrontendActionFactory;</font></div><div><font face="courier new, monospace">+extern const char *CommonHelpMessage;</font></div><div><font face="courier new, monospace"> </font></div>
<div><font face="courier new, monospace">-/// \brief A common driver for command-line Clang tools.</font></div><div><font face="courier new, monospace">+/// \brief A parser for options common to all command-line Clang tools.</font></div>
<div><font face="courier new, monospace"> ///</font></div><div><font face="courier new, monospace"> /// Parses a common subset of command-line arguments, locates and loads a</font></div><div><font face="courier new, monospace"> /// compilation commands database, runs a tool with user-specified action. It</font></div>
<div><font face="courier new, monospace"> /// also contains a help message for the common command-line options.</font></div><div><font face="courier new, monospace">-/// An example of usage:</font></div><div><font face="courier new, monospace">-/// @code</font></div>
<div><font face="courier new, monospace">-/// int main(int argc, const char **argv) {</font></div><div><font face="courier new, monospace">-///   CommandLineClangTool Tool;</font></div><div><font face="courier new, monospace">-///   cl::extrahelp MoreHelp("\nMore help text...");</font></div>
<div><font face="courier new, monospace">-///   Tool.initialize(argc, argv);</font></div><div><font face="courier new, monospace">-///   return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>());</font></div>
<div><font face="courier new, monospace">-/// }</font></div><div><font face="courier new, monospace">-/// @endcode</font></div><div><font face="courier new, monospace">-///</font></div><div><font face="courier new, monospace">-class CommandLineClangTool {</font></div>
<div><font face="courier new, monospace">+class CommonOptionsParser {</font></div><div><font face="courier new, monospace"> public:</font></div><div><font face="courier new, monospace">-  /// Sets up command-line options and help messages.</font></div>
<div><font face="courier new, monospace">-  /// Add your own help messages after constructing this tool.</font></div><div><font face="courier new, monospace">-  CommandLineClangTool();</font></div><div><font face="courier new, monospace">+  // Intentionally public.</font></div>
<div><font face="courier new, monospace">+  llvm::OwningPtr<CompilationDatabase> Compilations;</font></div><div><font face="courier new, monospace">+  std::vector<std::string> SourcePathList;</font></div><div>
<font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">   /// Parses command-line, initializes a compilation database.</font></div><div><font face="courier new, monospace">+  /// This method can change argc and argv contents.</font></div>
<div><font face="courier new, monospace">   /// This method exits program in case of error.</font></div><div><font face="courier new, monospace">-  void initialize(int argc, const char **argv);</font></div><div><font face="courier new, monospace">-</font></div>
<div><font face="courier new, monospace">-  /// Runs a clang tool with an action created by \c ActionFactory.</font></div><div><font face="courier new, monospace">-  int run(FrontendActionFactory *ActionFactory);</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-private:</font></div><div><font face="courier new, monospace">-  llvm::OwningPtr<CompilationDatabase> Compilations;</font></div>
<div><font face="courier new, monospace">-  llvm::cl::opt<std::string> BuildPath;</font></div><div><font face="courier new, monospace">-  llvm::cl::list<std::string> SourcePaths;</font></div><div><font face="courier new, monospace">-  llvm::cl::extrahelp MoreHelp;</font></div>
<div><font face="courier new, monospace">+  CommonOptionsParser(int &argc, const char **argv);</font></div><div><font face="courier new, monospace"> };</font></div><div><font face="courier new, monospace"> </font></div>
<div><font face="courier new, monospace">-} // namespace tooling</font></div><div><font face="courier new, monospace">+}  // namespace tooling</font></div><div><font face="courier new, monospace">+}  // namespace clang</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-} // namespace clang</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-#endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMANDLINECLANGTOOL_H</font></div>
<div><font face="courier new, monospace">+#endif  // LLVM_TOOLS_CLANG_INCLUDE_CLANG_TOOLING_COMMONOPTIONSPARSER_H</font></div><div><font face="courier new, monospace">Index: tools/clang/tools/clang-check/ClangCheck.cpp</font></div>
<div><font face="courier new, monospace">===================================================================</font></div><div><font face="courier new, monospace">--- tools/clang/tools/clang-check/ClangCheck.cpp        (revision 162110)</font></div>
<div><font face="courier new, monospace">+++ tools/clang/tools/clang-check/ClangCheck.cpp        (working copy)</font></div><div><font face="courier new, monospace">@@ -1,4 +1,4 @@</font></div><div><font face="courier new, monospace">-//===- tools/clang-check/ClangCheck.cpp - Clang check tool ----------------===//</font></div>
<div><font face="courier new, monospace">+//===--- tools/clang-check/ClangCheck.cpp - Clang check tool --------------===//</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //                     The LLVM Compiler Infrastructure</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace">@@ -16,20 +16,19 @@</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-#include "llvm/Support/CommandLine.h"</font></div><div><font face="courier new, monospace"> #include "clang/AST/ASTConsumer.h"</font></div>
<div><font face="courier new, monospace"> #include "clang/Driver/OptTable.h"</font></div><div><font face="courier new, monospace"> #include "clang/Driver/Options.h"</font></div><div><font face="courier new, monospace"> #include "clang/Frontend/ASTConsumers.h"</font></div>
<div><font face="courier new, monospace">-#include "clang/Frontend/FrontendActions.h"</font></div><div><font face="courier new, monospace">-#include "clang/Tooling/CommandLineClangTool.h"</font></div><div>
<font face="courier new, monospace">+#include "clang/Tooling/CommonOptionsParser.h"</font></div><div><font face="courier new, monospace"> #include "clang/Tooling/Tooling.h"</font></div><div><font face="courier new, monospace"> </font></div>
<div><font face="courier new, monospace"> using namespace clang::driver;</font></div><div><font face="courier new, monospace"> using namespace clang::tooling;</font></div><div><font face="courier new, monospace"> using namespace llvm;</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-static const char *MoreHelpText =</font></div><div><font face="courier new, monospace">+static cl::extrahelp CommonHelp(CommonHelpMessage);</font></div>
<div><font face="courier new, monospace">+static cl::extrahelp MoreHelp(</font></div><div><font face="courier new, monospace">     "\tFor example, to run clang-check on all files in a subtree of the\n"</font></div>
<div><font face="courier new, monospace">     "\tsource tree, use:\n"</font></div><div><font face="courier new, monospace">     "\n"</font></div><div><font face="courier new, monospace">@@ -41,26 +40,26 @@</font></div>
<div><font face="courier new, monospace">     "\n"</font></div><div><font face="courier new, monospace">     "\tNote, that path/in/subtree and current directory should follow the\n"</font></div><div><font face="courier new, monospace">     "\trules described above.\n"</font></div>
<div><font face="courier new, monospace">-    "\n";</font></div><div><font face="courier new, monospace">+    "\n"</font></div><div><font face="courier new, monospace">+);</font></div><div><font face="courier new, monospace"> </font></div>
<div><font face="courier new, monospace">+static OwningPtr<OptTable> Options(createDriverOptTable());</font></div><div><font face="courier new, monospace">+static cl::opt<bool> ASTDump(</font></div><div><font face="courier new, monospace">+    "ast-dump",</font></div>
<div><font face="courier new, monospace">+    cl::desc(Options->getOptionHelpText(options::OPT_ast_dump)));</font></div><div><font face="courier new, monospace">+static cl::opt<bool> ASTList(</font></div><div><font face="courier new, monospace">+    "ast-list",</font></div>
<div><font face="courier new, monospace">+    cl::desc(Options->getOptionHelpText(options::OPT_ast_list)));</font></div><div><font face="courier new, monospace">+static cl::opt<bool> ASTPrint(</font></div><div><font face="courier new, monospace">+    "ast-print",</font></div>
<div><font face="courier new, monospace">+    cl::desc(Options->getOptionHelpText(options::OPT_ast_print)));</font></div><div><font face="courier new, monospace">+static cl::opt<std::string> ASTDumpFilter(</font></div>
<div><font face="courier new, monospace">+    "ast-dump-filter",</font></div><div><font face="courier new, monospace">+    cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter)));</font></div><div>
<font face="courier new, monospace">+</font></div><div><font face="courier new, monospace"> namespace {</font></div><div><font face="courier new, monospace"> class ActionFactory {</font></div><div><font face="courier new, monospace"> public:</font></div>
<div><font face="courier new, monospace">-  ActionFactory()</font></div><div><font face="courier new, monospace">-    : Options(createDriverOptTable()),</font></div><div><font face="courier new, monospace">-      ASTDump(</font></div>
<div><font face="courier new, monospace">-        "ast-dump",</font></div><div><font face="courier new, monospace">-        cl::desc(Options->getOptionHelpText(options::OPT_ast_dump))),</font></div><div><font face="courier new, monospace">-      ASTList(</font></div>
<div><font face="courier new, monospace">-        "ast-list",</font></div><div><font face="courier new, monospace">-        cl::desc(Options->getOptionHelpText(options::OPT_ast_list))),</font></div><div><font face="courier new, monospace">-      ASTPrint(</font></div>
<div><font face="courier new, monospace">-        "ast-print",</font></div><div><font face="courier new, monospace">-        cl::desc(Options->getOptionHelpText(options::OPT_ast_print))),</font></div><div><font face="courier new, monospace">-      ASTDumpFilter(</font></div>
<div><font face="courier new, monospace">-        "ast-dump-filter",</font></div><div><font face="courier new, monospace">-        cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter))) {}</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">   clang::ASTConsumer *newASTConsumer() {</font></div><div><font face="courier new, monospace">     if (ASTList)</font></div>
<div><font face="courier new, monospace">       return clang::CreateASTDeclNodeLister();</font></div><div><font face="courier new, monospace">@@ -70,19 +69,12 @@</font></div><div><font face="courier new, monospace">       return clang::CreateASTPrinter(&llvm::outs(), ASTDumpFilter);</font></div>
<div><font face="courier new, monospace">     return new clang::ASTConsumer();</font></div><div><font face="courier new, monospace">   }</font></div><div><font face="courier new, monospace">-private:</font></div><div><font face="courier new, monospace">-  OwningPtr<OptTable> Options;</font></div>
<div><font face="courier new, monospace">-  cl::opt<bool> ASTDump;</font></div><div><font face="courier new, monospace">-  cl::opt<bool> ASTList;</font></div><div><font face="courier new, monospace">-  cl::opt<bool> ASTPrint;</font></div>
<div><font face="courier new, monospace">-  cl::opt<std::string> ASTDumpFilter;</font></div><div><font face="courier new, monospace"> };</font></div><div><font face="courier new, monospace"> }</font></div><div><font face="courier new, monospace"> </font></div>
<div><font face="courier new, monospace"> int main(int argc, const char **argv) {</font></div><div><font face="courier new, monospace">   ActionFactory Factory;</font></div><div><font face="courier new, monospace">-  CommandLineClangTool Tool;</font></div>
<div><font face="courier new, monospace">-  cl::extrahelp MoreHelp(MoreHelpText);</font></div><div><font face="courier new, monospace">-  Tool.initialize(argc, argv);</font></div><div><font face="courier new, monospace">+  CommonOptionsParser OptionsParser(argc, argv);</font></div>
<div><font face="courier new, monospace">+  ClangTool Tool(*OptionsParser.Compilations, OptionsParser.SourcePathList);</font></div><div><font face="courier new, monospace">   return Tool.run(newFrontendActionFactory(&Factory));</font></div>
<div><font face="courier new, monospace"> }</font></div><div><font face="courier new, monospace">Index: tools/clang/lib/Tooling/CommonOptionsParser.cpp</font></div><div><font face="courier new, monospace">===================================================================</font></div>
<div><font face="courier new, monospace">--- tools/clang/lib/Tooling/CommonOptionsParser.cpp     (revision 162110)</font></div><div><font face="courier new, monospace">+++ tools/clang/lib/Tooling/CommonOptionsParser.cpp     (working copy)</font></div>
<div><font face="courier new, monospace">@@ -1,4 +1,4 @@</font></div><div><font face="courier new, monospace">-//===--- CommandLineClangTool.cpp - command-line clang tools driver -------===//</font></div><div><font face="courier new, monospace">+//===--- CommonOptionsParser.cpp - common options for clang tools ---------===//</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //                     The LLVM Compiler Infrastructure</font></div><div><font face="courier new, monospace"> //</font></div>
<div><font face="courier new, monospace">@@ -7,28 +7,31 @@</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace">-//  This file implements the CommandLineClangTool class used to run clang</font></div><div><font face="courier new, monospace">-//  tools as separate command-line applications with a consistent common</font></div>
<div><font face="courier new, monospace">-//  interface for handling compilation database and input files.</font></div><div><font face="courier new, monospace">+//  This file implements the CommonOptionsParser class used to parse common</font></div>
<div><font face="courier new, monospace">+//  command-line options for clang tools, so that they can be run as separate</font></div><div><font face="courier new, monospace">+//  command-line applications with a consistent common interface for handling</font></div>
<div><font face="courier new, monospace">+//  compilation database and input files.</font></div><div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace"> //  It provides a common subset of command-line options, common algorithm</font></div>
<div><font face="courier new, monospace"> //  for locating a compilation database and source files, and help messages</font></div><div><font face="courier new, monospace"> //  for the basic command-line interface.</font></div>
<div><font face="courier new, monospace"> //</font></div><div><font face="courier new, monospace">-//  It creates a CompilationDatabase, initializes a ClangTool and runs a</font></div><div><font face="courier new, monospace">-//  user-specified FrontendAction over all TUs in which the given files are</font></div>
<div><font face="courier new, monospace">-//  compiled.</font></div><div><font face="courier new, monospace">+//  It creates a CompilationDatabase and reads common command-line options.</font></div><div><font face="courier new, monospace"> //</font></div>
<div><font face="courier new, monospace">+//  This class uses the Clang Tooling infrastructure, see</font></div><div><font face="courier new, monospace">+//    <a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a></font></div>
<div><font face="courier new, monospace">+//  for details on setting it up with LLVM source tree.</font></div><div><font face="courier new, monospace">+//</font></div><div><font face="courier new, monospace"> //===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-#include "clang/Frontend/FrontendActions.h"</font></div><div><font face="courier new, monospace">-#include "clang/Tooling/CommandLineClangTool.h"</font></div>
<div><font face="courier new, monospace">+#include "llvm/Support/CommandLine.h"</font></div><div><font face="courier new, monospace">+#include "clang/Tooling/CommonOptionsParser.h"</font></div><div><font face="courier new, monospace"> #include "clang/Tooling/Tooling.h"</font></div>
<div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace"> using namespace clang::tooling;</font></div><div><font face="courier new, monospace"> using namespace llvm;</font></div><div>
<font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-static const char *MoreHelpText =</font></div><div><font face="courier new, monospace">+const char *clang::tooling::CommonHelpMessage =</font></div>
<div><font face="courier new, monospace">     "\n"</font></div><div><font face="courier new, monospace">     "-p <build-path> is used to read a compile command database.\n"</font></div><div><font face="courier new, monospace">     "\n"</font></div>
<div><font face="courier new, monospace">@@ -40,26 +43,27 @@</font></div><div><font face="courier new, monospace">     "\thttp://<a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a> for an\n"</font></div>
<div><font face="courier new, monospace">     "\texample of setting up Clang Tooling on a source tree.\n"</font></div><div><font face="courier new, monospace">     "\n"</font></div><div><font face="courier new, monospace">-    "<source0> ... specify the paths of source files. These paths are looked\n"</font></div>
<div><font face="courier new, monospace">-    "\tup in the compile command database. If the path of a file is absolute,\n"</font></div><div><font face="courier new, monospace">-    "\tit needs to point into CMake's source tree. If the path is relative,\n"</font></div>
<div><font face="courier new, monospace">-    "\tthe current working directory needs to be in the CMake source tree and\n"</font></div><div><font face="courier new, monospace">-    "\tthe file must be in a subdirectory of the current working directory.\n"</font></div>
<div><font face="courier new, monospace">-    "\t\"./\" prefixes in the relative files will be automatically removed,\n"</font></div><div><font face="courier new, monospace">-    "\tbut the rest of a relative path must be a suffix of a path in the\n"</font></div>
<div><font face="courier new, monospace">-    "\tcompile command database.\n"</font></div><div><font face="courier new, monospace">+    "<source0> ... specify the paths of source files. These paths are\n"</font></div>
<div><font face="courier new, monospace">+    "\tlooked up in the compile command database. If the path of a file is\n"</font></div><div><font face="courier new, monospace">+    "\tabsolute, it needs to point into CMake's source tree. If the path is\n"</font></div>
<div><font face="courier new, monospace">+    "\trelative, the current working directory needs to be in the CMake\n"</font></div><div><font face="courier new, monospace">+    "\tsource tree and the file must be in a subdirectory of the current\n"</font></div>
<div><font face="courier new, monospace">+    "\tworking directory. \"./\" prefixes in the relative files will be\n"</font></div><div><font face="courier new, monospace">+    "\tautomatically removed, but the rest of a relative path must be a\n"</font></div>
<div><font face="courier new, monospace">+    "\tsuffix of a path in the compile command database.\n"</font></div><div><font face="courier new, monospace">     "\n";</font></div><div><font face="courier new, monospace"> </font></div>
<div><font face="courier new, monospace">-CommandLineClangTool::CommandLineClangTool() :</font></div><div><font face="courier new, monospace">-    BuildPath("p", cl::desc("Build path"), cl::Optional),</font></div>
<div><font face="courier new, monospace">-    SourcePaths(cl::Positional, cl::desc("<source0> [... <sourceN>]"),</font></div><div><font face="courier new, monospace">-                cl::OneOrMore),</font></div>
<div><font face="courier new, monospace">-    MoreHelp(MoreHelpText) {</font></div><div><font face="courier new, monospace">-}</font></div><div><font face="courier new, monospace">+static cl::opt<std::string> BuildPath(</font></div>
<div><font face="courier new, monospace">+    "p", cl::desc("Build path"), cl::Optional);</font></div><div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">-void CommandLineClangTool::initialize(int argc, const char **argv) {</font></div>
<div><font face="courier new, monospace">-  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, argv));</font></div><div><font face="courier new, monospace">+static cl::list<std::string> SourcePaths(</font></div>
<div><font face="courier new, monospace">+    cl::Positional, cl::desc("<source0> [... <sourceN>]"), cl::OneOrMore);</font></div><div><font face="courier new, monospace">+</font></div><div><font face="courier new, monospace">+CommonOptionsParser::CommonOptionsParser(int &argc, const char **argv) {</font></div>
<div><font face="courier new, monospace">+  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc,</font></div><div><font face="courier new, monospace">+                                                                   argv));</font></div>
<div><font face="courier new, monospace">   cl::ParseCommandLineOptions(argc, argv);</font></div><div><font face="courier new, monospace">+  SourcePathList = SourcePaths;</font></div><div><font face="courier new, monospace">   if (!Compilations) {</font></div>
<div><font face="courier new, monospace">     std::string ErrorMessage;</font></div><div><font face="courier new, monospace">     if (!BuildPath.empty()) {</font></div><div><font face="courier new, monospace">@@ -73,8 +77,3 @@</font></div>
<div><font face="courier new, monospace">       llvm::report_fatal_error(ErrorMessage);</font></div><div><font face="courier new, monospace">   }</font></div><div><font face="courier new, monospace"> }</font></div><div><font face="courier new, monospace">-</font></div>
<div><font face="courier new, monospace">-int CommandLineClangTool::run(FrontendActionFactory *ActionFactory) {</font></div><div><font face="courier new, monospace">-  ClangTool Tool(*Compilations, SourcePaths);</font></div>
<div><font face="courier new, monospace">-  return Tool.run(ActionFactory);</font></div><div><font face="courier new, monospace">-}</font></div><div><font face="courier new, monospace">Index: tools/clang/lib/Tooling/CommandLineClangTool.cpp</font></div>
<div><font face="courier new, monospace">===================================================================</font></div><div><font face="courier new, monospace">--- tools/clang/lib/Tooling/CommandLineClangTool.cpp    (revision 162110)</font></div>
<div><font face="courier new, monospace">+++ tools/clang/lib/Tooling/CommandLineClangTool.cpp    (working copy)</font></div><div><font face="courier new, monospace">@@ -1,80 +0,0 @@</font></div><div><font face="courier new, monospace">-//===--- CommandLineClangTool.cpp - command-line clang tools driver -------===//</font></div>
<div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//                     The LLVM Compiler Infrastructure</font></div><div><font face="courier new, monospace">-//</font></div>
<div><font face="courier new, monospace">-// This file is distributed under the University of Illinois Open Source</font></div><div><font face="courier new, monospace">-// License. See LICENSE.TXT for details.</font></div>
<div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//===----------------------------------------------------------------------===//</font></div><div><font face="courier new, monospace">-//</font></div>
<div><font face="courier new, monospace">-//  This file implements the CommandLineClangTool class used to run clang</font></div><div><font face="courier new, monospace">-//  tools as separate command-line applications with a consistent common</font></div>
<div><font face="courier new, monospace">-//  interface for handling compilation database and input files.</font></div><div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//  It provides a common subset of command-line options, common algorithm</font></div>
<div><font face="courier new, monospace">-//  for locating a compilation database and source files, and help messages</font></div><div><font face="courier new, monospace">-//  for the basic command-line interface.</font></div>
<div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//  It creates a CompilationDatabase, initializes a ClangTool and runs a</font></div><div><font face="courier new, monospace">-//  user-specified FrontendAction over all TUs in which the given files are</font></div>
<div><font face="courier new, monospace">-//  compiled.</font></div><div><font face="courier new, monospace">-//</font></div><div><font face="courier new, monospace">-//===----------------------------------------------------------------------===//</font></div>
<div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-#include "clang/Frontend/FrontendActions.h"</font></div><div><font face="courier new, monospace">-#include "clang/Tooling/CommandLineClangTool.h"</font></div>
<div><font face="courier new, monospace">-#include "clang/Tooling/Tooling.h"</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-using namespace clang::tooling;</font></div>
<div><font face="courier new, monospace">-using namespace llvm;</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-static const char *MoreHelpText =</font></div><div>
<font face="courier new, monospace">-    "\n"</font></div><div><font face="courier new, monospace">-    "-p <build-path> is used to read a compile command database.\n"</font></div><div><font face="courier new, monospace">-    "\n"</font></div>
<div><font face="courier new, monospace">-    "\tFor example, it can be a CMake build directory in which a file named\n"</font></div><div><font face="courier new, monospace">-    "\tcompile_commands.json exists (use -DCMAKE_EXPORT_COMPILE_COMMANDS=ON\n"</font></div>
<div><font face="courier new, monospace">-    "\tCMake option to get this output). When no build path is specified,\n"</font></div><div><font face="courier new, monospace">-    "\tclang-check will attempt to locate it automatically using all parent\n"</font></div>
<div><font face="courier new, monospace">-    "\tpaths of the first input file. See:\n"</font></div><div><font face="courier new, monospace">-    "\thttp://<a href="http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html">clang.llvm.org/docs/HowToSetupToolingForLLVM.html</a> for an\n"</font></div>
<div><font face="courier new, monospace">-    "\texample of setting up Clang Tooling on a source tree.\n"</font></div><div><font face="courier new, monospace">-    "\n"</font></div><div><font face="courier new, monospace">-    "<source0> ... specify the paths of source files. These paths are looked\n"</font></div>
<div><font face="courier new, monospace">-    "\tup in the compile command database. If the path of a file is absolute,\n"</font></div><div><font face="courier new, monospace">-    "\tit needs to point into CMake's source tree. If the path is relative,\n"</font></div>
<div><font face="courier new, monospace">-    "\tthe current working directory needs to be in the CMake source tree and\n"</font></div><div><font face="courier new, monospace">-    "\tthe file must be in a subdirectory of the current working directory.\n"</font></div>
<div><font face="courier new, monospace">-    "\t\"./\" prefixes in the relative files will be automatically removed,\n"</font></div><div><font face="courier new, monospace">-    "\tbut the rest of a relative path must be a suffix of a path in the\n"</font></div>
<div><font face="courier new, monospace">-    "\tcompile command database.\n"</font></div><div><font face="courier new, monospace">-    "\n";</font></div><div><font face="courier new, monospace">-</font></div>
<div><font face="courier new, monospace">-CommandLineClangTool::CommandLineClangTool() :</font></div><div><font face="courier new, monospace">-    BuildPath("p", cl::desc("Build path"), cl::Optional),</font></div>
<div><font face="courier new, monospace">-    SourcePaths(cl::Positional, cl::desc("<source0> [... <sourceN>]"),</font></div><div><font face="courier new, monospace">-                cl::OneOrMore),</font></div>
<div><font face="courier new, monospace">-    MoreHelp(MoreHelpText) {</font></div><div><font face="courier new, monospace">-}</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-void CommandLineClangTool::initialize(int argc, const char **argv) {</font></div>
<div><font face="courier new, monospace">-  Compilations.reset(FixedCompilationDatabase::loadFromCommandLine(argc, argv));</font></div><div><font face="courier new, monospace">-  cl::ParseCommandLineOptions(argc, argv);</font></div>
<div><font face="courier new, monospace">-  if (!Compilations) {</font></div><div><font face="courier new, monospace">-    std::string ErrorMessage;</font></div><div><font face="courier new, monospace">-    if (!BuildPath.empty()) {</font></div>
<div><font face="courier new, monospace">-      Compilations.reset(CompilationDatabase::autoDetectFromDirectory(</font></div><div><font face="courier new, monospace">-                              BuildPath, ErrorMessage));</font></div>
<div><font face="courier new, monospace">-    } else {</font></div><div><font face="courier new, monospace">-      Compilations.reset(CompilationDatabase::autoDetectFromSource(</font></div><div><font face="courier new, monospace">-                              SourcePaths[0], ErrorMessage));</font></div>
<div><font face="courier new, monospace">-    }</font></div><div><font face="courier new, monospace">-    if (!Compilations)</font></div><div><font face="courier new, monospace">-      llvm::report_fatal_error(ErrorMessage);</font></div>
<div><font face="courier new, monospace">-  }</font></div><div><font face="courier new, monospace">-}</font></div><div><font face="courier new, monospace">-</font></div><div><font face="courier new, monospace">-int CommandLineClangTool::run(FrontendActionFactory *ActionFactory) {</font></div>
<div><font face="courier new, monospace">-  ClangTool Tool(*Compilations, SourcePaths);</font></div><div><font face="courier new, monospace">-  return Tool.run(ActionFactory);</font></div><div><font face="courier new, monospace">-}</font></div>
<div><font face="courier new, monospace">Index: tools/clang/lib/Tooling/CMakeLists.txt</font></div><div><font face="courier new, monospace">===================================================================</font></div><div>
<font face="courier new, monospace">--- tools/clang/lib/Tooling/CMakeLists.txt      (revision 162110)</font></div><div><font face="courier new, monospace">+++ tools/clang/lib/Tooling/CMakeLists.txt      (working copy)</font></div>
<div><font face="courier new, monospace">@@ -2,7 +2,7 @@</font></div><div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace"> add_clang_library(clangTooling</font></div><div><font face="courier new, monospace">   ArgumentsAdjusters.cpp</font></div>
<div><font face="courier new, monospace">-  CommandLineClangTool.cpp</font></div><div><font face="courier new, monospace">+  CommonOptionsParser.cpp</font></div><div><font face="courier new, monospace">   CompilationDatabase.cpp</font></div>
<div><font face="courier new, monospace">   Refactoring.cpp</font></div><div><font face="courier new, monospace">   RefactoringCallbacks.cpp</font></div></div>