1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ 6 #define TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ 7 8 #include "llvm/Support/raw_ostream.h" 9 10 // Helper to write information for the points-to graph. 11 class JsonWriter { 12 public: 13 static JsonWriter* from(llvm::raw_fd_ostream* os) { 14 return os ? new JsonWriter(os) : 0; 15 } 16 ~JsonWriter() { 17 os_.close(); 18 } 19 void OpenList() { 20 Separator(); 21 os_ << "["; 22 state_.push(false); 23 } 24 void OpenList(const std::string key) { 25 Write(key); 26 os_ << ":"; 27 OpenList(); 28 } 29 void CloseList() { 30 os_ << "]"; 31 state_.pop(); 32 } 33 void OpenObject() { 34 Separator(); 35 os_ << "{"; 36 state_.push(false); 37 } 38 void CloseObject() { 39 os_ << "}\n"; 40 state_.pop(); 41 } 42 void Write(const size_t val) { 43 Separator(); 44 os_ << val; 45 } 46 void Write(const std::string val) { 47 Separator(); 48 os_ << "\"" << val << "\""; 49 } 50 void Write(const std::string key, const size_t val) { 51 Separator(); 52 os_ << "\"" << key << "\":" << val; 53 } 54 void Write(const std::string key, const std::string val) { 55 Separator(); 56 os_ << "\"" << key << "\":\"" << val << "\""; 57 } 58 private: 59 JsonWriter(llvm::raw_fd_ostream* os) : os_(*os) {} 60 void Separator() { 61 if (state_.empty()) 62 return; 63 if (state_.top()) { 64 os_ << ","; 65 return; 66 } 67 state_.top() = true; 68 } 69 llvm::raw_fd_ostream& os_; 70 std::stack<bool> state_; 71 }; 72 73 #endif // TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ 74