Skip to content

Commit

Permalink
hir: Start adapting visitors to accept multiple kinds of Paths
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* ast/rust-item.h: Add new method to specifically get a type-path.
	* ast/rust-path.cc (LangItemPath::as_string): Implement properly.
	* hir/rust-ast-lower-type.cc (ASTLowerTypePath::translate): Adapt
	visitor to use the new LangItemPath.
	* hir/rust-ast-lower-type.h: Likewise.
	* resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Likewise.
	* resolve/rust-ast-resolve-type.h: Likewise.
  • Loading branch information
CohenArthur committed Dec 4, 2024
1 parent 4a51b95 commit 6e0de03
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 3 deletions.
7 changes: 7 additions & 0 deletions gcc/rust/ast/rust-item.h
Original file line number Diff line number Diff line change
Expand Up @@ -3264,6 +3264,13 @@ class TraitImpl : public Impl
return *trait_path;
}

Type &get_trait_path_type ()
{
rust_assert (trait_path->get_path_kind () == Path::Kind::Type);

return (AST::Type &) static_cast<AST::TypePath &> (*trait_path);
}

protected:
/* Use covariance to implement clone function as returning this object
* rather than base */
Expand Down
3 changes: 1 addition & 2 deletions gcc/rust/ast/rust-path.cc
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,7 @@ RegularPath::as_string () const
std::string
LangItemPath::as_string () const
{
// FIXME: Handle #[lang] paths
rust_unreachable ();
return LangItem::ToString (kind);
}

SimplePath
Expand Down
9 changes: 9 additions & 0 deletions gcc/rust/hir/rust-ast-lower-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,19 @@
#include "rust-ast-lower-type.h"
#include "optional.h"
#include "rust-attribute-values.h"
#include "rust-path.h"

namespace Rust {
namespace HIR {

HIR::TypePath *
ASTLowerTypePath::translate (AST::Path &type)
{
rust_assert (type.get_path_kind () == AST::Path::Kind::Type);

return ASTLowerTypePath::translate (static_cast<AST::TypePath &> (type));
}

HIR::TypePath *
ASTLowerTypePath::translate (AST::TypePath &type)
{
Expand Down
1 change: 1 addition & 0 deletions gcc/rust/hir/rust-ast-lower-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class ASTLowerTypePath : public ASTLoweringBase
using Rust::HIR::ASTLoweringBase::visit;

public:
static HIR::TypePath *translate (AST::Path &type);
static HIR::TypePath *translate (AST::TypePath &type);

void visit (AST::TypePathSegmentFunction &segment) override;
Expand Down
2 changes: 1 addition & 1 deletion gcc/rust/resolve/rust-ast-resolve-item.cc
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ ResolveItem::visit (AST::TraitImpl &impl_block)

// setup paths
CanonicalPath canonical_trait_type = CanonicalPath::create_empty ();
bool ok = ResolveTypeToCanonicalPath::go (impl_block.get_trait_path (),
bool ok = ResolveTypeToCanonicalPath::go (impl_block.get_trait_path_type (),
canonical_trait_type);
if (!ok)
{
Expand Down
28 changes: 28 additions & 0 deletions gcc/rust/resolve/rust-ast-resolve-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@

#include "rust-ast-resolve-base.h"
#include "rust-ast-resolve-expr.h"
#include "rust-hir-map.h"
#include "rust-path.h"

namespace Rust {
namespace Resolver {
Expand Down Expand Up @@ -56,6 +58,32 @@ class ResolveType : public ResolverBase
using Rust::Resolver::ResolverBase::visit;

public:
static NodeId go (AST::TypePath &type_path)
{
return ResolveType::go ((AST::Type &) type_path);
}

static NodeId go (AST::Path &type_path)
{
if (type_path.get_path_kind () == AST::Path::Kind::LangItem)
{
auto &type = static_cast<AST::LangItemPath &> (type_path);

Analysis::Mappings::get_lang_item (type);

type.get_node_id ();
}

rust_assert (type_path.get_path_kind () == AST::Path::Kind::Type);

// We have to do this dance to first downcast to a typepath, and then upcast
// to a Type. The altnernative is to split `go` into `go` and `go_inner` or
// something, but eventually this will need to change as we'll need
// `ResolveType::` to resolve other kinds of `Path`s as well.
return ResolveType::go (
(AST::Type &) static_cast<AST::TypePath &> (type_path));
}

static NodeId go (AST::Type &type)
{
ResolveType resolver;
Expand Down

0 comments on commit 6e0de03

Please sign in to comment.