tareqsiraj added you to the CC list for the revision "cpp11-migrate: Write
header replacements to disk".
Hi revane, Sarcasm, arielbernal,
Header replacements are now written to disk in YAML format for an
external tool to merge. A unique file will be created in the same
directory as the header with all replacements that came from a source
file that included the header file. The YAML file will have:
- Transform ID that generated the replacement
- Offset
- Length
- Replacement text
Any tool reading these replacements should read them using the
MigratorReplacement struct.
Note: This is a preliminary patch to get the review process started. I am
adding unit tests for the final patch.
http://llvm-reviews.chandlerc.com/D1142
Files:
cpp11-migrate/Core/FileOverrides.cpp
cpp11-migrate/Core/FileOverrides.h
cpp11-migrate/Core/Replacement.h
cpp11-migrate/Core/ReplacementsYaml.h
cpp11-migrate/Core/Transform.cpp
cpp11-migrate/tool/Cpp11Migrate.cpp
Index: cpp11-migrate/Core/FileOverrides.cpp
===================================================================
--- cpp11-migrate/Core/FileOverrides.cpp
+++ cpp11-migrate/Core/FileOverrides.cpp
@@ -32,19 +32,21 @@
SourceOverrides::SourceOverrides(llvm::StringRef MainFileName)
: MainFileName(MainFileName) {}
-void SourceOverrides::applyReplacements(tooling::Replacements &Replaces) {
+void SourceOverrides::applyReplacements(tooling::Replacements &Replaces,
+ llvm::StringRef TransformName) {
llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(
new DiagnosticOptions());
DiagnosticsEngine Diagnostics(
llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
DiagOpts.getPtr());
FileManager Files((FileSystemOptions()));
SourceManager SM(Diagnostics, Files);
- applyReplacements(Replaces, SM);
+ applyReplacements(Replaces, SM, TransformName);
}
void SourceOverrides::applyReplacements(tooling::Replacements &Replaces,
- SourceManager &SM) {
+ SourceManager &SM,
+ llvm::StringRef TransformName) {
applyOverrides(SM);
Rewriter Rewrites(SM, LangOptions());
@@ -56,10 +58,6 @@
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(),
@@ -94,6 +92,22 @@
if (HeaderOv.FileName.empty())
HeaderOv.FileName = FileName;
}
+
+ // Record all replacements to headers.
+ for (Replacements::const_iterator I = Replaces.begin(), E = Replaces.end();
+ I != E; ++I) {
+ const Replacement &R = *I;
+ if (R.getFilePath() == MainFileName)
+ continue;
+
+ MigratorReplacement MR;
+ MR.TransformID = TransformName;
+ MR.Offset = R.getOffset();
+ MR.Length = R.getLength();
+ MR.ReplacementText = R.getReplacementText();
+ HeaderOverride &HeaderOv = Headers[R.getFilePath()];
+ HeaderOv.MigratorReplacements.push_back(MR);
+ }
}
void SourceOverrides::applyOverrides(SourceManager &SM) const {
Index: cpp11-migrate/Core/FileOverrides.h
===================================================================
--- cpp11-migrate/Core/FileOverrides.h
+++ cpp11-migrate/Core/FileOverrides.h
@@ -16,8 +16,10 @@
#ifndef CPP11_MIGRATE_FILE_OVERRIDES_H
#define CPP11_MIGRATE_FILE_OVERRIDES_H
+#include "Core/Replacement.h"
#include "clang/Tooling/Refactoring.h"
#include "llvm/ADT/StringMap.h"
+#include <vector>
// Forward Declarations
namespace llvm {
@@ -36,6 +38,9 @@
std::string FileName;
std::string FileOverride;
+
+ typedef std::vector<MigratorReplacement> MigratorReplacementVec;
+ MigratorReplacementVec MigratorReplacements;
};
/// \brief Container mapping header file names to override information.
@@ -65,8 +70,10 @@
/// \param Replaces The replacements to apply.
/// \param SM A user provided SourceManager to be used when applying rewrites.
void applyReplacements(clang::tooling::Replacements &Replaces,
- clang::SourceManager &SM);
- void applyReplacements(clang::tooling::Replacements &Replaces);
+ clang::SourceManager &SM,
+ llvm::StringRef TransformName);
+ void applyReplacements(clang::tooling::Replacements &Replaces,
+ llvm::StringRef TransformName);
/// \brief Convenience function for applying this source's overrides to
/// the given SourceManager.
@@ -83,10 +90,6 @@
/// @}
private:
- /// \brief Flatten the Rewriter buffers of \p Rewrite and store results as
- /// file content overrides.
- void applyRewrites(clang::Rewriter &Rewrite);
-
const std::string MainFileName;
std::string MainFileOverride;
HeaderOverrides Headers;
@@ -96,6 +99,7 @@
class FileOverrides {
public:
typedef llvm::StringMap<SourceOverrides *> SourceOverridesMap;
+ typedef SourceOverridesMap::iterator iterator;
typedef SourceOverridesMap::const_iterator const_iterator;
FileOverrides() {}
@@ -111,6 +115,8 @@
/// \brief Iterators.
/// @{
+ iterator begin() { return Overrides.begin(); }
+ iterator end() { return Overrides.end(); }
const_iterator begin() const { return Overrides.begin(); }
const_iterator end() const { return Overrides.end(); }
/// @}
Index: cpp11-migrate/Core/Replacement.h
===================================================================
--- /dev/null
+++ cpp11-migrate/Core/Replacement.h
@@ -0,0 +1,29 @@
+//===-- Core/Replacement.h --------------------------------------*- 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 a struct to store the migrator specific header
+/// replacements.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef CPP11_MIGRATE_REPLACEMENT_H
+#define CPP11_MIGRATE_REPLACEMENT_H
+
+#include "llvm/ADT/SmallString.h"
+
+/// \brief A replacement struct to store the transform ID and the replacement.
+struct MigratorReplacement {
+ llvm::SmallString<16> TransformID;
+ unsigned int Offset;
+ unsigned int Length;
+ llvm::SmallString<64> ReplacementText;
+};
+
+#endif // CPP11_MIGRATE_REPLACEMENT_H
Index: cpp11-migrate/Core/ReplacementsYaml.h
===================================================================
--- /dev/null
+++ cpp11-migrate/Core/ReplacementsYaml.h
@@ -0,0 +1,41 @@
+//===-- Core/ReplacementsYaml.h ---------------------------------*- 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 YAML traits for Replacements
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef CPP11_MIGRATE_REPLACEMENTS_YAML_H
+#define CPP11_MIGRATE_REPLACEMENTS_YAML_H
+
+#include "Core/Replacement.h"
+#include "llvm/Support/YAMLTraits.h"
+
+LLVM_YAML_IS_SEQUENCE_VECTOR(MigratorReplacement)
+
+namespace llvm {
+namespace yaml {
+/// \brief Specialized MappingTraits for Repleacements to be converted to/from
+/// a YAML File.
+template <>
+struct MappingTraits<MigratorReplacement> {
+ static void mapping(IO &Io, MigratorReplacement &R) {
+ llvm::StringRef TransformID = R.TransformID;
+ llvm::StringRef ReplacementText = R.ReplacementText;
+ Io.mapRequired("TransformID", TransformID);
+ Io.mapRequired("Offset", R.Offset);
+ Io.mapRequired("Length", R.Length);
+ Io.mapRequired("ReplacementText", ReplacementText);
+ }
+};
+} // end namespace yaml
+} // end namespace llvm
+
+#endif // CPP11_MIGRATE_REPLACEMENTS_YAML_H
Index: cpp11-migrate/Core/Transform.cpp
===================================================================
--- cpp11-migrate/Core/Transform.cpp
+++ cpp11-migrate/Core/Transform.cpp
@@ -117,7 +117,7 @@
void Transform::handleEndSource() {
if (!getReplacements().empty()) {
SourceOverrides &SO = Overrides->getOrCreate(CurrentSource);
- SO.applyReplacements(getReplacements());
+ SO.applyReplacements(getReplacements(), getName());
}
if (Options().EnableTiming)
Index: cpp11-migrate/tool/Cpp11Migrate.cpp
===================================================================
--- cpp11-migrate/tool/Cpp11Migrate.cpp
+++ cpp11-migrate/tool/Cpp11Migrate.cpp
@@ -20,6 +20,7 @@
#include "Core/SyntaxCheck.h"
#include "Core/Transform.h"
#include "Core/Transforms.h"
+#include "Core/ReplacementsYaml.h"
#include "LoopConvert/LoopConvert.h"
#include "UseNullptr/UseNullptr.h"
#include "UseAuto/UseAuto.h"
@@ -189,10 +190,10 @@
return 1;
// Write results to file.
- for (FileOverrides::const_iterator I = FileStates.begin(),
+ for (FileOverrides::iterator I = FileStates.begin(),
E = FileStates.end();
I != E; ++I) {
- const SourceOverrides &Overrides = *I->second;
+ SourceOverrides &Overrides = *I->second;
if (Overrides.isSourceOverriden()) {
std::string ErrorInfo;
std::string MainFileName = I->getKey();
@@ -206,7 +207,7 @@
// 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(),
+ for (HeaderOverrides::iterator HeaderI = Overrides.headers_begin(),
HeaderE = Overrides.headers_end();
HeaderI != HeaderE; ++HeaderI) {
assert(!HeaderI->second.FileOverride.empty() &&
@@ -216,6 +217,24 @@
llvm::raw_fd_ostream HeaderStream(HeaderFileName.c_str(), ErrorInfo,
llvm::raw_fd_ostream::F_Binary);
HeaderStream << HeaderI->second.FileOverride;
+
+ // Replacements for header files need to be written in a YAML file for
+ // every transform and will be merged together with an external tool.
+ llvm::SmallString<128> ReplacementsHeaderName;
+ llvm::SmallString<64> Error;
+ bool Result = generateReplacementsFileName(I->getKey(), HeaderFileName,
+ ReplacementsHeaderName, Error);
+ if (!Result)
+ llvm::errs() << "Failed to generate replacements filename:" << Error
+ << "\n";
+
+ ErrorInfo.clear();
+ llvm::raw_fd_ostream ReplacementsFile(ReplacementsHeaderName.c_str(),
+ ErrorInfo,
+ llvm::raw_fd_ostream::F_Binary);
+ llvm::yaml::Output YAML(ReplacementsFile);
+ YAML << HeaderI->getValue().MigratorReplacements;
+
}
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits