diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-02-20 14:03:54 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-20 14:03:54 +0000 |
commit | 4e096b1f14671270fb0c7b449d92b3e558bb769d (patch) | |
tree | 78a11bc9609835f9d9cec8cb645df08193eece16 /gcc/rust/resolve/rust-ast-resolve.cc | |
parent | 31387e76090007b12da82d7ef11b042e88df0ba5 (diff) | |
parent | 3dd4ce76a69e786b56a9af8b911590fc6410cc97 (diff) | |
download | gcc-4e096b1f14671270fb0c7b449d92b3e558bb769d.zip gcc-4e096b1f14671270fb0c7b449d92b3e558bb769d.tar.gz gcc-4e096b1f14671270fb0c7b449d92b3e558bb769d.tar.bz2 |
Merge #951
951: Add name resolution to slices r=philberty a=philberty
This is the first part to support slices where we complete the name
resolution of the SliceType with its element as well as the range
expressions used in construction.
This patch also includes separation of the implementation from the
headers to try and incrementally improve build speed.
Addresses #849
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/resolve/rust-ast-resolve.cc')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 183 |
1 files changed, 1 insertions, 182 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc index 3fb8b41..094fa4a 100644 --- a/gcc/rust/resolve/rust-ast-resolve.cc +++ b/gcc/rust/resolve/rust-ast-resolve.cc @@ -22,6 +22,7 @@ #include "rust-ast-resolve-toplevel.h" #include "rust-ast-resolve-item.h" #include "rust-ast-resolve-expr.h" +#include "rust-ast-resolve-struct-expr-field.h" #define MKBUILTIN_TYPE(_X, _R, _TY) \ do \ @@ -388,41 +389,6 @@ NameResolution::go (AST::Crate &crate) ResolveItem::go (it->get (), CanonicalPath::create_empty (), crate_prefix); } -// rust-ast-resolve-expr.h - -void -ResolveExpr::visit (AST::BlockExpr &expr) -{ - NodeId scope_node_id = expr.get_node_id (); - resolver->get_name_scope ().push (scope_node_id); - resolver->get_type_scope ().push (scope_node_id); - resolver->get_label_scope ().push (scope_node_id); - resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); - resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); - resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); - - for (auto &s : expr.get_statements ()) - { - if (s->is_item ()) - ResolveStmt::go (s.get (), s->get_node_id (), prefix, canonical_prefix, - CanonicalPath::create_empty ()); - } - - for (auto &s : expr.get_statements ()) - { - if (!s->is_item ()) - ResolveStmt::go (s.get (), s->get_node_id (), prefix, canonical_prefix, - CanonicalPath::create_empty ()); - } - - if (expr.has_tail_expr ()) - resolve_expr (expr.get_tail_expr ().get (), expr.get_node_id ()); - - resolver->get_name_scope ().pop (); - resolver->get_type_scope ().pop (); - resolver->get_label_scope ().pop (); -} - // rust-ast-resolve-struct-expr-field.h void @@ -448,120 +414,6 @@ ResolveStructExprField::visit (AST::StructExprFieldIdentifier &field) ResolveExpr::go (&expr, field.get_node_id (), prefix, canonical_prefix); } -// rust-ast-resolve-type.h - -std::string -ResolveTypeToCanonicalPath::canonicalize_generic_args (AST::GenericArgs &args) -{ - std::string buf; - - size_t i = 0; - size_t total = args.get_type_args ().size (); - - for (auto &ty_arg : args.get_type_args ()) - { - buf += ty_arg->as_string (); - if ((i + 1) < total) - buf += ","; - - i++; - } - - return "<" + buf + ">"; -} - -bool -ResolveTypeToCanonicalPath::type_resolve_generic_args (AST::GenericArgs &args) -{ - for (auto > : args.get_type_args ()) - { - ResolveType::go (gt.get (), UNKNOWN_NODEID); - // FIXME error handling here for inference variable since they do not have - // a node to resolve to - // if (resolved == UNKNOWN_NODEID) return false; - } - return true; -} - -void -ResolveTypeToCanonicalPath::visit (AST::TypePathSegmentGeneric &seg) -{ - if (seg.is_error ()) - { - failure_flag = true; - rust_error_at (seg.get_locus (), "segment has error: %s", - seg.as_string ().c_str ()); - return; - } - - if (!seg.has_generic_args ()) - { - auto ident_segment - = CanonicalPath::new_seg (seg.get_node_id (), - seg.get_ident_segment ().as_string ()); - result = result.append (ident_segment); - return; - } - - if (type_resolve_generic_args_flag) - { - bool ok = type_resolve_generic_args (seg.get_generic_args ()); - failure_flag = !ok; - } - - if (include_generic_args_flag) - { - std::string generics - = canonicalize_generic_args (seg.get_generic_args ()); - auto generic_segment - = CanonicalPath::new_seg (seg.get_node_id (), - seg.get_ident_segment ().as_string () - + "::" + generics); - result = result.append (generic_segment); - return; - } - - auto ident_segment - = CanonicalPath::new_seg (seg.get_node_id (), - seg.get_ident_segment ().as_string ()); - result = result.append (ident_segment); -} - -void -ResolveTypeToCanonicalPath::visit (AST::TypePathSegment &seg) -{ - if (seg.is_error ()) - { - failure_flag = true; - rust_error_at (seg.get_locus (), "segment has error: %s", - seg.as_string ().c_str ()); - return; - } - - CanonicalPath ident_seg - = CanonicalPath::new_seg (seg.get_node_id (), - seg.get_ident_segment ().as_string ()); - result = result.append (ident_seg); -} - -void -ResolveTypeToCanonicalPath::visit (AST::ReferenceType &ref) -{ - auto inner_type - = ResolveTypeToCanonicalPath::resolve (*ref.get_type_referenced ().get (), - include_generic_args_flag, - type_resolve_generic_args_flag); - - std::string segment_string ("&"); - if (ref.get_has_mut ()) - segment_string += "mut "; - - segment_string += inner_type.get (); - - auto ident_seg = CanonicalPath::new_seg (ref.get_node_id (), segment_string); - result = result.append (ident_seg); -} - // rust-ast-resolve-expr.h void @@ -799,39 +651,6 @@ ResolvePath::resolve_segments (CanonicalPath prefix, size_t offs, } } -// rust-ast-resolve-type.h - -void -ResolveType::visit (AST::ArrayType &type) -{ - type.get_elem_type ()->accept_vis (*this); - // FIXME - // the capacity expr can contain block-expr with functions but these should be - // folded via constexpr code - ResolveExpr::go (type.get_size_expr ().get (), type.get_node_id (), - CanonicalPath::create_empty (), - CanonicalPath::create_empty ()); -} - -void -ResolveType::visit (AST::TraitObjectTypeOneBound &type) -{ - NodeId bound_resolved_id - = ResolveTypeBound::go (&type.get_trait_bound (), type.get_node_id ()); - ok = bound_resolved_id != UNKNOWN_NODEID; -} - -void -ResolveType::visit (AST::TraitObjectType &type) -{ - ok = true; - for (auto &bound : type.get_type_param_bounds ()) - { - /* NodeId bound_resolved_id = */ - ResolveTypeBound::go (bound.get (), type.get_node_id ()); - } -} - // rust-ast-resolve-item.h void |