Skip to content

Commit

Permalink
hir: Lower lang-item paths
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* hir/rust-ast-lower-type.cc (ASTLowerTypePath::translate): Adapt to
	handle lang item paths.
	(ASTLowerTypePath::visit): Likewise.
	(ASTLowerTypePath::translate_type_path): New.
	(ASTLowerTypePath::translate_lang_item_type_path): New.
	* hir/rust-ast-lower-type.h: Adapt to handle lang item paths.
	* resolve/rust-ast-resolve-type.h: Likewise.
  • Loading branch information
CohenArthur committed Dec 5, 2024
1 parent d5e0175 commit 262c1c4
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 14 deletions.
45 changes: 35 additions & 10 deletions gcc/rust/hir/rust-ast-lower-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,31 @@
// <http://www.gnu.org/licenses/>.

#include "rust-ast-lower-type.h"
#include "optional.h"
#include "rust-attribute-values.h"
#include "rust-hir-map.h"
#include "rust-hir-path.h"
#include "rust-path.h"
#include "rust-pattern.h"

namespace Rust {
namespace HIR {

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

return ASTLowerTypePath::translate (static_cast<AST::TypePath &> (type));
}
switch (type.get_path_kind ())
{
case AST::Path::Kind::LangItem:
resolver.visit (static_cast<AST::LangItemPath &> (type));
break;
case AST::Path::Kind::Type:
resolver.visit (static_cast<AST::TypePath &> (type));
break;
default:
rust_unreachable ();
}

HIR::TypePath *
ASTLowerTypePath::translate (AST::TypePath &type)
{
ASTLowerTypePath resolver;
type.accept_vis (resolver);
rust_assert (resolver.translated != nullptr);
return resolver.translated;
}
Expand Down Expand Up @@ -135,6 +140,26 @@ ASTLowerTypePath::visit (AST::TypePath &path)
path.has_opening_scope_resolution_op ());
}

void
ASTLowerTypePath::visit (AST::LangItemPath &path)
{
auto crate_num = mappings.get_current_crate ();
auto hirid = mappings.get_next_hir_id (crate_num);

Analysis::NodeMapping mapping (crate_num, path.get_node_id (), hirid,
mappings.get_next_localdef_id (crate_num));

std::vector<std::unique_ptr<HIR::TypePathSegment>> translated_segments;
translated_segments.emplace_back (std::unique_ptr<HIR::TypePathSegment> (
new HIR::TypePathSegment (mapping,
LangItem::ToString (path.get_lang_item_kind ()),
false, path.get_locus ())));

translated
= new HIR::TypePath (std::move (mapping), std::move (translated_segments),
path.get_locus ());
}

HIR::QualifiedPathInType *
ASTLowerQualifiedPathInType::translate (AST::QualifiedPathInType &type)
{
Expand Down
6 changes: 5 additions & 1 deletion gcc/rust/hir/rust-ast-lower-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

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

namespace Rust {
namespace HIR {
Expand All @@ -32,18 +33,21 @@ class ASTLowerTypePath : public ASTLoweringBase

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

void visit (AST::TypePathSegmentFunction &segment) override;
void visit (AST::TypePathSegment &segment) override;
void visit (AST::TypePathSegmentGeneric &segment) override;
void visit (AST::TypePath &path) override;
void visit (AST::LangItemPath &path) override;

protected:
HIR::TypePathSegment *translated_segment;

private:
HIR::TypePath *translated;

static HIR::TypePath *translate_type_path (AST::TypePath &type);
static HIR::TypePath *translate_lang_item_type_path (AST::LangItemPath &type);
};

class ASTLowerQualifiedPathInType : public ASTLowerTypePath
Expand Down
6 changes: 3 additions & 3 deletions gcc/rust/resolve/rust-ast-resolve-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,13 @@ class ResolveType : public ResolverBase
{
auto &type = static_cast<AST::LangItemPath &> (type_path);

rust_debug ("[ARTHUR]: lang item kind: %s",
LangItem::ToString (type.get_lang_item_kind ()).c_str ());

auto lang_item = Analysis::Mappings::get ()
.lookup_lang_item_node (type.get_lang_item_kind ())
.value ();

auto resolver = Resolver::get ();
resolver->insert_resolved_type (type.get_node_id (), lang_item);

return lang_item;
}

Expand Down

0 comments on commit 262c1c4

Please sign in to comment.