diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-07-22 21:03:56 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-07-22 21:03:56 +0000 |
commit | 29e449f22280b8c15619e5b3e9df30f1ae9dfb0a (patch) | |
tree | 83250c1587ab42fc65774d7be76c2b6e10dd6a8a /clang-tools-extra/cpp11-migrate/Core | |
parent | 476f38a0c28f3cf94535b9eed2e2b2929f075c91 (diff) | |
download | bcm5719-llvm-29e449f22280b8c15619e5b3e9df30f1ae9dfb0a.tar.gz bcm5719-llvm-29e449f22280b8c15619e5b3e9df30f1ae9dfb0a.zip |
Revert "cp11-migrate: Integration with LibFormat"
This reverts commit r186866.
This breaks the build and the original author Guillaume Papin
<guillaume.papin@epitech.eu> asked me to revert so he could look at it more with
revane.
llvm-svn: 186873
Diffstat (limited to 'clang-tools-extra/cpp11-migrate/Core')
5 files changed, 8 insertions, 320 deletions
diff --git a/clang-tools-extra/cpp11-migrate/Core/CMakeLists.txt b/clang-tools-extra/cpp11-migrate/Core/CMakeLists.txt index d89d86cc545..562ae65e1eb 100644 --- a/clang-tools-extra/cpp11-migrate/Core/CMakeLists.txt +++ b/clang-tools-extra/cpp11-migrate/Core/CMakeLists.txt @@ -7,12 +7,9 @@ add_clang_library(migrateCore Transform.cpp IncludeExcludeInfo.cpp PerfSupport.cpp - Reformatting.cpp ) target_link_libraries(migrateCore - clangFormat clangTooling clangBasic clangASTMatchers - clangRewriteFrontend ) diff --git a/clang-tools-extra/cpp11-migrate/Core/FileOverrides.cpp b/clang-tools-extra/cpp11-migrate/Core/FileOverrides.cpp index ae90b113bdb..200b7fa2d9e 100644 --- a/clang-tools-extra/cpp11-migrate/Core/FileOverrides.cpp +++ b/clang-tools-extra/cpp11-migrate/Core/FileOverrides.cpp @@ -17,6 +17,8 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/SourceManager.h" +#include "clang/Format/Format.h" +#include "clang/Lex/Lexer.h" #include "clang/Rewrite/Core/Rewriter.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/FileSystem.h" @@ -27,11 +29,10 @@ using namespace clang; using namespace clang::tooling; -SourceOverrides::SourceOverrides(llvm::StringRef MainFileName, - bool TrackChanges) - : MainFileName(MainFileName), TrackChanges(TrackChanges) {} +SourceOverrides::SourceOverrides(llvm::StringRef MainFileName) + : MainFileName(MainFileName) {} -void SourceOverrides::applyReplacements(Replacements &Replaces) { +void SourceOverrides::applyReplacements(tooling::Replacements &Replaces) { llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts( new DiagnosticOptions()); DiagnosticsEngine Diagnostics( @@ -56,8 +57,6 @@ void SourceOverrides::applyReplacements(tooling::Replacements &Replaces, llvm::errs() << "error: failed to apply some replacements."; applyRewrites(Rewrites); - if (TrackChanges) - adjustChangedRanges(Replaces); } void SourceOverrides::applyRewrites(Rewriter &Rewrites) { @@ -97,30 +96,6 @@ void SourceOverrides::applyRewrites(Rewriter &Rewrites) { } } -void SourceOverrides::adjustChangedRanges(const Replacements &Replaces) { - // Start by grouping replacements by file name - Replacements MainFileReplaces; - llvm::StringMap<Replacements> HeadersReplaces; - - for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E; - ++I) { - llvm::StringRef ReplacementFileName = I->getFilePath(); - - if (ReplacementFileName == MainFileName) - MainFileReplaces.insert(*I); - else - HeadersReplaces[ReplacementFileName].insert(*I); - } - - // Then adjust the changed ranges for each individual file - MainFileChanges.adjustChangedRanges(Replaces); - for (llvm::StringMap<Replacements>::iterator I = HeadersReplaces.begin(), - E = HeadersReplaces.end(); - I != E; ++I) { - Headers[I->getKey()].Changes.adjustChangedRanges(I->getValue()); - } -} - void SourceOverrides::applyOverrides(SourceManager &SM) const { FileManager &FM = SM.getFileManager(); @@ -179,109 +154,6 @@ SourceOverrides &FileOverrides::getOrCreate(llvm::StringRef Filename) { SourceOverrides *&Override = Overrides[Filename]; if (Override == NULL) - Override = new SourceOverrides(Filename, TrackChanges); + Override = new SourceOverrides(Filename); return *Override; } - -namespace { - -/// \brief Comparator to be able to order tooling::Range based on their offset. -bool rangeLess(clang::tooling::Range A, clang::tooling::Range B) { - if (A.getOffset() == B.getOffset()) - return A.getLength() < B.getLength(); - return A.getOffset() < B.getOffset(); -} - -/// \brief Functor that returns the given range without its overlaps with the -/// replacement given in the constructor. -struct RangeReplacedAdjuster { - RangeReplacedAdjuster(const tooling::Replacement &Replace) - : Replace(Replace.getOffset(), Replace.getLength()), - ReplaceNewSize(Replace.getReplacementText().size()) {} - - tooling::Range operator()(clang::tooling::Range Range) const { - if (!Range.overlapsWith(Replace)) - return Range; - // range inside replacement -> make the range length null - if (Replace.contains(Range)) - return tooling::Range(Range.getOffset(), 0); - // replacement inside range -> resize the range - if (Range.contains(Replace)) { - int Difference = ReplaceNewSize - Replace.getLength(); - return tooling::Range(Range.getOffset(), Range.getLength() + Difference); - } - // beginning of the range replaced -> truncate range beginning - if (Range.getOffset() > Replace.getOffset()) { - unsigned ReplaceEnd = Replace.getOffset() + Replace.getLength(); - unsigned RangeEnd = Range.getOffset() + Range.getLength(); - return tooling::Range(ReplaceEnd, RangeEnd - ReplaceEnd); - } - // end of the range replaced -> truncate range end - if (Range.getOffset() < Replace.getOffset()) - return tooling::Range(Range.getOffset(), - Replace.getOffset() - Range.getOffset()); - llvm_unreachable("conditions not handled properly"); - } - - const tooling::Range Replace; - const unsigned ReplaceNewSize; -}; - -} // end anonymous namespace - -void ChangedRanges::adjustChangedRanges(const tooling::Replacements &Replaces) { - // first adjust existing ranges in case they overlap with the replacements - for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E; - ++I) { - const tooling::Replacement &Replace = *I; - - std::transform(Ranges.begin(), Ranges.end(), Ranges.begin(), - RangeReplacedAdjuster(Replace)); - } - - // then shift existing ranges to reflect the new positions - for (RangeVec::iterator I = Ranges.begin(), E = Ranges.end(); I != E; ++I) { - unsigned ShiftedOffset = - tooling::shiftedCodePosition(Replaces, I->getOffset()); - *I = tooling::Range(ShiftedOffset, I->getLength()); - } - - // then generate the new ranges from the replacements - for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E; - ++I) { - const tooling::Replacement &R = *I; - unsigned Offset = tooling::shiftedCodePosition(Replaces, R.getOffset()); - unsigned Length = R.getReplacementText().size(); - - Ranges.push_back(tooling::Range(Offset, Length)); - } - - // cleanups unecessary ranges to finish - coalesceRanges(); -} - -void ChangedRanges::coalesceRanges() { - // sort the ranges by offset and then for each group of adjacent/overlapping - // ranges the first one in the group is extended to cover the whole group. - std::sort(Ranges.begin(), Ranges.end(), &rangeLess); - RangeVec::iterator FirstInGroup = Ranges.begin(); - assert(!Ranges.empty() && "unexpected empty vector"); - for (RangeVec::iterator I = Ranges.begin() + 1, E = Ranges.end(); I != E; - ++I) { - unsigned GroupEnd = FirstInGroup->getOffset() + FirstInGroup->getLength(); - - // no contact - if (I->getOffset() > GroupEnd) - FirstInGroup = I; - else { - unsigned GrpBegin = FirstInGroup->getOffset(); - unsigned GrpEnd = std::max(GroupEnd, I->getOffset() + I->getLength()); - *FirstInGroup = tooling::Range(GrpBegin, GrpEnd - GrpBegin); - } - } - - // remove the ranges that are covered by the first member of the group - Ranges.erase(std::unique(Ranges.begin(), Ranges.end(), - std::mem_fun_ref(&Range::contains)), - Ranges.end()); -} diff --git a/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h b/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h index 2bb3daea7b0..7f8c8d20011 100644 --- a/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h +++ b/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h @@ -29,34 +29,6 @@ class SourceManager; class Rewriter; } // namespace clang -/// \brief Class encapsulating a list of \c tooling::Range with some -/// convenience methods. -/// -/// The ranges stored are used to keep track of the overriden parts of a file. -class ChangedRanges { - typedef std::vector<clang::tooling::Range> RangeVec; - -public: - typedef RangeVec::const_iterator const_iterator; - - /// \brief Create new ranges from the replacements and adjust existing one - /// to remove replaced parts. - /// - /// Note that all replacements should come from the same file. - void adjustChangedRanges(const clang::tooling::Replacements &Replaces); - - /// \brief Iterators. - /// @{ - const_iterator begin() const { return Ranges.begin(); } - const_iterator end() const { return Ranges.end(); } - /// @} - -private: - void coalesceRanges(); - - RangeVec Ranges; -}; - /// \brief Container for storing override information for a single headers. struct HeaderOverride { HeaderOverride() {} @@ -64,7 +36,6 @@ struct HeaderOverride { std::string FileName; std::string FileOverride; - ChangedRanges Changes; }; /// \brief Container mapping header file names to override information. @@ -75,18 +46,12 @@ typedef llvm::StringMap<HeaderOverride> HeaderOverrides; /// which changes have been made. class SourceOverrides { public: - SourceOverrides(llvm::StringRef MainFileName, bool TrackChanges); + SourceOverrides(llvm::StringRef MainFileName); /// \brief Accessors. /// @{ llvm::StringRef getMainFileName() const { return MainFileName; } llvm::StringRef getMainFileContent() const { return MainFileOverride; } - const ChangedRanges &getChangedRanges() const { return MainFileChanges; } - - /// \brief Is file change tracking enabled? - /// - /// Tracking file changes can be useful to reformat the code for example. - bool isTrackingFileChanges() const { return TrackChanges; } /// @} /// \brief Indicates if the source file has been overridden. @@ -122,14 +87,8 @@ private: /// file content overrides. void applyRewrites(clang::Rewriter &Rewrite); - /// \brief Adjust the changed ranges to reflect the parts of the files that - /// have been replaced. - void adjustChangedRanges(const clang::tooling::Replacements &Replaces); - const std::string MainFileName; std::string MainFileOverride; - const bool TrackChanges; - ChangedRanges MainFileChanges; HeaderOverrides Headers; }; @@ -139,11 +98,7 @@ public: typedef llvm::StringMap<SourceOverrides *> SourceOverridesMap; typedef SourceOverridesMap::const_iterator const_iterator; - /// \brief Construct the SourceOverrides manager. - /// - /// \param TrackChanges Wether or not the \c SourceOverrides should keep track - /// of changes. See \c SourceOverrides::isTrackingFileChanges(). - FileOverrides(bool TrackChanges) : TrackChanges(TrackChanges) {} + FileOverrides() {} ~FileOverrides(); const_iterator find(llvm::StringRef Filename) const { @@ -165,7 +120,6 @@ private: FileOverrides &operator=(const FileOverrides &) LLVM_DELETED_FUNCTION; SourceOverridesMap Overrides; - const bool TrackChanges; }; /// \brief Generate a unique filename to store the replacements. diff --git a/clang-tools-extra/cpp11-migrate/Core/Reformatting.cpp b/clang-tools-extra/cpp11-migrate/Core/Reformatting.cpp deleted file mode 100644 index 3fd77612bbf..00000000000 --- a/clang-tools-extra/cpp11-migrate/Core/Reformatting.cpp +++ /dev/null @@ -1,76 +0,0 @@ -//===-- Core/Reformatting.cpp - LibFormat integration ---------------------===// -// -// 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 LibFormat integration used to reformat -/// migrated code. -/// -//===----------------------------------------------------------------------===// - -#include "Core/Reformatting.h" -#include "Core/FileOverrides.h" -#include "clang/Basic/Diagnostic.h" -#include "clang/Basic/DiagnosticOptions.h" -#include "clang/Basic/SourceManager.h" -#include "clang/Lex/Lexer.h" - -using namespace clang; - -void Reformatter::reformatChanges(SourceOverrides &Overrides) { - llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts( - new DiagnosticOptions()); - DiagnosticsEngine Diagnostics( - llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), - DiagOpts.getPtr()); - FileManager Files((FileSystemOptions())); - SourceManager SM(Diagnostics, Files); - - reformatChanges(Overrides, SM); -} - -void Reformatter::reformatChanges(SourceOverrides &Overrides, - clang::SourceManager &SM) { - tooling::Replacements Replaces; - Overrides.applyOverrides(SM); - if (Overrides.isSourceOverriden()) - Replaces = reformatSingleFile(Overrides.getMainFileName(), - Overrides.getChangedRanges(), SM); - - for (HeaderOverrides::const_iterator I = Overrides.headers_begin(), - E = Overrides.headers_end(); - I != E; ++I) { - const HeaderOverride &Header = I->getValue(); - const tooling::Replacements &HeaderReplaces = - reformatSingleFile(Header.FileName, Header.Changes, SM); - Replaces.insert(HeaderReplaces.begin(), HeaderReplaces.end()); - } - Overrides.applyReplacements(Replaces, SM); -} - -tooling::Replacements Reformatter::reformatSingleFile( - llvm::StringRef FileName, const ChangedRanges &Changes, SourceManager &SM) { - const clang::FileEntry *Entry = SM.getFileManager().getFile(FileName); - assert(Entry && "expected an existing file"); - - FileID ID = SM.translateFile(Entry); - if (ID.isInvalid()) - ID = SM.createFileID(Entry, SourceLocation(), clang::SrcMgr::C_User); - - std::vector<CharSourceRange> ReformatRanges; - SourceLocation StartOfFile = SM.getLocForStartOfFile(ID); - for (ChangedRanges::const_iterator I = Changes.begin(), E = Changes.end(); - I != E; ++I) { - SourceLocation Start = StartOfFile.getLocWithOffset(I->getOffset()); - SourceLocation End = Start.getLocWithOffset(I->getLength()); - ReformatRanges.push_back(CharSourceRange::getCharRange(Start, End)); - } - - Lexer Lex(ID, SM.getBuffer(ID), SM, getFormattingLangOpts(Style.Standard)); - return format::reformat(Style, Lex, SM, ReformatRanges); -} diff --git a/clang-tools-extra/cpp11-migrate/Core/Reformatting.h b/clang-tools-extra/cpp11-migrate/Core/Reformatting.h deleted file mode 100644 index ac9fef381c6..00000000000 --- a/clang-tools-extra/cpp11-migrate/Core/Reformatting.h +++ /dev/null @@ -1,59 +0,0 @@ -//===-- Core/Reformatting.h - LibFormat integration -------------*- 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 LibFormat integration used to reformat -/// migrated code. -/// -//===----------------------------------------------------------------------===// - -#ifndef CPP11_MIGRATE_REFORMATTING_H -#define CPP11_MIGRATE_REFORMATTING_H - -#include "clang/Format/Format.h" - -class SourceOverrides; -class ChangedRanges; - -class Reformatter { -public: - Reformatter(const clang::format::FormatStyle &Style) : Style(Style) {} - - /// \brief Reformat the changes made to the file overrides. - /// - /// \param Overrides Overriden source files to reformat. Note that since only - /// the changes are reformatted, file change tracking has to be enabled. - /// \param SM A SourceManager where the overridens files can be found. - /// - /// \sa \c SourceOverrides::isTrackingFileChanges() - void reformatChanges(SourceOverrides &Overrides, clang::SourceManager &SM); - - /// \brief Overload of \c reformatChanges() providing it's own - /// \c SourceManager. - void reformatChanges(SourceOverrides &Overrides); - - /// \brief Produce a list of replacements to apply on \p FileName, only the - /// ranges in \p Changes are replaced. - /// - /// Since this routine use \c clang::format::reformat() the rules that applies - /// on the ranges are identical: - /// - /// <blockquote> Each range is extended on either end to its next bigger logic - /// unit, i.e. everything that might influence its formatting or might be - /// influenced by its formatting. - /// -- \c clang::format::reformat()</blockquote> - clang::tooling::Replacements reformatSingleFile(llvm::StringRef FileName, - const ChangedRanges &Changes, - clang::SourceManager &SM); - -private: - clang::format::FormatStyle Style; -}; - -#endif // CPP11_MIGRATE_REFORMATTING_H |