diff options
author | Johannes Altmanninger <aclopte@gmail.com> | 2017-08-18 21:26:13 +0000 |
---|---|---|
committer | Johannes Altmanninger <aclopte@gmail.com> | 2017-08-18 21:26:13 +0000 |
commit | 0ad4cc61ac9063a2943a42059283bf36f883f341 (patch) | |
tree | 5668d99e88b42969048d7da7e035b14ef036d736 /clang/tools/clang-diff/ClangDiff.cpp | |
parent | f36cca88fb01d8f41f86e01ceb096693503a32e3 (diff) | |
download | bcm5719-llvm-0ad4cc61ac9063a2943a42059283bf36f883f341.tar.gz bcm5719-llvm-0ad4cc61ac9063a2943a42059283bf36f883f341.zip |
[clang-diff] Move the JSON export function to clang-diff
Reviewers: arphaman
Subscribers: klimek
Differential Revision: https://reviews.llvm.org/D36178
llvm-svn: 311199
Diffstat (limited to 'clang/tools/clang-diff/ClangDiff.cpp')
-rw-r--r-- | clang/tools/clang-diff/ClangDiff.cpp | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/clang/tools/clang-diff/ClangDiff.cpp b/clang/tools/clang-diff/ClangDiff.cpp index ea721836885..aec2b0f9b3a 100644 --- a/clang/tools/clang-diff/ClangDiff.cpp +++ b/clang/tools/clang-diff/ClangDiff.cpp @@ -94,6 +94,65 @@ getAST(const std::unique_ptr<CompilationDatabase> &CommonCompilations, return std::move(ASTs[0]); } +static char hexdigit(int N) { return N &= 0xf, N + (N < 10 ? '0' : 'a' - 10); } + +static void printJsonString(raw_ostream &OS, const StringRef Str) { + for (char C : Str) { + switch (C) { + case '"': + OS << R"(\")"; + break; + case '\\': + OS << R"(\\)"; + break; + case '\n': + OS << R"(\n)"; + break; + case '\t': + OS << R"(\t)"; + break; + default: + if ('\x00' <= C && C <= '\x1f') { + OS << R"(\u00)" << hexdigit(C >> 4) << hexdigit(C); + } else { + OS << C; + } + } + } +} + +static void printNodeAttributes(raw_ostream &OS, diff::SyntaxTree &Tree, + diff::NodeId Id) { + const diff::Node &N = Tree.getNode(Id); + OS << R"("id":)" << int(Id); + OS << R"(,"type":")" << N.getTypeLabel() << '"'; + auto Offsets = Tree.getSourceRangeOffsets(N); + OS << R"(,"begin":)" << Offsets.first; + OS << R"(,"end":)" << Offsets.second; + std::string Value = Tree.getNodeValue(N.ASTNode); + if (!Value.empty()) { + OS << R"(,"value":")"; + printJsonString(OS, Value); + OS << '"'; + } +} + +static void printNodeAsJson(raw_ostream &OS, diff::SyntaxTree &Tree, + diff::NodeId Id) { + const diff::Node &N = Tree.getNode(Id); + OS << "{"; + printNodeAttributes(OS, Tree, Id); + OS << R"(,"children":[)"; + if (N.Children.size() > 0) { + printNodeAsJson(OS, Tree, N.Children[0]); + for (size_t I = 1, E = N.Children.size(); I < E; ++I) { + OS << ","; + printNodeAsJson(OS, Tree, N.Children[I]); + } + } + OS << "]}"; +} + int main(int argc, const char **argv) { std::string ErrorMessage; std::unique_ptr<CompilationDatabase> CommonCompilations = @@ -117,7 +176,11 @@ int main(int argc, const char **argv) { if (!AST) return 1; diff::SyntaxTree Tree(AST->getASTContext()); - Tree.printAsJson(llvm::outs()); + llvm::outs() << R"({"filename":")"; + printJsonString(llvm::outs(), SourcePath); + llvm::outs() << R"(","root":)"; + printNodeAsJson(llvm::outs(), Tree, Tree.getRootId()); + llvm::outs() << "}\n"; return 0; } |