// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ #define TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_ #include "llvm/Support/raw_ostream.h" // Helper to write information for the points-to graph. class JsonWriter { public: static JsonWriter* from(llvm::raw_fd_ostream* os) { return os ? new JsonWriter(os) : 0; } ~JsonWriter() { os_.close(); } void OpenList() { Separator(); os_ << "["; state_.push(false); } void OpenList(const std::string key) { Write(key); os_ << ":"; OpenList(); } void CloseList() { os_ << "]"; state_.pop(); } void OpenObject() { Separator(); os_ << "{"; state_.push(false); } void CloseObject() { os_ << "}\n"; state_.pop(); } void Write(const size_t val) { Separator(); os_ << val; } void Write(const std::string val) { Separator(); os_ << "\"" << val << "\""; } void Write(const std::string key, const size_t val) { Separator(); os_ << "\"" << key << "\":" << val; } void Write(const std::string key, const std::string val) { Separator(); os_ << "\"" << key << "\":\"" << val << "\""; } private: JsonWriter(llvm::raw_fd_ostream* os) : os_(*os) {} void Separator() { if (state_.empty()) return; if (state_.top()) { os_ << ","; return; } state_.top() = true; } llvm::raw_fd_ostream& os_; std::stack<bool> state_; }; #endif // TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_