Index: clang-tools-extra/trunk/clang-move/ClangMove.cpp =================================================================== --- clang-tools-extra/trunk/clang-move/ClangMove.cpp +++ clang-tools-extra/trunk/clang-move/ClangMove.cpp @@ -193,27 +193,6 @@ return SourceText.str(); } -clang::tooling::Replacement -getReplacementInChangedCode(const clang::tooling::Replacements &Replacements, - const clang::tooling::Replacement &Replacement) { - unsigned Start = Replacements.getShiftedCodePosition(Replacement.getOffset()); - unsigned End = Replacements.getShiftedCodePosition(Replacement.getOffset() + - Replacement.getLength()); - return clang::tooling::Replacement(Replacement.getFilePath(), Start, - End - Start, - Replacement.getReplacementText()); -} - -void addOrMergeReplacement(const clang::tooling::Replacement &Replacement, - clang::tooling::Replacements *Replacements) { - auto Err = Replacements->add(Replacement); - if (Err) { - llvm::consumeError(std::move(Err)); - auto Replace = getReplacementInChangedCode(*Replacements, Replacement); - *Replacements = Replacements->merge(clang::tooling::Replacements(Replace)); - } -} - bool isInHeaderFile(const clang::SourceManager &SM, const clang::Decl *D, llvm::StringRef OriginalRunningDirectory, llvm::StringRef OldHeader) { @@ -251,7 +230,7 @@ const std::vector &Decls, llvm::StringRef FileName, bool IsHeader = false) { - clang::tooling::Replacements InsertedReplacements; + std::string NewCode; std::string GuardName(FileName); if (IsHeader) { std::replace(GuardName.begin(), GuardName.end(), '/', '_'); @@ -259,24 +238,16 @@ std::replace(GuardName.begin(), GuardName.end(), '-', '_'); GuardName = StringRef(GuardName).upper(); - std::string HeaderGuard = "#ifndef " + GuardName + "\n"; - HeaderGuard += "#define " + GuardName + "\n"; - clang::tooling::Replacement HeaderGuardInclude(FileName, 0, 0, - HeaderGuard); - addOrMergeReplacement(HeaderGuardInclude, &InsertedReplacements); + NewCode += "#ifndef " + GuardName + "\n"; + NewCode += "#define " + GuardName + "\n"; } // Add #Includes. - std::string AllIncludesString; - // FIXME: Add header guard. for (const auto &Include : Includes) - AllIncludesString += Include; + NewCode += Include; - if (!AllIncludesString.empty()) { - clang::tooling::Replacement InsertInclude(FileName, 0, 0, - AllIncludesString + "\n"); - addOrMergeReplacement(InsertInclude, &InsertedReplacements); - } + if (!Includes.empty()) + NewCode += "\n"; // Add moved class definition and its related declarations. All declarations // in same namespace are grouped together. @@ -299,36 +270,23 @@ for (auto It = CurrentNamespaces.rbegin(); RemainingSize > 0; --RemainingSize, ++It) { assert(It < CurrentNamespaces.rend()); - auto code = "} // namespace " + *It + "\n"; - clang::tooling::Replacement InsertedReplacement(FileName, 0, 0, code); - addOrMergeReplacement(InsertedReplacement, &InsertedReplacements); + NewCode += "} // namespace " + *It + "\n"; } while (DeclIt != DeclNamespaces.end()) { - clang::tooling::Replacement InsertedReplacement( - FileName, 0, 0, "namespace " + *DeclIt + " {\n"); - addOrMergeReplacement(InsertedReplacement, &InsertedReplacements); + NewCode += "namespace " + *DeclIt + " {\n"; ++DeclIt; } - - clang::tooling::Replacement InsertedReplacement( - FileName, 0, 0, getDeclarationSourceText(MovedDecl.Decl, MovedDecl.SM)); - addOrMergeReplacement(InsertedReplacement, &InsertedReplacements); - + NewCode += getDeclarationSourceText(MovedDecl.Decl, MovedDecl.SM); CurrentNamespaces = std::move(NextNamespaces); } std::reverse(CurrentNamespaces.begin(), CurrentNamespaces.end()); - for (const auto &NS : CurrentNamespaces) { - clang::tooling::Replacement InsertedReplacement( - FileName, 0, 0, "} // namespace " + NS + "\n"); - addOrMergeReplacement(InsertedReplacement, &InsertedReplacements); - } + for (const auto &NS : CurrentNamespaces) + NewCode += "} // namespace " + NS + "\n"; - if (IsHeader) { - clang::tooling::Replacement HeaderGuardEnd(FileName, 0, 0, - "#endif // " + GuardName + "\n"); - addOrMergeReplacement(HeaderGuardEnd, &InsertedReplacements); - } - return InsertedReplacements; + if (IsHeader) + NewCode += "#endif // " + GuardName + "\n"; + return clang::tooling::Replacements( + clang::tooling::Replacement(FileName, 0, 0, NewCode)); } } // namespace @@ -490,7 +448,11 @@ Range.getBegin(), Range.getEnd()), ""); std::string FilePath = RemoveReplacement.getFilePath().str(); - addOrMergeReplacement(RemoveReplacement, &FileToReplacements[FilePath]); + auto Err = FileToReplacements[FilePath].add(RemoveReplacement); + if (Err) { + llvm::errs() << llvm::toString(std::move(Err)) << "\n"; + continue; + } llvm::StringRef Code = SM.getBufferData(SM.getFileID(MovedDecl.Decl->getLocation()));