summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/cpp11-migrate/AddOverride
diff options
context:
space:
mode:
authorEdwin Vane <edwin.vane@intel.com>2013-04-09 20:49:49 +0000
committerEdwin Vane <edwin.vane@intel.com>2013-04-09 20:49:49 +0000
commit8ef7fa1e073e76ea06bd96a299880ee572f762df (patch)
tree9d287ebe8c6e009ff4957690d8121b4efefe75c1 /clang-tools-extra/cpp11-migrate/AddOverride
parent37ee1d7b80bcae3d63ab12ba0b89698765e10a5d (diff)
downloadbcm5719-llvm-8ef7fa1e073e76ea06bd96a299880ee572f762df.tar.gz
bcm5719-llvm-8ef7fa1e073e76ea06bd96a299880ee572f762df.zip
Adding the AddOverride transform for cpp11-migrate
This transform adds the override specifier to methods that overrides virtual methods from a base class that don't already have this specifier. Author: Philip Dunstan <phil@phildunstan.com> llvm-svn: 179127
Diffstat (limited to 'clang-tools-extra/cpp11-migrate/AddOverride')
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp63
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h37
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp59
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h38
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp28
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.h27
6 files changed, 252 insertions, 0 deletions
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp
new file mode 100644
index 00000000000..d75c658ec69
--- /dev/null
+++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp
@@ -0,0 +1,63 @@
+//===-- AddOverride/AddOverride.cpp - add C++11 override -------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file provides the implementation of the AddOverrideTransform
+/// class.
+///
+//===----------------------------------------------------------------------===//
+
+#include "AddOverride.h"
+#include "AddOverrideActions.h"
+#include "AddOverrideMatchers.h"
+#include "clang/Frontend/FrontendActions.h"
+#include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/Tooling/Refactoring.h"
+#include "clang/Tooling/Tooling.h"
+
+using clang::ast_matchers::MatchFinder;
+using namespace clang::tooling;
+using namespace clang;
+
+int AddOverrideTransform::apply(const FileContentsByPath &InputStates,
+ RiskLevel MaxRisk,
+ const CompilationDatabase &Database,
+ const std::vector<std::string> &SourcePaths,
+ FileContentsByPath &ResultStates) {
+ RefactoringTool AddOverrideTool(Database, SourcePaths);
+
+ for (FileContentsByPath::const_iterator I = InputStates.begin(),
+ E = InputStates.end();
+ I != E; ++I) {
+ AddOverrideTool.mapVirtualFile(I->first, I->second);
+ }
+
+ unsigned AcceptedChanges = 0;
+
+ MatchFinder Finder;
+ AddOverrideFixer Fixer(AddOverrideTool.getReplacements(), AcceptedChanges);
+
+ Finder.addMatcher(makeCandidateForOverrideAttrMatcher(), &Fixer);
+
+ if (int result = AddOverrideTool.run(newFrontendActionFactory(&Finder))) {
+ llvm::errs() << "Error encountered during translation.\n";
+ return result;
+ }
+
+ RewriterContainer Rewrite(AddOverrideTool.getFiles(), InputStates);
+
+ // FIXME: Do something if some replacements didn't get applied?
+ AddOverrideTool.applyAllReplacements(Rewrite.getRewriter());
+
+ collectResults(Rewrite.getRewriter(), InputStates, ResultStates);
+
+ setAcceptedChanges(AcceptedChanges);
+
+ return 0;
+}
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h
new file mode 100644
index 00000000000..9b1aa1535ba
--- /dev/null
+++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h
@@ -0,0 +1,37 @@
+//===-- AddOverride/AddOverride.h - add C++11 override ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file provides the definition of the AddOverrideTransform
+/// class which is the main interface to the transform that tries to add
+/// the override keyword to declarations of member function that override
+/// virtual functions in a base class.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_H
+#define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_H
+
+#include "Core/Transform.h"
+#include "llvm/Support/Compiler.h"
+
+/// \brief Subclass of Transform that adds the C++11 override keyword to
+/// member functions overriding base class virtual functions.
+class AddOverrideTransform : public Transform {
+public:
+ AddOverrideTransform() : Transform("AddOverride") {}
+
+ /// \see Transform::run().
+ virtual int apply(const FileContentsByPath &InputStates,
+ RiskLevel MaxRiskLEvel,
+ const clang::tooling::CompilationDatabase &Database,
+ const std::vector<std::string> &SourcePaths,
+ FileContentsByPath &ResultStates) LLVM_OVERRIDE;
+};
+
+#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
new file mode 100644
index 00000000000..a40f673132c
--- /dev/null
+++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.cpp
@@ -0,0 +1,59 @@
+//===-- AddOverride/AddOverrideActions.cpp - add C++11 override-*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file contains the definition of the AddOverrideFixer class
+/// which is used as an ASTMatcher callback.
+///
+//===----------------------------------------------------------------------===//
+
+#include "AddOverrideActions.h"
+#include "AddOverrideMatchers.h"
+
+#include "clang/Basic/CharInfo.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Attr.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/Lex/Lexer.h"
+
+using namespace clang::ast_matchers;
+using namespace clang::tooling;
+using namespace clang;
+
+void AddOverrideFixer::run(const MatchFinder::MatchResult &Result) {
+ SourceManager &SM = *Result.SourceManager;
+
+ const CXXMethodDecl *M = Result.Nodes.getDeclAs<CXXMethodDecl>(MethodId);
+ assert(M && "Bad Callback. No node provided");
+
+ // First check that there isn't already an override attribute.
+ if (!M->hasAttr<OverrideAttr>()) {
+ if (M->getLocStart().isFileID()) {
+ SourceLocation StartLoc;
+ if (M->hasInlineBody()) {
+ // Start at the beginning of the body and rewind back to the last
+ // non-whitespace character. We will insert the override keyword
+ // after that character.
+ // FIXME: This transform won't work if there is a comment between
+ // the end of the function prototype and the start of the body.
+ StartLoc = M->getBody()->getLocStart();
+ do {
+ StartLoc = StartLoc.getLocWithOffset(-1);
+ } while (isWhitespace(*FullSourceLoc(StartLoc, SM).getCharacterData()));
+ StartLoc = StartLoc.getLocWithOffset(1);
+ } else {
+ StartLoc = SM.getSpellingLoc(M->getLocEnd());
+ StartLoc = Lexer::getLocForEndOfToken(StartLoc, 0, SM, LangOptions());
+ }
+ Replace.insert(tooling::Replacement(SM, StartLoc, 0, " override"));
+ ++AcceptedChanges;
+ }
+ }
+}
+
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h
new file mode 100644
index 00000000000..b2fdcec83cc
--- /dev/null
+++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideActions.h
@@ -0,0 +1,38 @@
+//===-- AddOverride/AddOverrideActions.h - add C++11 override --*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file contains the declaration of the AddOverrideFixer class
+/// which is used as a ASTMatcher callback.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H
+#define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H
+
+#include "Core/Transform.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Tooling/Refactoring.h"
+
+/// \brief The callback to be used for add-override migration matchers.
+///
+class AddOverrideFixer : public clang::ast_matchers::MatchFinder::MatchCallback {
+public:
+ AddOverrideFixer(clang::tooling::Replacements &Replace,
+ unsigned &AcceptedChanges) :
+ Replace(Replace), AcceptedChanges(AcceptedChanges) {}
+
+ /// \brief Entry point to the callback called when matches are made.
+ virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &Result);
+
+private:
+ clang::tooling::Replacements &Replace;
+ unsigned &AcceptedChanges;
+};
+
+#endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp
new file mode 100644
index 00000000000..1e27002f852
--- /dev/null
+++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp
@@ -0,0 +1,28 @@
+//===-- AddOverride/AddOverrideMatchers.cpp - C++11 override ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file contains the definitions for matcher-generating functions
+/// and a custom AST_MATCHER for identifying casts of type CK_NullTo*.
+///
+//===----------------------------------------------------------------------===//
+#include "AddOverrideMatchers.h"
+#include "clang/AST/ASTContext.h"
+
+using namespace clang::ast_matchers;
+using namespace clang;
+
+const char *MethodId = "method";
+
+DeclarationMatcher makeCandidateForOverrideAttrMatcher() {
+ return methodDecl(hasParent(recordDecl()),
+ isOverride(),
+ unless(destructorDecl())).bind(MethodId);
+}
+
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.h b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.h
new file mode 100644
index 00000000000..995919135f3
--- /dev/null
+++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverrideMatchers.h
@@ -0,0 +1,27 @@
+//===-- AddOverride/AddOverrideMatchers.h - add C++11 override -*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file contains the declarations for matcher-generating functions
+/// and names for bound nodes found by AST matchers.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_MATCHERS_H
+#define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_MATCHERS_H
+
+#include "clang/ASTMatchers/ASTMatchers.h"
+
+/// Name to bind with matched expressions.
+extern const char *MethodId;
+
+/// \brief Create a matcher that finds member function declarations that are
+/// candidates for adding the override attribute.
+clang::ast_matchers::DeclarationMatcher makeCandidateForOverrideAttrMatcher();
+
+#endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_MATCHERS_H
OpenPOWER on IntegriCloud