Hi revane, arielbernal, tareqsiraj,
This commit include the following changes:
- SourceOverrides is now a class
- it simplifies the usage for the Transform class, since now the replacements
can be applied directly to the file overrides with
SourceOverrides::applyReplacements().
- it contains a method applyRewrites() which was previously named
collectResults() in Transform.cpp. The method has been "optimized" a bit to
re-use the allocated buffer (std::string::clear() is called).
- since the class has some logic it's now unit tested
- Now FileOverrides is a class (not a std::map typedef) and store pointers to
the SourceOverrides. The reason is that the SourceOverrides can't be copied
anymore (which was already something to avoid since it's can be a quite large
object).
- File headers (/License) have been added to the unit tests.
http://llvm-reviews.chandlerc.com/D1122
Files:
cpp11-migrate/Core/FileOverrides.cpp
cpp11-migrate/Core/FileOverrides.h
cpp11-migrate/Core/SyntaxCheck.cpp
cpp11-migrate/Core/SyntaxCheck.h
cpp11-migrate/Core/Transform.cpp
cpp11-migrate/Core/Transform.h
cpp11-migrate/tool/Cpp11Migrate.cpp
unittests/cpp11-migrate/CMakeLists.txt
unittests/cpp11-migrate/FileOverridesTest.cpp
unittests/cpp11-migrate/IncludeExcludeTest.cpp
unittests/cpp11-migrate/PerfSupportTest.cpp
unittests/cpp11-migrate/TransformTest.cpp
Index: cpp11-migrate/Core/FileOverrides.cpp
===================================================================
--- cpp11-migrate/Core/FileOverrides.cpp
+++ cpp11-migrate/Core/FileOverrides.cpp
@@ -16,19 +16,105 @@
#include "Core/FileOverrides.h"
#include "clang/Basic/SourceManager.h"
+#include "clang/Format/Format.h"
+#include "clang/Frontend/TextDiagnosticPrinter.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/Tooling/Tooling.h"
-void SourceOverrides::applyOverrides(clang::SourceManager &SM) const {
- clang::FileManager &FM = SM.getFileManager();
+#include "llvm/Support/raw_ostream.h"
+
+using namespace clang;
+using namespace clang::tooling;
+
+SourceOverrides::SourceOverrides(llvm::StringRef MainFileName)
+ : MainFileName(MainFileName), DiagOpts(new DiagnosticOptions()),
+ Diagnostics(llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
+ DiagOpts.getPtr(),
+ new TextDiagnosticPrinter(llvm::errs(), DiagOpts.getPtr()),
+ /*OwnPrinter*/ true),
+ Files(FileSystemOptions()) {}
+
+void SourceOverrides::applyReplacements(Replacements &Replaces) {
+ SourceManager SM(Diagnostics, Files);
+ applyOverrides(SM);
+
+ Rewriter Rewrites(SM, LangOptions());
+
+ // FIXME: applyAllReplacements will indicate if it couldn't apply all
+ // replacements. Handle that case.
+ bool Success = tooling::applyAllReplacements(Replaces, Rewrites);
+
+ if (!Success)
+ llvm::errs() << "error: failed to apply some replacements.";
+
+ applyRewrites(Rewrites);
+}
+
+void SourceOverrides::applyRewrites(Rewriter &Rewrites) {
+ std::string ResultBuf;
+
+ for (Rewriter::buffer_iterator I = Rewrites.buffer_begin(),
+ E = Rewrites.buffer_end();
+ I != E; ++I) {
+ const FileEntry *Entry =
+ Rewrites.getSourceMgr().getFileEntryForID(I->first);
+ assert(Entry != NULL && "unexpected null FileEntry");
+ assert(Entry->getName() != NULL &&
+ "unexpected null return from FileEntry::getName()");
+ llvm::StringRef FileName = Entry->getName();
+
+ // Get a copy of the rewritten buffer from the Rewriter.
+ ResultBuf.clear();
+ llvm::raw_string_ostream StringStream(ResultBuf);
+ I->second.write(StringStream);
+ StringStream.flush();
+
+ if (MainFileName == FileName) {
+ MainFileOverride.swap(ResultBuf);
+ continue;
+ }
+
+ // Header overrides are treated differently. Eventually, raw replacements
+ // will be stored as well for later output to disk. Applying replacements
+ // in memory will always be necessary as the source goes down the transform
+ // pipeline.
+
+ HeaderOverride &HeaderOv = Headers[FileName];
+ HeaderOv.FileOverride.swap(ResultBuf);
+ // "Create" HeaderOverride if not already existing
+ if (HeaderOv.FileName.empty())
+ HeaderOv.FileName = FileName;
+ }
+}
+
+void SourceOverrides::applyOverrides(SourceManager &SM) const {
+ FileManager &FM = SM.getFileManager();
if (isSourceOverriden())
SM.overrideFileContents(FM.getFile(MainFileName),
llvm::MemoryBuffer::getMemBuffer(MainFileOverride));
- for (HeaderOverrides::const_iterator I = Headers.begin(),
- E = Headers.end(); I != E; ++I) {
- assert(!I->second.FileOverride.empty() && "Header override should not be empty!");
+ for (HeaderOverrides::const_iterator I = Headers.begin(), E = Headers.end();
+ I != E; ++I) {
+ assert(!I->second.FileOverride.empty() &&
+ "Header override should not be empty!");
SM.overrideFileContents(
FM.getFile(I->second.FileName),
llvm::MemoryBuffer::getMemBuffer(I->second.FileOverride));
}
}
+
+FileOverrides::~FileOverrides() {
+ for (SourceOverridesMap::iterator I = Overrides.begin(), E = Overrides.end();
+ I != E; ++I)
+ delete I->getValue();
+}
+
+SourceOverrides &FileOverrides::getOrCreate(llvm::StringRef Filename) {
+ SourceOverrides *&Override = Overrides[Filename];
+
+ if (Override == NULL)
+ Override = new SourceOverrides(Filename);
+ return *Override;
+}
Index: cpp11-migrate/Core/FileOverrides.h
===================================================================
--- cpp11-migrate/Core/FileOverrides.h
+++ cpp11-migrate/Core/FileOverrides.h
@@ -16,15 +16,17 @@
#ifndef CPP11_MIGRATE_FILE_OVERRIDES_H
#define CPP11_MIGRATE_FILE_OVERRIDES_H
-#include "llvm/ADT/StringRef.h"
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticOptions.h"
+#include "clang/Basic/FileManager.h"
+#include "clang/Tooling/Refactoring.h"
-#include <map>
-#include <string>
+#include "llvm/ADT/StringMap.h"
// Forward Declarations
namespace clang {
class SourceManager;
-class FileManager;
+class Rewriter;
} // namespace clang
/// \brief Container for storing override information for a single headers.
@@ -37,29 +39,86 @@
};
/// \brief Container mapping header file names to override information.
-typedef std::map<std::string, HeaderOverride> HeaderOverrides;
+typedef llvm::StringMap<HeaderOverride> HeaderOverrides;
/// \brief Container storing the file content overrides for a source file.
-struct SourceOverrides {
- SourceOverrides(const std::string &MainFileName)
- : MainFileName(MainFileName) {}
+class SourceOverrides {
+public:
+ SourceOverrides(llvm::StringRef MainFileName);
- /// \brief Convenience function for applying this source's overrides to
- /// the given SourceManager.
- void applyOverrides(clang::SourceManager &SM) const;
+ /// \brief Accessors.
+ /// @{
+ llvm::StringRef getMainFileName() const { return MainFileName; }
+ llvm::StringRef getMainFileContent() const { return MainFileOverride; }
+ /// @}
/// \brief Indicates if the source file has been overridden.
///
/// It's possible for a source to remain unchanged while only headers are
/// changed.
bool isSourceOverriden() const { return !MainFileOverride.empty(); }
- std::string MainFileName;
+ /// \brief Override the file contents by applying all the replacements.
+ void applyReplacements(clang::tooling::Replacements &Replaces);
+
+ /// \brief Convenience function for applying this source's overrides to
+ /// the given SourceManager.
+ void applyOverrides(clang::SourceManager &SM) const;
+
+ /// \brief Iterators.
+ /// @{
+ HeaderOverrides::iterator headers_begin() { return Headers.begin(); }
+ HeaderOverrides::iterator headers_end() { return Headers.end(); }
+ HeaderOverrides::const_iterator headers_begin() const {
+ return Headers.begin();
+ }
+ HeaderOverrides::const_iterator headers_end() const { return Headers.end(); }
+ /// @}
+
+private:
+ /// \brief Flatten the Rewriter buffers of \p Rewrite and store results as
+ /// file content overrides.
+ void applyRewrites(clang::Rewriter &Rewrite);
+
+private:
+ const std::string MainFileName;
std::string MainFileOverride;
HeaderOverrides Headers;
+ llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts;
+ clang::DiagnosticsEngine Diagnostics;
+ clang::FileManager Files;
};
/// \brief Maps source file names to content override information.
-typedef std::map<std::string, SourceOverrides> FileOverrides;
+class FileOverrides {
+public:
+ typedef llvm::StringMap<SourceOverrides *> SourceOverridesMap;
+ typedef SourceOverridesMap::const_iterator const_iterator;
+
+public:
+ FileOverrides() {}
+ ~FileOverrides();
+
+ const_iterator find(llvm::StringRef Filename) const {
+ return Overrides.find(Filename);
+ }
+
+ /// \brief Get the \c SourceOverrides for \p Filename, creating it if
+ /// necessary.
+ SourceOverrides &getOrCreate(llvm::StringRef Filename);
+
+ /// \brief Iterators.
+ /// @{
+ const_iterator begin() const { return Overrides.begin(); }
+ const_iterator end() const { return Overrides.end(); }
+ /// @}
+
+private:
+ FileOverrides(const FileOverrides &) LLVM_DELETED_FUNCTION;
+ FileOverrides &operator=(const FileOverrides &) LLVM_DELETED_FUNCTION;
+
+private:
+ SourceOverridesMap Overrides;
+};
#endif // CPP11_MIGRATE_FILE_OVERRIDES_H
Index: cpp11-migrate/Core/SyntaxCheck.cpp
===================================================================
--- cpp11-migrate/Core/SyntaxCheck.cpp
+++ cpp11-migrate/Core/SyntaxCheck.cpp
@@ -13,7 +13,10 @@
///
//===----------------------------------------------------------------------===//
-#include "SyntaxCheck.h"
+#include "Core/SyntaxCheck.h"
+
+#include "Core/FileOverrides.h"
+
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/Tooling.h"
@@ -31,7 +34,7 @@
FileOverrides::const_iterator I = Overrides.find(Filename);
if (I != Overrides.end())
- I->second.applyOverrides(CI.getSourceManager());
+ I->second->applyOverrides(CI.getSourceManager());
return true;
}
Index: cpp11-migrate/Core/SyntaxCheck.h
===================================================================
--- cpp11-migrate/Core/SyntaxCheck.h
+++ cpp11-migrate/Core/SyntaxCheck.h
@@ -16,8 +16,7 @@
#ifndef CPP11_MIGRATE_SYNTAX_CHECK_H
#define CPP11_MIGRATE_SYNTAX_CHECK_H
-#include "Core/FileOverrides.h"
-
+#include <string>
#include <vector>
// Forward Declarations
@@ -27,6 +26,8 @@
} // namespace tooling
} // namespace clang
+class FileOverrides;
+
/// \brief Perform a syntax-only check over all files in \c SourcePaths using
/// options provided by \c Database using file contents from \c Overrides if
/// available.
Index: cpp11-migrate/Core/Transform.cpp
===================================================================
--- cpp11-migrate/Core/Transform.cpp
+++ cpp11-migrate/Core/Transform.cpp
@@ -14,15 +14,14 @@
//===----------------------------------------------------------------------===//
#include "Core/Transform.h"
+
+#include "Core/FileOverrides.h"
+
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Basic/LangOptions.h"
-#include "clang/Basic/DiagnosticOptions.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Frontend/TextDiagnosticPrinter.h"
-#include "clang/Rewrite/Core/Rewriter.h"
#include "clang/Tooling/Tooling.h"
-#include "llvm/Support/raw_ostream.h"
using namespace clang;
@@ -77,96 +76,8 @@
};
} // namespace
-/// \brief Class for creating Rewriter objects and housing Rewriter
-/// dependencies.
-///
-/// A Rewriter depends on a SourceManager which in turn depends on a
-/// FileManager and a DiagnosticsEngine. Transform uses this class to create a
-/// new Rewriter and SourceManager for every translation unit it transforms. A
-/// DiagnosticsEngine doesn't need to be re-created so it's constructed once. A
-/// SourceManager and Rewriter are (re)created as required.
-///
-/// FIXME: The DiagnosticsEngine should really come from somewhere more global.
-/// It shouldn't be re-created once for every transform.
-///
-/// NOTE: SourceManagers cannot be shared. Therefore the one used to parse the
-/// translation unit cannot be used to create a Rewriter. This is why both a
-/// SourceManager and Rewriter need to be created for each translation unit.
-class RewriterManager {
-public:
- RewriterManager()
- : DiagOpts(new DiagnosticOptions()),
- DiagnosticPrinter(llvm::errs(), DiagOpts.getPtr()),
- Diagnostics(
- llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
- DiagOpts.getPtr(), &DiagnosticPrinter, false) {}
-
- void prepare(FileManager &Files) {
- Sources.reset(new SourceManager(Diagnostics, Files));
- Rewrite.reset(new Rewriter(*Sources, DefaultLangOptions));
- }
-
- void applyOverrides(const SourceOverrides &Overrides) {
- Overrides.applyOverrides(*Sources);
- }
-
- Rewriter &getRewriter() { return *Rewrite; }
-
-private:
- LangOptions DefaultLangOptions;
- llvm::IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
- TextDiagnosticPrinter DiagnosticPrinter;
- DiagnosticsEngine Diagnostics;
- llvm::OwningPtr<SourceManager> Sources;
- llvm::OwningPtr<Rewriter> Rewrite;
-};
-
-/// \brief Flatten the Rewriter buffers of \p Rewrite and store results as
-/// file content overrides in \p Overrides.
-void collectResults(clang::Rewriter &Rewrite, SourceOverrides &Overrides) {
- for (Rewriter::buffer_iterator I = Rewrite.buffer_begin(),
- E = Rewrite.buffer_end();
- I != E; ++I) {
- const FileEntry *Entry = Rewrite.getSourceMgr().getFileEntryForID(I->first);
- assert(Entry != 0 && "Expected a FileEntry");
- assert(Entry->getName() != 0 &&
- "Unexpected NULL return from FileEntry::getName()");
-
- std::string ResultBuf;
-
- // Get a copy of the rewritten buffer from the Rewriter.
- llvm::raw_string_ostream StringStream(ResultBuf);
- I->second.write(StringStream);
-
- // Cause results to be written to ResultBuf.
- StringStream.str();
-
- // FIXME: Use move semantics to avoid copies of the buffer contents if
- // benchmarking shows the copies are expensive, especially for large source
- // files.
-
- if (Overrides.MainFileName == Entry->getName()) {
- Overrides.MainFileOverride = ResultBuf;
- continue;
- }
-
- // Header overrides are treated differently. Eventually, raw replacements
- // will be stored as well for later output to disk. Applying replacements
- // in memory will always be necessary as the source goes down the transform
- // pipeline.
-
- // Create HeaderOverride if not already existing
- HeaderOverride &Header = Overrides.Headers[Entry->getName()];
- if (Header.FileName.empty())
- Header.FileName = Entry->getName();
-
- Header.FileOverride = ResultBuf;
- }
-}
-
Transform::Transform(llvm::StringRef Name, const TransformOptions &Options)
- : Name(Name), GlobalOptions(Options), Overrides(0),
- RewriterOwner(new RewriterManager) {
+ : Name(Name), GlobalOptions(Options), Overrides(0) {
Reset();
}
@@ -192,12 +103,9 @@
CurrentSource = Filename.str();
- RewriterOwner->prepare(CI.getFileManager());
FileOverrides::const_iterator I = Overrides->find(CurrentSource);
- if (I != Overrides->end()) {
- I->second.applyOverrides(CI.getSourceManager());
- RewriterOwner->applyOverrides(I->second);
- }
+ if (I != Overrides->end())
+ I->second->applyOverrides(CI.getSourceManager());
Replace.clear();
@@ -210,16 +118,8 @@
void Transform::handleEndSource() {
if (!getReplacements().empty()) {
- // FIXME: applyAllReplacements will indicate if it couldn't apply all
- // replacements. Handle that case.
- applyAllReplacements(getReplacements(), RewriterOwner->getRewriter());
-
- FileOverrides::iterator I = Overrides->find(CurrentSource);
- if (I == Overrides->end())
- I = Overrides->insert(FileOverrides::value_type(CurrentSource,
- CurrentSource)).first;
-
- collectResults(RewriterOwner->getRewriter(), I->second);
+ SourceOverrides &SO = Overrides->getOrCreate(CurrentSource);
+ SO.applyReplacements(getReplacements());
}
if (Options().EnableTiming)
Index: cpp11-migrate/Core/Transform.h
===================================================================
--- cpp11-migrate/Core/Transform.h
+++ cpp11-migrate/Core/Transform.h
@@ -17,7 +17,6 @@
#define CPP11_MIGRATE_TRANSFORM_H
#include "Core/IncludeExcludeInfo.h"
-#include "Core/FileOverrides.h"
#include "clang/Tooling/Refactoring.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/Support/CommandLine.h"
@@ -51,7 +50,7 @@
} // namespace ast_matchers
} // namespace clang
-class RewriterManager;
+class FileOverrides;
/// \brief To group transforms' options together when printing the help.
extern llvm::cl::OptionCategory TransformsOptionsCategory;
@@ -216,7 +215,6 @@
const TransformOptions &GlobalOptions;
FileOverrides *Overrides;
clang::tooling::Replacements Replace;
- llvm::OwningPtr<RewriterManager> RewriterOwner;
std::string CurrentSource;
TimingVec Timings;
unsigned AcceptedChanges;
Index: cpp11-migrate/tool/Cpp11Migrate.cpp
===================================================================
--- cpp11-migrate/tool/Cpp11Migrate.cpp
+++ cpp11-migrate/tool/Cpp11Migrate.cpp
@@ -15,10 +15,12 @@
///
//===----------------------------------------------------------------------===//
+#include "Core/FileOverrides.h"
+#include "Core/PerfSupport.h"
#include "Core/SyntaxCheck.h"
-#include "Core/Transforms.h"
#include "Core/Transform.h"
-#include "Core/PerfSupport.h"
+#include "Core/Transforms.h"
+
#include "LoopConvert/LoopConvert.h"
#include "UseNullptr/UseNullptr.h"
#include "UseAuto/UseAuto.h"
@@ -30,6 +32,7 @@
#include "llvm/Support/Signals.h"
namespace cl = llvm::cl;
+using namespace clang;
using namespace clang::tooling;
TransformOptions GlobalOptions;
@@ -190,25 +193,28 @@
for (FileOverrides::const_iterator I = FileStates.begin(),
E = FileStates.end();
I != E; ++I) {
- if (I->second.isSourceOverriden()) {
+ const SourceOverrides &Overrides = *I->second;
+ if (Overrides.isSourceOverriden()) {
std::string ErrorInfo;
- llvm::raw_fd_ostream FileStream(I->first.c_str(), ErrorInfo,
+ std::string MainFileName = I->getKey();
+ llvm::raw_fd_ostream FileStream(MainFileName.c_str(), ErrorInfo,
llvm::raw_fd_ostream::F_Binary);
- FileStream << I->second.MainFileOverride;
+ FileStream << Overrides.getMainFileContent();
}
- // FIXME: The Migrator shouldn't be responsible for writing headers
- // to disk. Instead, it should write replacement info and another tool
- // should take all replacement info for a header from possibly many other
- // migration processes and merge it into a final form. For now, the
- // updated header is written to disk for testing purposes.
- for (HeaderOverrides::const_iterator HeaderI = I->second.Headers.begin(),
- HeaderE = I->second.Headers.end();
+ // FIXME: The Migrator shouldn't be responsible for writing headers to disk.
+ // Instead, it should write replacement info and another tool should take
+ // all replacement info for a header from possibly many other migration
+ // processes and merge it into a final form. For now, the updated header is
+ // written to disk for testing purposes.
+ for (HeaderOverrides::const_iterator HeaderI = Overrides.headers_begin(),
+ HeaderE = Overrides.headers_end();
HeaderI != HeaderE; ++HeaderI) {
assert(!HeaderI->second.FileOverride.empty() &&
"A header override should not be empty");
std::string ErrorInfo;
- llvm::raw_fd_ostream HeaderStream(HeaderI->first.c_str(), ErrorInfo,
+ std::string HeaderFileName = HeaderI->getKey();
+ llvm::raw_fd_ostream HeaderStream(HeaderFileName.c_str(), ErrorInfo,
llvm::raw_fd_ostream::F_Binary);
HeaderStream << HeaderI->second.FileOverride;
}
Index: unittests/cpp11-migrate/CMakeLists.txt
===================================================================
--- unittests/cpp11-migrate/CMakeLists.txt
+++ unittests/cpp11-migrate/CMakeLists.txt
@@ -7,9 +7,11 @@
include_directories(${CPP11_MIGRATE_SOURCE_DIR})
add_extra_unittest(Cpp11MigrateTests
- TransformTest.cpp
+ FileOverridesTest.cpp
IncludeExcludeTest.cpp
- PerfSupportTest.cpp)
+ PerfSupportTest.cpp
+ TransformTest.cpp
+ )
target_link_libraries(Cpp11MigrateTests
migrateCore
Index: unittests/cpp11-migrate/FileOverridesTest.cpp
===================================================================
--- /dev/null
+++ unittests/cpp11-migrate/FileOverridesTest.cpp
@@ -0,0 +1,81 @@
+//===- cpp11-migrate/FileOverridesTest.cpp - File overrides unit tests ----===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Core/FileOverrides.h"
+
+#include "gtest/gtest.h"
+
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
+
+using namespace llvm;
+using namespace clang;
+
+// FIXME: copied from unittests/Support/Path.cpp
+#define ASSERT_NO_ERROR(x) \
+ if (llvm::error_code ASSERT_NO_ERROR_ec = x) { \
+ llvm::SmallString<128> MessageStorage; \
+ llvm::raw_svector_ostream Message(MessageStorage); \
+ Message << #x ": did not return errc::success.\n" \
+ << "error number: " << ASSERT_NO_ERROR_ec.value() << "\n" \
+ << "error message: " << ASSERT_NO_ERROR_ec.message() << "\n"; \
+ GTEST_FATAL_FAILURE_(MessageStorage.c_str()); \
+ } else { \
+ }
+
+// Test fixture object that setup some files once for all test cases and remove
+// them when the tests are done.
+class SourceOverridesTest : public ::testing::Test {
+protected:
+ static std::string TestFilename;
+
+ static void SetUpTestCase() {
+ llvm::SmallString<128> Path;
+ int FD;
+
+ ASSERT_NO_ERROR(
+ sys::fs::createTemporaryFile("cpp11-migrate", "cpp", FD, Path));
+
+ TestFilename = Path.str();
+ raw_fd_ostream File(FD, /*shouldClose=*/true);
+ StringRef FileContent =
+ "std::vector<such_a_long_name_for_a_type>::const_iterator long_type =\n"
+ " vec.begin();\n"
+ "int x;"; // test that it's not the whole file that is reformatted
+
+ File << FileContent;
+ }
+
+ static void TearDownTestCase() {
+ ASSERT_NO_ERROR(sys::fs::remove(TestFilename));
+ }
+};
+
+std::string SourceOverridesTest::TestFilename;
+
+TEST_F(SourceOverridesTest, Interface) {
+ SourceOverrides Overrides(TestFilename);
+
+ EXPECT_EQ(TestFilename, Overrides.getMainFileName());
+ EXPECT_FALSE(Overrides.isSourceOverriden());
+
+ tooling::Replacements Replaces;
+ unsigned ReplacementLength =
+ strlen("std::vector<such_a_long_name_for_a_type>::const_iterator");
+ Replaces.insert(
+ tooling::Replacement(TestFilename, 0, ReplacementLength, "auto"));
+ Overrides.applyReplacements(Replaces);
+ EXPECT_TRUE(Overrides.isSourceOverriden());
+
+ std::string ExpectedContent = "auto long_type =\n"
+ " vec.begin();\n"
+ "int x;";
+
+ EXPECT_EQ(ExpectedContent, Overrides.getMainFileContent());
+}
Index: unittests/cpp11-migrate/IncludeExcludeTest.cpp
===================================================================
--- unittests/cpp11-migrate/IncludeExcludeTest.cpp
+++ unittests/cpp11-migrate/IncludeExcludeTest.cpp
@@ -1,7 +1,20 @@
+//===- cpp11-migrate/IncludeExcludeTest.cpp - IncludeExclude unit tests ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
#include "Core/IncludeExcludeInfo.h"
+
#include "gtest/gtest.h"
+
+#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
+
#include <fstream>
// FIXME: copied from unittests/Support/Path.cpp
@@ -58,7 +71,7 @@
IncludeDataPath = Path.str();
{
llvm::raw_fd_ostream IncludeDataFile(FD, true);
- for (unsigned i = 0; i < sizeof(IncludeData) / sizeof(char *); ++i) {
+ for (unsigned i = 0; i < llvm::array_lengthof(IncludeData); ++i) {
IncludeDataFile << IncludeData[i] << (UnixMode ? "\n" : "\r\n");
}
}
@@ -68,7 +81,7 @@
ExcludeDataPath = Path.str();
{
llvm::raw_fd_ostream ExcludeDataFile(FD, true);
- for (unsigned i = 0; i < sizeof(ExcludeData) / sizeof(char *); ++i) {
+ for (unsigned i = 0; i < llvm::array_lengthof(ExcludeData); ++i) {
ExcludeDataFile << ExcludeData[i] << (UnixMode ? "\n" : "\r\n");
}
}
Index: unittests/cpp11-migrate/PerfSupportTest.cpp
===================================================================
--- unittests/cpp11-migrate/PerfSupportTest.cpp
+++ unittests/cpp11-migrate/PerfSupportTest.cpp
@@ -1,6 +1,16 @@
-#include "gtest/gtest.h"
+//===- cpp11-migrate/PerfSupportTest.cpp - PerfSupport unit tests --------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
#include "Core/PerfSupport.h"
+#include "gtest/gtest.h"
+
using namespace llvm;
using namespace clang;
Index: unittests/cpp11-migrate/TransformTest.cpp
===================================================================
--- unittests/cpp11-migrate/TransformTest.cpp
+++ unittests/cpp11-migrate/TransformTest.cpp
@@ -1,5 +1,18 @@
-#include "gtest/gtest.h"
+//===- cpp11-migrate/TransformTest.cpp - Transform unit tests -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
#include "Core/Transform.h"
+
+#include "gtest/gtest.h"
+
+#include "Core/FileOverrides.h"
+
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/DeclGroup.h"
#include "clang/ASTMatchers/ASTMatchers.h"
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits