aboutsummaryrefslogtreecommitdiff
path: root/build/dump.cxx
blob: 4294e92cb92bc5163797a218981696e36c844df3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// file      : build/dump.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC
// license   : MIT; see accompanying LICENSE file

#include <build/dump>

#include <string>
#include <cassert>
#include <iostream>

#include <build/scope>
#include <build/variable>
#include <build/diagnostics>

using namespace std;

namespace build
{
  static void
  dump_scope (scope& p, scope_map::iterator& i, string& ind)
  {
    string d (diag_relative_work (p.path ()));

    if (d.back () != path::traits::directory_separator)
      d += '/';

    cerr << ind << d << ":" << endl
         << ind << '{' << endl;

    ind += "  ";

    for (const auto& e: p.variables)
    {
      const variable& var (e.first);
      const value_ptr& val (e.second);

      cerr << ind << var.name << " = ";

      if (val == nullptr)
        cerr << "[undefined]";
      else
      {
        //@@ TODO: assuming it is a list.
        //
        cerr << dynamic_cast<list_value&> (*val).data;
      }

      cerr << endl;
    }

    // Print nested scopes of which we are a parent.
    //
    for (auto e (scopes.end ()); i != e && i->second.parent () == &p; )
    {
      scope& s (i->second);
      dump_scope (s, ++i, ind);
    }

    ind.resize (ind.size () - 2);
    cerr << ind << '}' << endl;
  }

  void
  dump_scopes ()
  {
    string ind;
    auto i (scopes.begin ());
    scope& r (i->second); // Root scope.
    assert (&r == root_scope);
    dump_scope (r, ++i, ind);
  }
}