From 262c1c48ef0f8fdf508441c8703a0dee8b02dfc9 Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Fri, 29 Nov 2024 11:06:25 +0100 Subject: [PATCH] hir: Lower lang-item paths 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. --- gcc/rust/hir/rust-ast-lower-type.cc | 45 ++++++++++++++++++------ gcc/rust/hir/rust-ast-lower-type.h | 6 +++- gcc/rust/resolve/rust-ast-resolve-type.h | 6 ++-- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/gcc/rust/hir/rust-ast-lower-type.cc b/gcc/rust/hir/rust-ast-lower-type.cc index 50576532ec46..2c124d1a16ba 100644 --- a/gcc/rust/hir/rust-ast-lower-type.cc +++ b/gcc/rust/hir/rust-ast-lower-type.cc @@ -17,9 +17,10 @@ // . #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 { @@ -27,16 +28,20 @@ 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 (type)); -} + switch (type.get_path_kind ()) + { + case AST::Path::Kind::LangItem: + resolver.visit (static_cast (type)); + break; + case AST::Path::Kind::Type: + resolver.visit (static_cast (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; } @@ -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> translated_segments; + translated_segments.emplace_back (std::unique_ptr ( + 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) { diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h index ec73df27b8f3..2509276dec22 100644 --- a/gcc/rust/hir/rust-ast-lower-type.h +++ b/gcc/rust/hir/rust-ast-lower-type.h @@ -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 { @@ -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 diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h index e9451d3a1028..763838ea488b 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.h +++ b/gcc/rust/resolve/rust-ast-resolve-type.h @@ -71,13 +71,13 @@ class ResolveType : public ResolverBase { auto &type = static_cast (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; }