aboutsummaryrefslogtreecommitdiff
path: root/build/dump.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build/dump.cxx')
-rw-r--r--build/dump.cxx72
1 files changed, 72 insertions, 0 deletions
diff --git a/build/dump.cxx b/build/dump.cxx
new file mode 100644
index 0000000..4294e92
--- /dev/null
+++ b/build/dump.cxx
@@ -0,0 +1,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);
+ }
+}