From 147984a8adf15183de3f3a25f74b7b3620e2a1a6 Mon Sep 17 00:00:00 2001 From: Edwin Vane Date: Tue, 3 Sep 2013 13:16:02 +0000 Subject: cpp11-migrate: Refactor for driver model of operation Re-commit of r189691 and r189689 now with a proper autoconf fix. Massive simplification of how replacements and file overrides are handled by the migrator: * Sources and headers are all treated the same. * All replacements for a given translation unit are stored in the same TranslationUnitReplacements structure. * Change tracking is updated only from main file; no need for propagating "is tracking" flag around. * Transform base class no longer responsible for applying replacements. They are simply stored and main() looks after deduplication and application. * Renamed -yaml-only to -serialize-replacements. Same restrictions apply: Can only request one transform. New restriction: formatting cannot also be turned on since it's basically a transform. * If -serialize-replacements is requested, changes to files will not be applied on disk. * Changed behaviour of function generating names for serialized replacements: Only the main source file goes into the name of the file since a file may contain changes for multiple different files. * Updated HeaderReplacements LIT test for new serialization behaviour. * Replaced old test that ensures replacements are not serialized if -serialize-replacements is not provided. New version ensures changes are made directly to all files in the translation unit. * Updated unit tests. * Due to major simplification of structures in FileOverrides.h, the FileOverridesTest is quite a bit simpler now. llvm-svn: 189798 --- clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp | 11 ++++++----- clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h | 2 +- .../cpp11-migrate/UseAuto/UseAutoActions.cpp | 7 ++++--- clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.h | 16 ++++++---------- 4 files changed, 17 insertions(+), 19 deletions(-) (limited to 'clang-tools-extra/cpp11-migrate/UseAuto') diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp index ccf49d88c92..72f5ae077f2 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp @@ -20,7 +20,7 @@ using clang::ast_matchers::MatchFinder; using namespace clang; using namespace clang::tooling; -int UseAutoTransform::apply(FileOverrides &InputStates, +int UseAutoTransform::apply(const FileOverrides &InputStates, const clang::tooling::CompilationDatabase &Database, const std::vector &SourcePaths) { ClangTool UseAutoTool(Database, SourcePaths); @@ -28,10 +28,11 @@ int UseAutoTransform::apply(FileOverrides &InputStates, unsigned AcceptedChanges = 0; MatchFinder Finder; - IteratorReplacer ReplaceIterators(getReplacements(), AcceptedChanges, - Options().MaxRiskLevel, /*Owner=*/ *this); - NewReplacer ReplaceNew(getReplacements(), AcceptedChanges, - Options().MaxRiskLevel, /*Owner=*/ *this); + ReplacementsVec Replaces; + IteratorReplacer ReplaceIterators(AcceptedChanges, Options().MaxRiskLevel, + /*Owner=*/ *this); + NewReplacer ReplaceNew(AcceptedChanges, Options().MaxRiskLevel, + /*Owner=*/ *this); Finder.addMatcher(makeIteratorDeclMatcher(), &ReplaceIterators); Finder.addMatcher(makeDeclWithNewMatcher(), &ReplaceNew); diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h index 71b8dd7dc95..26b5e4496f6 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h @@ -34,7 +34,7 @@ public: : Transform("UseAuto", Options) {} /// \see Transform::run(). - virtual int apply(FileOverrides &InputStates, + virtual int apply(const FileOverrides &InputStates, const clang::tooling::CompilationDatabase &Database, const std::vector &SourcePaths) LLVM_OVERRIDE; }; diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp b/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp index 643de63069e..2a8d5c5935d 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp @@ -73,7 +73,7 @@ void IteratorReplacer::run(const MatchFinder::MatchResult &Result) { // iterators but something to keep in mind in the future. CharSourceRange Range(TL.getSourceRange(), true); - Replace.insert(tooling::Replacement(SM, Range, "auto")); + Owner.addReplacementForCurrentTU(tooling::Replacement(SM, Range, "auto")); ++AcceptedChanges; } @@ -131,8 +131,9 @@ void NewReplacer::run(const MatchFinder::MatchResult &Result) { for (std::vector::iterator I = StarLocations.begin(), E = StarLocations.end(); I != E; ++I) { - Replace.insert(tooling::Replacement(SM, *I, 1, "")); + Owner.addReplacementForCurrentTU(tooling::Replacement(SM, *I, 1, "")); } + // FIXME: There is, however, one case we can address: when the VarDecl // pointee is the same as the initializer, just more CV-qualified. However, // TypeLoc information is not reliable where CV qualifiers are concerned so @@ -141,6 +142,6 @@ void NewReplacer::run(const MatchFinder::MatchResult &Result) { FirstDecl->getTypeSourceInfo()->getTypeLoc().getSourceRange(), true); // Space after 'auto' to handle cases where the '*' in the pointer type // is next to the identifier. This avoids changing 'int *p' into 'autop'. - Replace.insert(tooling::Replacement(SM, Range, "auto ")); + Owner.addReplacementForCurrentTU(tooling::Replacement(SM, Range, "auto ")); ++AcceptedChanges; } diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.h b/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.h index 403621803c3..0ddb0e0c5af 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.h +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.h @@ -25,36 +25,32 @@ class IteratorReplacer : public clang::ast_matchers::MatchFinder::MatchCallback { public: - IteratorReplacer(clang::tooling::Replacements &Replace, - unsigned &AcceptedChanges, RiskLevel, const Transform &Owner) - : Replace(Replace), AcceptedChanges(AcceptedChanges), Owner(Owner) {} + IteratorReplacer(unsigned &AcceptedChanges, RiskLevel, Transform &Owner) + : AcceptedChanges(AcceptedChanges), Owner(Owner) {} /// \brief Entry point to the callback called when matches are made. virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &Result) LLVM_OVERRIDE; private: - clang::tooling::Replacements &Replace; unsigned &AcceptedChanges; - const Transform &Owner; + Transform &Owner; }; /// \brief The callback used when replacing type specifiers of variable /// declarations initialized by a C++ new expression. class NewReplacer : public clang::ast_matchers::MatchFinder::MatchCallback { public: - NewReplacer(clang::tooling::Replacements &Replace, unsigned &AcceptedChanges, - RiskLevel, const Transform &Owner) - : Replace(Replace), AcceptedChanges(AcceptedChanges), Owner(Owner) {} + NewReplacer(unsigned &AcceptedChanges, RiskLevel, Transform &Owner) + : AcceptedChanges(AcceptedChanges), Owner(Owner) {} /// \brief Entry point to the callback called when matches are made. virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &Result) LLVM_OVERRIDE; private: - clang::tooling::Replacements &Replace; unsigned &AcceptedChanges; - const Transform &Owner; + Transform &Owner; }; #endif // CPP11_MIGRATE_USE_AUTO_ACTIONS_H -- cgit v1.2.3