summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/cpp11-migrate/AddOverride
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/cpp11-migrate/AddOverride')
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp18
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h8
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp12
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h9
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
OpenPOWER on IntegriCloud