aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-base.h6
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.cc6
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-toplevel.h28
-rw-r--r--gcc/rust/resolve/rust-ast-resolve.cc13
-rw-r--r--gcc/rust/resolve/rust-name-resolver.h20
5 files changed, 58 insertions, 15 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h
index 9c1f0a1..17d05c3 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -199,10 +199,9 @@ public:
void visit (AST::BareFunctionType &);
protected:
- ResolverBase (NodeId parent, NodeId current_module = UNKNOWN_NODEID)
+ ResolverBase (NodeId parent)
: resolver (Resolver::get ()), mappings (Analysis::Mappings::get ()),
- resolved_node (UNKNOWN_NODEID), parent (parent),
- current_module (current_module), locus (Location ())
+ resolved_node (UNKNOWN_NODEID), parent (parent), locus (Location ())
{}
bool resolved () const { return resolved_node != UNKNOWN_NODEID; }
@@ -216,7 +215,6 @@ protected:
Analysis::Mappings *mappings;
NodeId resolved_node;
NodeId parent;
- NodeId current_module;
Location locus;
};
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc
index 603037e..198c9c0 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-item.cc
@@ -253,12 +253,14 @@ ResolveItem::visit (AST::Module &module)
// FIXME: Should we reinsert a child here? Any reason we ResolveTopLevel::go
// in ResolveTopLevel::visit (AST::Module) as well as here?
for (auto &item : module.get_items ())
- ResolveTopLevel::go (item.get (), CanonicalPath::create_empty (), cpath,
- module.get_node_id ());
+ ResolveTopLevel::go (item.get (), CanonicalPath::create_empty (), cpath);
+ resolver->push_new_module_scope (module.get_node_id ());
for (auto &item : module.get_items ())
ResolveItem::go (item.get (), path, cpath);
+ resolver->pop_module_scope ();
+
resolver->get_name_scope ().pop ();
resolver->get_type_scope ().pop ();
resolver->get_label_scope ().pop ();
diff --git a/gcc/rust/resolve/rust-ast-resolve-toplevel.h b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
index 8d4e12b..7a1458e 100644
--- a/gcc/rust/resolve/rust-ast-resolve-toplevel.h
+++ b/gcc/rust/resolve/rust-ast-resolve-toplevel.h
@@ -34,13 +34,15 @@ class ResolveTopLevel : public ResolverBase
public:
static void go (AST::Item *item, const CanonicalPath &prefix,
- const CanonicalPath &canonical_prefix, NodeId current_module)
+ const CanonicalPath &canonical_prefix)
{
if (item->is_marked_for_strip ())
return;
- ResolveTopLevel resolver (prefix, canonical_prefix, current_module);
+ ResolveTopLevel resolver (prefix, canonical_prefix);
item->accept_vis (resolver);
+
+ NodeId current_module = resolver.resolver->peek_current_module_scope ();
resolver.mappings->insert_child_item_to_parent_module_mapping (
item->get_node_id (), current_module);
};
@@ -64,11 +66,15 @@ public:
Definition{module.get_node_id (),
module.get_node_id ()});
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, mod);
mappings->insert_module_child (current_module, module.get_node_id ());
+ resolver->push_new_module_scope (module.get_node_id ());
for (auto &item : module.get_items ())
- ResolveTopLevel::go (item.get (), path, cpath, module.get_node_id ());
+ ResolveTopLevel::go (item.get (), path, cpath);
+
+ resolver->pop_module_scope ();
mappings->insert_canonical_path (mappings->get_current_crate (),
module.get_node_id (), cpath);
@@ -89,6 +95,7 @@ public:
rust_error_at (r, "redefined multiple times");
});
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, talias);
mappings->insert_canonical_path (mappings->get_current_crate (),
alias.get_node_id (), cpath);
@@ -109,6 +116,7 @@ public:
rust_error_at (r, "redefined multiple times");
});
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
struct_decl.get_node_id (), cpath);
@@ -130,8 +138,9 @@ public:
});
for (auto &variant : enum_decl.get_variants ())
- ResolveTopLevel::go (variant.get (), path, cpath, current_module);
+ ResolveTopLevel::go (variant.get (), path, cpath);
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
enum_decl.get_node_id (), cpath);
@@ -152,7 +161,6 @@ public:
rust_error_at (r, "redefined multiple times");
});
- mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
item.get_node_id (), cpath);
}
@@ -229,6 +237,7 @@ public:
rust_error_at (r, "redefined multiple times");
});
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
struct_decl.get_node_id (), cpath);
@@ -249,6 +258,7 @@ public:
rust_error_at (r, "redefined multiple times");
});
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
union_decl.get_node_id (), cpath);
@@ -273,6 +283,7 @@ public:
var.get_node_id ()});
resolver->mark_decl_mutability (var.get_node_id (), var.is_mutable ());
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
var.get_node_id (), cpath);
@@ -295,6 +306,7 @@ public:
Definition{constant.get_node_id (),
constant.get_node_id ()});
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
constant.get_node_id (), cpath);
@@ -325,6 +337,7 @@ public:
function.get_node_id ());
}
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
function.get_node_id (), cpath);
@@ -403,6 +416,7 @@ public:
for (auto &item : trait.get_trait_items ())
ResolveTopLevelTraitItems::go (item.get (), path, cpath);
+ NodeId current_module = resolver->peek_current_module_scope ();
mappings->insert_module_child_item (current_module, decl);
mappings->insert_canonical_path (mappings->get_current_crate (),
trait.get_node_id (), cpath);
@@ -418,8 +432,8 @@ public:
private:
ResolveTopLevel (const CanonicalPath &prefix,
- const CanonicalPath &canonical_prefix, NodeId current_module)
- : ResolverBase (UNKNOWN_NODEID, current_module), prefix (prefix),
+ const CanonicalPath &canonical_prefix)
+ : ResolverBase (UNKNOWN_NODEID), prefix (prefix),
canonical_prefix (canonical_prefix)
{}
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc
index 945ff28..8465162 100644
--- a/gcc/rust/resolve/rust-ast-resolve.cc
+++ b/gcc/rust/resolve/rust-ast-resolve.cc
@@ -81,20 +81,29 @@ NameResolution::go (AST::Crate &crate)
= CanonicalPath::new_seg (scope_node_id, crate_name);
crate_prefix.set_crate_num (cnum);
+ // setup the root scope
+ resolver->push_new_module_scope (scope_node_id);
+
// first gather the top-level namespace names then we drill down so this
// allows for resolving forward declarations since an impl block might have
// a Self type Foo which is defined after the impl block for example.
for (auto it = crate.items.begin (); it != crate.items.end (); it++)
ResolveTopLevel::go (it->get (), CanonicalPath::create_empty (),
- crate_prefix, scope_node_id);
+ crate_prefix);
// FIXME remove this
if (saw_errors ())
- return;
+ {
+ resolver->pop_module_scope ();
+ return;
+ }
// next we can drill down into the items and their scopes
for (auto it = crate.items.begin (); it != crate.items.end (); it++)
ResolveItem::go (it->get (), CanonicalPath::create_empty (), crate_prefix);
+
+ // done
+ resolver->pop_module_scope ();
}
// rust-ast-resolve-struct-expr-field.h
diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h
index ab7cb55..23a9d82 100644
--- a/gcc/rust/resolve/rust-name-resolver.h
+++ b/gcc/rust/resolve/rust-name-resolver.h
@@ -166,6 +166,23 @@ public:
void set_unit_type_node_id (NodeId id) { unit_ty_node_id = id; }
NodeId get_unit_type_node_id () { return unit_ty_node_id; }
+ void push_new_module_scope (NodeId module_id)
+ {
+ current_module_stack.push_back (module_id);
+ }
+
+ void pop_module_scope ()
+ {
+ rust_assert (!current_module_stack.empty ());
+ current_module_stack.pop_back ();
+ }
+
+ NodeId peek_current_module_scope () const
+ {
+ rust_assert (!current_module_stack.empty ());
+ return current_module_stack.back ();
+ }
+
private:
Resolver ();
@@ -211,6 +228,9 @@ private:
std::map<NodeId, bool> decl_mutability;
// map of resolved names and set of assignments to the decl
std::map<NodeId, std::set<NodeId>> assignment_to_decl;
+
+ // keep track of the current module scope ids
+ std::vector<NodeId> current_module_stack;
};
} // namespace Resolver