aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-03-17 22:46:20 +0000
committerPhilip Herron <philip.herron@embecosm.com>2023-03-20 21:47:57 +0000
commit70b83a23f508d3694aa08cda793bab118a9be768 (patch)
treed3771d4cb743b1e64e6426b82f604e718d4c07ed /gcc
parent1eba43033b139581d7152f9bfc5a0ae6277f9fee (diff)
downloadgcc-70b83a23f508d3694aa08cda793bab118a9be768.zip
gcc-70b83a23f508d3694aa08cda793bab118a9be768.tar.gz
gcc-70b83a23f508d3694aa08cda793bab118a9be768.tar.bz2
gccrs: Return resolved_node_id when possible
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-path.cc38
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-path.h12
2 files changed, 28 insertions, 22 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-path.cc b/gcc/rust/resolve/rust-ast-resolve-path.cc
index 702c42c..c5b8dea 100644
--- a/gcc/rust/resolve/rust-ast-resolve-path.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-path.cc
@@ -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
diff --git a/gcc/rust/resolve/rust-ast-resolve-path.h b/gcc/rust/resolve/rust-ast-resolve-path.h
index 3599fff..c6d2e1a 100644
--- a/gcc/rust/resolve/rust-ast-resolve-path.h
+++ b/gcc/rust/resolve/rust-ast-resolve-path.h
@@ -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,