diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-03-17 22:46:20 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-03-20 21:47:57 +0000 |
commit | 70b83a23f508d3694aa08cda793bab118a9be768 (patch) | |
tree | d3771d4cb743b1e64e6426b82f604e718d4c07ed /gcc | |
parent | 1eba43033b139581d7152f9bfc5a0ae6277f9fee (diff) | |
download | gcc-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.cc | 38 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-path.h | 12 |
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, |