gccrs: Small improvements to DefaultASTVisitor and nr2.0

gcc/rust/ChangeLog:

	* ast/rust-ast-visitor.cc
	(DefaultASTVisitor::visit): Only visit the path of an instance
	of Visibility if the instance has a path.
	* ast/rust-ast.h
	(SimplePath::SimplePath): Make sure constructors are explicit.
	* resolve/rust-early-name-resolver-2.0.cc
	(Early::visit_attributes): Pass entire paths to
	NameResolutionContext::resolve_path.
	(Early::visit): Likewise and avoid copying a path.
	* resolve/rust-forever-stack.hxx
	(ForeverStack::resolve_path): Assert that at least one path
	segment has been passed in.

Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
This commit is contained in:
Owen Avery
2025-05-08 17:32:05 -04:00
committed by Arthur Cohen
parent 94389da3bd
commit 99e7f6fea6
4 changed files with 13 additions and 12 deletions

View File

@@ -762,7 +762,8 @@ DefaultASTVisitor::visit (AST::TypeBoundWhereClauseItem &item)
void
DefaultASTVisitor::visit (AST::Visibility &vis)
{
visit (vis.get_path ());
if (vis.has_path ())
visit (vis.get_path ());
}
void

View File

@@ -402,15 +402,15 @@ class SimplePath
public:
// Constructor
SimplePath (std::vector<SimplePathSegment> path_segments,
bool has_opening_scope_resolution = false,
location_t locus = UNDEF_LOCATION)
explicit SimplePath (std::vector<SimplePathSegment> path_segments,
bool has_opening_scope_resolution = false,
location_t locus = UNDEF_LOCATION)
: opening_scope_resolution (has_opening_scope_resolution),
segments (std::move (path_segments)), locus (locus),
node_id (Analysis::Mappings::get ().get_next_node_id ())
{}
SimplePath (Identifier ident)
explicit SimplePath (Identifier ident)
: opening_scope_resolution (false),
segments ({SimplePathSegment (ident.as_string (), ident.get_locus ())}),
locus (ident.get_locus ()),

View File

@@ -249,7 +249,7 @@ Early::visit (AST::Module &module)
void
Early::visit (AST::MacroInvocation &invoc)
{
auto path = invoc.get_invoc_data ().get_path ();
auto &path = invoc.get_invoc_data ().get_path ();
if (invoc.get_kind () == AST::MacroInvocation::InvocKind::Builtin)
for (auto &pending_invoc : invoc.get_pending_eager_invocations ())
@@ -272,7 +272,7 @@ Early::visit (AST::MacroInvocation &invoc)
// we won't have changed `definition` from `nullopt` if there are more
// than one segments in our path
if (!definition.has_value ())
definition = ctx.resolve_path (path.get_segments (), Namespace::Macros);
definition = ctx.resolve_path (path, Namespace::Macros);
// if the definition still does not have a value, then it's an error
if (!definition.has_value ())
@@ -314,8 +314,8 @@ Early::visit_attributes (std::vector<AST::Attribute> &attrs)
auto traits = attr.get_traits_to_derive ();
for (auto &trait : traits)
{
auto definition = ctx.resolve_path (trait.get ().get_segments (),
Namespace::Macros);
auto definition
= ctx.resolve_path (trait.get (), Namespace::Macros);
if (!definition.has_value ())
{
// FIXME: Change to proper error message
@@ -337,8 +337,8 @@ Early::visit_attributes (std::vector<AST::Attribute> &attrs)
->lookup_builtin (name)
.is_error ()) // Do not resolve builtins
{
auto definition = ctx.resolve_path (attr.get_path ().get_segments (),
Namespace::Macros);
auto definition
= ctx.resolve_path (attr.get_path (), Namespace::Macros);
if (!definition.has_value ())
{
// FIXME: Change to proper error message

View File

@@ -629,7 +629,7 @@ ForeverStack<N>::resolve_path (
std::function<void (const S &, NodeId)> insert_segment_resolution,
std::vector<Error> &collect_errors)
{
// TODO: What to do if segments.empty() ?
rust_assert (!segments.empty ());
// handle paths with opening scopes
std::function<void (void)> cleanup_current = [] () {};