Last active
June 22, 2020 08:43
-
-
Save itzurabhi/1c6e9dfdfefa78fc2f86cd768a9de2fa to your computer and use it in GitHub Desktop.
Clang AST Rewrite
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "clang/Basic/Diagnostic.h" | |
#include "clang/Basic/DiagnosticOptions.h" | |
#include "clang/Basic/FileManager.h" | |
#include "clang/Basic/IdentifierTable.h" | |
#include "clang/Basic/LangOptions.h" | |
#include "clang/Basic/SourceManager.h" | |
#include "clang/Basic/TokenKinds.h" | |
#include "clang/Frontend/CompilerInstance.h" | |
#include "clang/Frontend/TextDiagnosticPrinter.h" | |
#include "clang/Rewrite/Core/Rewriter.h" | |
#include "clang/Tooling/CommonOptionsParser.h" | |
#include "clang/Tooling/Refactoring.h" | |
#include "clang/Tooling/Refactoring/Rename/RenamingAction.h" | |
#include "clang/Tooling/Refactoring/Rename/USRFindingAction.h" | |
#include "clang/Tooling/ReplacementsYaml.h" | |
#include "clang/Tooling/Tooling.h" | |
#include "llvm/ADT/IntrusiveRefCntPtr.h" | |
#include "llvm/ADT/StringExtras.h" | |
#include "llvm/ADT/StringRef.h" | |
#include "llvm/ADT/Twine.h" | |
#include "llvm/Support/CommandLine.h" | |
#include "llvm/Support/FileSystem.h" | |
#include "llvm/Support/InitLLVM.h" | |
#include "llvm/Support/Process.h" | |
#include "llvm/Support/YAMLTraits.h" | |
#include "llvm/Support/raw_ostream.h" | |
#include <string> | |
#include <system_error> | |
#include <memory> | |
using namespace llvm; | |
using namespace clang; | |
static cl::OptionCategory | |
ClangASTRenameOptions("clang-ast-rewrite common options"); | |
static cl::opt<std::string> Input("input", cl::desc("Input .ast file"), | |
cl::Required, cl::cat(ClangASTRenameOptions)); | |
static cl::opt<std::string> Output("output", cl::desc("Output .ast file"), | |
cl::Required, | |
cl::cat(ClangASTRenameOptions)); | |
static cl::opt<std::string> | |
FindPath("find", cl::desc("The path to be replaced with `replace` value"), | |
cl::Required, cl::cat(ClangASTRenameOptions)); | |
static cl::opt<std::string> | |
ReplacePath("replace", cl::desc("The path which will replace `find` value"), | |
cl::Required, cl::cat(ClangASTRenameOptions)); | |
static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden); | |
int main(int argc, const char **argv) { | |
llvm::InitLLVM X(argc, argv); | |
cl::HideUnrelatedOptions(ClangASTRenameOptions); | |
cl::ParseCommandLineOptions( | |
argc, argv, "A tool to modify the absolute path(s) inside a .ast file"); | |
if (Help) { | |
cl::PrintHelpMessage(); | |
return 0; | |
} | |
// remove leading and trailing spaces | |
StringRef refInput(Input); | |
refInput = refInput.ltrim().rtrim(); | |
StringRef refOutput(Output); | |
refOutput = refOutput.ltrim().rtrim(); | |
StringRef refFindPath(FindPath); | |
refFindPath = refFindPath.ltrim().rtrim(); | |
StringRef refReplacePath(ReplacePath); | |
refReplacePath = refReplacePath.ltrim().rtrim(); | |
// check the sanity of arguments | |
if (refInput.empty()) { | |
errs() << "clang-ast-rename: valid --input must be specified.\n\n"; | |
return 1; | |
} | |
if (refOutput.empty()) { | |
errs() << "clang-ast-rename: valid --output must be specified.\n\n"; | |
return 1; | |
} | |
if (refFindPath.empty()) { | |
errs() << "clang-ast-rename: valid --find must be specified.\n\n"; | |
return 1; | |
} | |
if (refReplacePath.empty()) { | |
errs() << "clang-ast-rename: valid --replace must be specified.\n\n"; | |
return 1; | |
} | |
CompilerInstance ci; | |
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); | |
TextDiagnosticPrinter *DiagClient = | |
new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); | |
ci.createDiagnostics(DiagClient,false); | |
IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); | |
IntrusiveRefCntPtr<DiagnosticsEngine> Diags( | |
new DiagnosticsEngine(DiagID, &*DiagOpts, DiagClient)); | |
auto to = std::make_shared<clang::TargetOptions>(); | |
to->Triple = llvm::sys::getDefaultTargetTriple(); | |
TargetInfo *pti = TargetInfo::CreateTargetInfo(ci.getDiagnostics(), to); | |
ci.setTarget(pti); | |
auto FileMan = ci.createFileManager(); | |
ci.createSourceManager(ci.getFileManager()); | |
ci.createPreprocessor(TranslationUnitKind::TU_Complete); | |
auto AU = ASTUnit::LoadFromASTFile( | |
std::string(refInput.str()), | |
ci.getPCHContainerOperations()->getRawReader(), ASTUnit::LoadEverything, | |
Diags, ci.getFileSystemOpts()); | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
set(LLVM_LINK_COMPONENTS | |
Option | |
Support | |
) | |
add_clang_tool(clang-ast-rewrite | |
ClangASTRename.cpp | |
) | |
clang_target_link_libraries(clang-ast-rewrite | |
PRIVATE | |
clangBasic | |
clangFrontend | |
clangRewrite | |
clangSerialization | |
clangTooling | |
clangToolingCore | |
clangToolingRefactoring | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment