environment push_scope(environment const & env, io_state const & ios, scope_kind k, name const & n) { if (k == scope_kind::Namespace && in_section(env)) throw exception("invalid namespace declaration, a namespace cannot be declared inside a section"); name new_n = get_namespace(env); if (k == scope_kind::Namespace) new_n = new_n + n; scope_mng_ext ext = get_extension(env); bool save_ns = false; if (!ext.m_namespace_set.contains(new_n)) { save_ns = true; ext.m_namespace_set.insert(new_n); } ext.m_namespaces = cons(new_n, ext.m_namespaces); ext.m_headers = cons(n, ext.m_headers); ext.m_scope_kinds = cons(k, ext.m_scope_kinds); environment r = update(env, ext); for (auto const & t : get_exts()) { r = std::get<0>(t)(r, ios, k); } if (save_ns) r = module::add(r, *g_new_namespace_key, [=](environment const &, serializer & s) { s << new_n; }); return r; }
environment end_scoped_cmd(parser & p) { if (in_section(p.env())) p.pop_local_scope(); return pop_scope(p.env()); }