From: Arthur Cohen <[email protected]>

gcc/rust/ChangeLog:

        * resolve/rust-forever-stack.h: Add new resolve_path function.
        * resolve/rust-forever-stack.hxx: Implement it.
---
 gcc/rust/resolve/rust-forever-stack.h   | 18 ++++++++++++-
 gcc/rust/resolve/rust-forever-stack.hxx | 35 ++++++++++++++++++++++++-
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/resolve/rust-forever-stack.h 
b/gcc/rust/resolve/rust-forever-stack.h
index fb265582ad1..2a88df7b9e0 100644
--- a/gcc/rust/resolve/rust-forever-stack.h
+++ b/gcc/rust/resolve/rust-forever-stack.h
@@ -682,6 +682,11 @@ public:
     const std::vector<S> &segments, ResolutionMode mode,
     std::function<void (const S &, NodeId)> insert_segment_resolution,
     std::vector<Error> &collect_errors);
+  template <typename S>
+  tl::optional<Rib::Definition> resolve_path (
+    const std::vector<S> &segments, ResolutionMode mode,
+    std::function<void (const S &, NodeId)> insert_segment_resolution,
+    std::vector<Error> &collect_errors, NodeId starting_point_id);
 
   // FIXME: Documentation
   tl::optional<Rib &> to_rib (NodeId rib_id);
@@ -743,9 +748,19 @@ private:
     tl::optional<Node &> parent; // `None` only if the node is a root
   };
 
-  // private overload which allows specifying a starting point
+  /**
+   * Private overloads which allow specifying a starting point
+   */
+
   tl::optional<Rib::Definition> get (Node &start, const Identifier &name);
 
+  template <typename S>
+  tl::optional<Rib::Definition> resolve_path (
+    const std::vector<S> &segments, ResolutionMode mode,
+    std::function<void (const S &, NodeId)> insert_segment_resolution,
+    std::vector<Error> &collect_errors,
+    std::reference_wrapper<Node> starting_point);
+
   /* Should we keep going upon seeing a Rib? */
   enum class KeepGoing
   {
@@ -777,6 +792,7 @@ private:
    * resolution
    */
   Node lang_prelude;
+
   /*
    * The extern prelude, used for resolving external crates
    */
diff --git a/gcc/rust/resolve/rust-forever-stack.hxx 
b/gcc/rust/resolve/rust-forever-stack.hxx
index cd13af0158d..bd35d6c4e4a 100644
--- a/gcc/rust/resolve/rust-forever-stack.hxx
+++ b/gcc/rust/resolve/rust-forever-stack.hxx
@@ -647,6 +647,25 @@ ForeverStack<N>::resolve_final_segment (Node &final_node, 
std::string &seg_name,
   return final_node.rib.get (seg_name);
 }
 
+template <Namespace N>
+template <typename S>
+tl::optional<Rib::Definition>
+ForeverStack<N>::resolve_path (
+  const std::vector<S> &segments, ResolutionMode mode,
+  std::function<void (const S &, NodeId)> insert_segment_resolution,
+  std::vector<Error> &collect_errors, NodeId starting_point_id)
+{
+  auto starting_point = dfs_node (root, starting_point_id);
+
+  // We may have a prelude, but haven't visited it yet and thus it's not in our
+  // nodes
+  if (!starting_point)
+    return tl::nullopt;
+
+  return resolve_path (segments, mode, insert_segment_resolution,
+                      collect_errors, *starting_point);
+}
+
 template <Namespace N>
 template <typename S>
 tl::optional<Rib::Definition>
@@ -654,10 +673,24 @@ ForeverStack<N>::resolve_path (
   const std::vector<S> &segments, ResolutionMode mode,
   std::function<void (const S &, NodeId)> insert_segment_resolution,
   std::vector<Error> &collect_errors)
+{
+  std::reference_wrapper<Node> starting_point = cursor ();
+
+  return resolve_path (segments, mode, insert_segment_resolution,
+                      collect_errors, starting_point);
+}
+
+template <Namespace N>
+template <typename S>
+tl::optional<Rib::Definition>
+ForeverStack<N>::resolve_path (
+  const std::vector<S> &segments, ResolutionMode mode,
+  std::function<void (const S &, NodeId)> insert_segment_resolution,
+  std::vector<Error> &collect_errors,
+  std::reference_wrapper<Node> starting_point)
 {
   rust_assert (!segments.empty ());
 
-  std::reference_wrapper<Node> starting_point = cursor ();
   switch (mode)
     {
     case ResolutionMode::Normal:
-- 
2.50.1

Reply via email to