// 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(std::unique_ptr<llvm::raw_ostream> os) { return os ? new JsonWriter(std::move(os)) : 0; } 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(std::unique_ptr<llvm::raw_ostream> os) : os_(std::move(os)) {} void Separator() { if (state_.empty()) return; if (state_.top()) { *os_ << ","; return; } state_.top() = true; } std::unique_ptr<llvm::raw_ostream> os_; std::stack<bool> state_; }; #endif // TOOLS_BLINK_GC_PLUGIN_JSON_WRITER_H_