summaryrefslogtreecommitdiffstats
path: root/clang/tools/clang-diff/ClangDiff.cpp
diff options
context:
space:
mode:
authorJohannes Altmanninger <aclopte@gmail.com>2017-08-18 21:26:13 +0000
committerJohannes Altmanninger <aclopte@gmail.com>2017-08-18 21:26:13 +0000
commit0ad4cc61ac9063a2943a42059283bf36f883f341 (patch)
tree5668d99e88b42969048d7da7e035b14ef036d736 /clang/tools/clang-diff/ClangDiff.cpp
parentf36cca88fb01d8f41f86e01ceb096693503a32e3 (diff)
downloadbcm5719-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.cpp65
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;
}
OpenPOWER on IntegriCloud