Skip to content

Commit

Permalink
[clang-apply-replacements] Deduplicate Implementation of `collectRepl…
Browse files Browse the repository at this point in the history
…acementsFromDirectory` (NFC) (#78630)

* Convert `collectReplacementsFromDirectory` into a function template.
* Employ explicit specialization to maintain implementation in the
source file.
* Utilize the function template in the source file to eliminate code
duplication.
* Update the documentation for the function.
  • Loading branch information
unterumarmung committed Jan 19, 2024
1 parent b4f24be commit 24e5229
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,27 @@ using FileToChangesMap =
/// Directories starting with '.' are ignored during traversal.
///
/// \param[in] Directory Directory to begin search for serialized
/// TranslationUnitReplacements.
/// TranslationUnitReplacements or TranslationUnitDiagnostics.
/// \param[out] TUs Collection of all found and deserialized
/// TranslationUnitReplacements or TranslationUnitDiagnostics.
/// \param[out] TUFiles Collection of all TranslationUnitReplacement files
/// found in \c Directory.
/// \param[out] TUFiles Collection of all TranslationUnitReplacement or
/// TranslationUnitDiagnostics files found in \c Directory.
/// \param[in] Diagnostics DiagnosticsEngine used for error output.
///
/// \returns An error_code indicating success or failure in navigating the
/// directory structure.
template <typename TranslationUnits>
std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TranslationUnits &TUs,
TUReplacementFiles &TUFiles,
clang::DiagnosticsEngine &Diagnostics) = delete;

template <>
std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TUReplacements &TUs,
TUReplacementFiles &TUFiles, clang::DiagnosticsEngine &Diagnostics);

template <>
std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TUDiagnostics &TUs,
TUReplacementFiles &TUFiles, clang::DiagnosticsEngine &Diagnostics);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,10 @@ static void eatDiagnostics(const SMDiagnostic &, void *) {}
namespace clang {
namespace replace {

std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TUReplacements &TUs,
namespace detail {
template <typename TranslationUnits>
static std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TranslationUnits &TUs,
TUReplacementFiles &TUFiles, clang::DiagnosticsEngine &Diagnostics) {
using namespace llvm::sys::fs;
using namespace llvm::sys::path;
Expand Down Expand Up @@ -68,7 +70,7 @@ std::error_code collectReplacementsFromDirectory(
}

yaml::Input YIn(Out.get()->getBuffer(), nullptr, &eatDiagnostics);
tooling::TranslationUnitReplacements TU;
typename TranslationUnits::value_type TU;
YIn >> TU;
if (YIn.error()) {
// File doesn't appear to be a header change description. Ignore it.
Expand All @@ -81,49 +83,22 @@ std::error_code collectReplacementsFromDirectory(

return ErrorCode;
}
} // namespace detail

template <>
std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TUDiagnostics &TUs,
const llvm::StringRef Directory, TUReplacements &TUs,
TUReplacementFiles &TUFiles, clang::DiagnosticsEngine &Diagnostics) {
using namespace llvm::sys::fs;
using namespace llvm::sys::path;

std::error_code ErrorCode;

for (recursive_directory_iterator I(Directory, ErrorCode), E;
I != E && !ErrorCode; I.increment(ErrorCode)) {
if (filename(I->path())[0] == '.') {
// Indicate not to descend into directories beginning with '.'
I.no_push();
continue;
}

if (extension(I->path()) != ".yaml")
continue;

TUFiles.push_back(I->path());

ErrorOr<std::unique_ptr<MemoryBuffer>> Out =
MemoryBuffer::getFile(I->path());
if (std::error_code BufferError = Out.getError()) {
errs() << "Error reading " << I->path() << ": " << BufferError.message()
<< "\n";
continue;
}

yaml::Input YIn(Out.get()->getBuffer(), nullptr, &eatDiagnostics);
tooling::TranslationUnitDiagnostics TU;
YIn >> TU;
if (YIn.error()) {
// File doesn't appear to be a header change description. Ignore it.
continue;
}

// Only keep files that properly parse.
TUs.push_back(TU);
}
return detail::collectReplacementsFromDirectory(Directory, TUs, TUFiles,
Diagnostics);
}

return ErrorCode;
template <>
std::error_code collectReplacementsFromDirectory(
const llvm::StringRef Directory, TUDiagnostics &TUs,
TUReplacementFiles &TUFiles, clang::DiagnosticsEngine &Diagnostics) {
return detail::collectReplacementsFromDirectory(Directory, TUs, TUFiles,
Diagnostics);
}

/// Extract replacements from collected TranslationUnitReplacements and
Expand Down

0 comments on commit 24e5229

Please sign in to comment.