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