diff options
Diffstat (limited to 'clang-tools-extra/cpp11-migrate/AddOverride')
4 files changed, 43 insertions, 4 deletions
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp index f431c34c88f..f02548b25ff 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp @@ -16,15 +16,21 @@ #include "AddOverride.h" #include "AddOverrideActions.h" #include "AddOverrideMatchers.h" +#include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendActions.h" #include "clang/Rewrite/Core/Rewriter.h" #include "clang/Tooling/Refactoring.h" #include "clang/Tooling/Tooling.h" +#include "llvm/Support/CommandLine.h" using clang::ast_matchers::MatchFinder; using namespace clang::tooling; using namespace clang; +static llvm::cl::opt<bool> DetectMacros( + "override-macros", + llvm::cl::desc("Detect and use macros that expand to the 'override' keyword.")); + int AddOverrideTransform::apply(const FileContentsByPath &InputStates, RiskLevel MaxRisk, const CompilationDatabase &Database, @@ -41,7 +47,10 @@ int AddOverrideTransform::apply(const FileContentsByPath &InputStates, unsigned AcceptedChanges = 0; MatchFinder Finder; - AddOverrideFixer Fixer(AddOverrideTool.getReplacements(), AcceptedChanges); + AddOverrideFixer Fixer(AddOverrideTool.getReplacements(), AcceptedChanges, + DetectMacros); + // Make Fixer available to handleBeginSource(). + this->Fixer = &Fixer; Finder.addMatcher(makeCandidateForOverrideAttrMatcher(), &Fixer); @@ -62,3 +71,10 @@ int AddOverrideTransform::apply(const FileContentsByPath &InputStates, return 0; } + +bool AddOverrideTransform::handleBeginSource(clang::CompilerInstance &CI, + llvm::StringRef Filename) { + assert(Fixer != NULL && "Fixer must be set"); + Fixer->setPreprocessor(CI.getPreprocessor()); + return Transform::handleBeginSource(CI, Filename); +} diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h index 1e9de5d5c71..45bd6ee8725 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h @@ -20,6 +20,8 @@ #include "Core/Transform.h" #include "llvm/Support/Compiler.h" +class AddOverrideFixer; + /// \brief Subclass of Transform that adds the C++11 override keyword to /// member functions overriding base class virtual functions. class AddOverrideTransform : public Transform { @@ -33,6 +35,12 @@ public: const clang::tooling::CompilationDatabase &Database, const std::vector<std::string> &SourcePaths, FileContentsByPath &ResultStates) LLVM_OVERRIDE; + + virtual bool handleBeginSource(clang::CompilerInstance &CI, + llvm::StringRef Filename) LLVM_OVERRIDE; + +private: + AddOverrideFixer *Fixer; }; #endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_H diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp index b93aee927d3..008e947410e 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp @@ -21,6 +21,7 @@ #include "clang/AST/Attr.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Lex/Lexer.h" +#include "clang/Lex/Preprocessor.h" using namespace clang::ast_matchers; using namespace clang::tooling; @@ -85,6 +86,15 @@ void AddOverrideFixer::run(const MatchFinder::MatchResult &Result) { StartLoc = SM.getSpellingLoc(M->getLocEnd()); StartLoc = Lexer::getLocForEndOfToken(StartLoc, 0, SM, LangOptions()); } - Replace.insert(tooling::Replacement(SM, StartLoc, 0, " override")); + + std::string ReplacementText = " override"; + if (DetectMacros) { + assert(PP != 0 && "No access to Preprocessor object for macro detection"); + clang::TokenValue Tokens[] = { PP->getIdentifierInfo("override") }; + llvm::StringRef MacroName = PP->getLastMacroWithSpelling(StartLoc, Tokens); + if (!MacroName.empty()) + ReplacementText = (" " + MacroName).str(); + } + Replace.insert(tooling::Replacement(SM, StartLoc, 0, ReplacementText)); ++AcceptedChanges; } diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h index b2fdcec83cc..831344344a1 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h @@ -24,15 +24,20 @@ class AddOverrideFixer : public clang::ast_matchers::MatchFinder::MatchCallback { public: AddOverrideFixer(clang::tooling::Replacements &Replace, - unsigned &AcceptedChanges) : - Replace(Replace), AcceptedChanges(AcceptedChanges) {} + unsigned &AcceptedChanges, bool DetectMacros) + : Replace(Replace), AcceptedChanges(AcceptedChanges), + DetectMacros(DetectMacros) {} /// \brief Entry point to the callback called when matches are made. virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &Result); + void setPreprocessor(clang::Preprocessor &PP) { this->PP = &PP; } + private: + clang::Preprocessor *PP; clang::tooling::Replacements &Replace; unsigned &AcceptedChanges; + bool DetectMacros; }; #endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H |