]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Return resolved_node_id when possible
authorPhilip Herron <herron.philip@googlemail.com>
Fri, 17 Mar 2023 22:46:20 +0000 (22:46 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:21:13 +0000 (18:21 +0100)
To enable use statement to export a name to a path such as the prelude
example: use option::Option::{self, None, Some} we need to get the resolved
node id of the self, None and Some in order to export the name of None and
Some to their respective NodeId.

gcc/rust/ChangeLog:

* resolve/rust-ast-resolve-path.cc (ResolvePath::ResolvePath): return NodeId
(ResolvePath::go): update signiture
(ResolvePath::resolve_path): return resolved_node_id
* resolve/rust-ast-resolve-path.h: update prototypes

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/resolve/rust-ast-resolve-path.cc
gcc/rust/resolve/rust-ast-resolve-path.h

index afc6ca5d379abb26e57ce0262c5ab5a221a49f8c..bd0b04332632bd461e1dcc4c6afb01ab74a43f9b 100644 (file)
@@ -25,28 +25,28 @@ namespace Resolver {
 
 ResolvePath::ResolvePath () : ResolverBase () {}
 
-void
+NodeId
 ResolvePath::go (AST::PathInExpression *expr)
 {
   ResolvePath resolver;
-  resolver.resolve_path (expr);
+  return resolver.resolve_path (expr);
 }
 
-void
+NodeId
 ResolvePath::go (AST::QualifiedPathInExpression *expr)
 {
   ResolvePath resolver;
-  resolver.resolve_path (expr);
+  return resolver.resolve_path (expr);
 }
 
-void
+NodeId
 ResolvePath::go (AST::SimplePath *expr)
 {
   ResolvePath resolver;
-  resolver.resolve_path (expr);
+  return resolver.resolve_path (expr);
 }
 
-void
+NodeId
 ResolvePath::resolve_path (AST::PathInExpression *expr)
 {
   NodeId resolved_node_id = UNKNOWN_NODEID;
@@ -68,7 +68,7 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
                         "failed to resolve: %<%s%> in paths can only be used "
                         "in start position",
                         segment.as_string ().c_str ());
-         return;
+         return UNKNOWN_NODEID;
        }
 
       NodeId crate_scope_id = resolver->peek_crate_module_scope ();
@@ -87,7 +87,7 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
            {
              rust_error_at (segment.get_locus (),
                             "cannot use %<super%> at the crate scope");
-             return;
+             return UNKNOWN_NODEID;
            }
 
          module_scope_id = resolver->peek_parent_module_scope ();
@@ -191,7 +191,7 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
                  rust_error_at (segment.get_locus (),
                                 "Cannot find path %<%s%> in this scope",
                                 segment.as_string ().c_str ());
-                 return;
+                 return UNKNOWN_NODEID;
                }
            }
        }
@@ -211,7 +211,7 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
          rust_error_at (segment.get_locus (),
                         "Cannot find path %<%s%> in this scope",
                         segment.as_string ().c_str ());
-         return;
+         return UNKNOWN_NODEID;
        }
     }
 
@@ -236,9 +236,10 @@ ResolvePath::resolve_path (AST::PathInExpression *expr)
          gcc_unreachable ();
        }
     }
+  return resolved_node_id;
 }
 
-void
+NodeId
 ResolvePath::resolve_path (AST::QualifiedPathInExpression *expr)
 {
   AST::QualifiedPathType &root_segment = expr->get_qualified_path_type ();
@@ -254,9 +255,13 @@ ResolvePath::resolve_path (AST::QualifiedPathInExpression *expr)
       if (segment.has_generic_args ())
        ResolveGenericArgs::go (segment.get_generic_args ());
     }
+
+  // cannot fully resolve a qualified path as it is dependant on associated
+  // items
+  return UNKNOWN_NODEID;
 }
 
-void
+NodeId
 ResolvePath::resolve_path (AST::SimplePath *expr)
 {
   NodeId crate_scope_id = resolver->peek_crate_module_scope ();
@@ -283,7 +288,7 @@ ResolvePath::resolve_path (AST::SimplePath *expr)
            {
              rust_error_at (segment.get_locus (),
                             "cannot use %<super%> at the crate scope");
-             return;
+             return UNKNOWN_NODEID;
            }
 
          module_scope_id = resolver->peek_parent_module_scope ();
@@ -317,7 +322,7 @@ ResolvePath::resolve_path (AST::SimplePath *expr)
              rust_error_at (segment.get_locus (),
                             "Cannot find path %<%s%> in this scope",
                             segment.as_string ().c_str ());
-             return;
+             return UNKNOWN_NODEID;
            }
        }
 
@@ -348,7 +353,7 @@ ResolvePath::resolve_path (AST::SimplePath *expr)
          rust_error_at (segment.get_locus (),
                         "cannot find simple path segment %<%s%> in this scope",
                         segment.as_string ().c_str ());
-         return;
+         return UNKNOWN_NODEID;
        }
 
       if (mappings->node_is_module (resolved_node_id))
@@ -378,6 +383,7 @@ ResolvePath::resolve_path (AST::SimplePath *expr)
          gcc_unreachable ();
        }
     }
+  return resolved_node_id;
 }
 
 } // namespace Resolver
index 4d6a6e4d9c861c0427e0ec878e09b6c492dafb74..841ff386227ab9a2f308a2da2367960dd1e96ce6 100644 (file)
@@ -29,16 +29,16 @@ class ResolvePath : public ResolverBase
   using Rust::Resolver::ResolverBase::visit;
 
 public:
-  static void go (AST::PathInExpression *expr);
-  static void go (AST::QualifiedPathInExpression *expr);
-  static void go (AST::SimplePath *expr);
+  static NodeId go (AST::PathInExpression *expr);
+  static NodeId go (AST::QualifiedPathInExpression *expr);
+  static NodeId go (AST::SimplePath *expr);
 
 private:
   ResolvePath ();
 
-  void resolve_path (AST::PathInExpression *expr);
-  void resolve_path (AST::QualifiedPathInExpression *expr);
-  void resolve_path (AST::SimplePath *expr);
+  NodeId resolve_path (AST::PathInExpression *expr);
+  NodeId resolve_path (AST::QualifiedPathInExpression *expr);
+  NodeId resolve_path (AST::SimplePath *expr);
 
   void
   resolve_simple_path_segments (CanonicalPath prefix, size_t offs,