forked from OSchip/llvm-project
Frontend: Change PluginASTAction::ParseArgs to take a CompilerInstance object
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. llvm-svn: 110039
This commit is contained in:
parent
77558b7d13
commit
2be96746b4
|
@ -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;
|
||||
|
||||
|
@ -37,9 +38,20 @@ 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());
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue