diff options
| author | Edwin Vane <edwin.vane@intel.com> | 2013-04-09 20:49:49 +0000 |
|---|---|---|
| committer | Edwin Vane <edwin.vane@intel.com> | 2013-04-09 20:49:49 +0000 |
| commit | 8ef7fa1e073e76ea06bd96a299880ee572f762df (patch) | |
| tree | 9d287ebe8c6e009ff4957690d8121b4efefe75c1 /clang-tools-extra/cpp11-migrate/AddOverride | |
| parent | 37ee1d7b80bcae3d63ab12ba0b89698765e10a5d (diff) | |
| download | bcm5719-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')
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 |

