]> granicus.if.org Git - clang/commitdiff
Frontend: Change PluginASTAction::ParseArgs to take a CompilerInstance object
authorDaniel Dunbar <daniel@zuster.org>
Mon, 2 Aug 2010 15:31:28 +0000 (15:31 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 2 Aug 2010 15:31:28 +0000 (15:31 +0000)
for use in reporting diagnostics.
 - We don't want to use the Action's own CompilerInstance, because that is only
   initialized during file processing and I like that invariant.

Also, if ParseArgs returns false then abandon execution.

Also, remove unused PluginASTAction::PrintHelp virtual method.

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

examples/PrintFunctionNames/PrintFunctionNames.cpp
include/clang/Frontend/FrontendAction.h
tools/driver/cc1_main.cpp

index e94b0ed676a16126e98bb74bdd3e22126fb2f82f..cc138f56dbbaeb54bb008ea1de3edee30fad0674 100644 (file)
@@ -15,6 +15,7 @@
 #include "clang/Frontend/FrontendPluginRegistry.h"
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/AST.h"
+#include "clang/Frontend/CompilerInstance.h"
 #include "llvm/Support/raw_ostream.h"
 using namespace clang;
 
@@ -29,7 +30,7 @@ public:
         llvm::errs() << "top-level-decl: \"" << ND->getNameAsString() << "\"\n";
     }
   }
-}; 
+};
 
 class PrintFunctionNamesAction : public PluginASTAction {
 protected:
@@ -37,15 +38,26 @@ protected:
     return new PrintFunctionsConsumer();
   }
 
-  bool ParseArgs(const std::vector<std::string>& args) {
-    for (unsigned i=0; i<args.size(); ++i)
+  bool ParseArgs(const CompilerInstance &CI,
+                 const std::vector<std::string>& args) {
+    for (unsigned i = 0, e = args.size(); i != e; ++i) {
       llvm::errs() << "PrintFunctionNames arg = " << args[i] << "\n";
+
+      // Example error handling.
+      if (args[i] == "-an-error") {
+        Diagnostic &D = CI.getDiagnostics();
+        unsigned DiagID = D.getCustomDiagID(
+          Diagnostic::Error, "invalid argument '" + args[i] + "'");
+        D.Report(DiagID);
+        return false;
+      }
+    }
     if (args.size() && args[0] == "help")
       PrintHelp(llvm::errs());
 
     return true;
   }
-  void PrintHelp(llvm::raw_ostream& ros) { 
+  void PrintHelp(llvm::raw_ostream& ros) {
     ros << "Help for PrintFunctionNames plugin goes here\n";
   }
 
index f6a68bf69e891c79ffa346e82daca302138e5654..637458da34bc08b290d1b943e9615f21f85cc258 100644 (file)
@@ -225,8 +225,14 @@ protected:
                                          llvm::StringRef InFile) = 0;
 
 public:
-  virtual bool ParseArgs(const std::vector<std::string>& arg) = 0;
-  virtual void PrintHelp(llvm::raw_ostream&) = 0;
+  /// ParseArgs - Parse the given plugin command line arguments.
+  ///
+  /// \param CI - The compiler instance, for use in reporting diagnostics.
+  /// \return True if the parsing succeeded; otherwise the plugin will be
+  /// destroyed and no action run. The plugin is responsible for using the
+  /// CompilerInstance's Diagnostic object to report errors.
+  virtual bool ParseArgs(const CompilerInstance &CI,
+                         const std::vector<std::string> &arg) = 0;
 };
 
 /// PreprocessorFrontendAction - Abstract base class to use for preprocessor
index 0942be1e46882bb6b4e255d8c356dd86b657f40e..0699b7f48dbdec9a4d890067b8f82c32db6e2d1f 100644 (file)
@@ -83,14 +83,14 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) {
   case ParseSyntaxOnly:        return new SyntaxOnlyAction();
 
   case PluginAction: {
-
     for (FrontendPluginRegistry::iterator it =
            FrontendPluginRegistry::begin(), ie = FrontendPluginRegistry::end();
          it != ie; ++it) {
       if (it->getName() == CI.getFrontendOpts().ActionName) {
-        PluginASTAction* plugin = it->instantiate();
-        plugin->ParseArgs(CI.getFrontendOpts().PluginArgs);
-        return plugin;
+        llvm::OwningPtr<PluginASTAction> P(it->instantiate());
+        if (!P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
+          return 0;
+        return P.take();
       }
     }
 
@@ -287,7 +287,7 @@ int cc1_main(const char **ArgBegin, const char **ArgEnd,
   // If any timers were active but haven't been destroyed yet, print their
   // results now.  This happens in -disable-free mode.
   llvm::TimerGroup::printAll(llvm::errs());
-  
+
   // When running with -disable-free, don't do any destruction or shutdown.
   if (Clang->getFrontendOpts().DisableFree) {
     if (Clang->getFrontendOpts().ShowStats)