diff options
Diffstat (limited to 'gcc/rust/backend/rust-compile-resolve-path.cc')
-rw-r--r-- | gcc/rust/backend/rust-compile-resolve-path.cc | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc index 1b892d2..1539378 100644 --- a/gcc/rust/backend/rust-compile-resolve-path.cc +++ b/gcc/rust/backend/rust-compile-resolve-path.cc @@ -27,18 +27,33 @@ namespace Rust { namespace Compile { void +ResolvePathRef::visit (HIR::QualifiedPathInExpression &expr) +{ + resolve (expr.get_final_segment ().get_segment (), expr.get_mappings (), + expr.get_locus (), true); +} + +void ResolvePathRef::visit (HIR::PathInExpression &expr) { + resolve (expr.get_final_segment ().get_segment (), expr.get_mappings (), + expr.get_locus (), false); +} + +void +ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment, + const Analysis::NodeMapping &mappings, + Location expr_locus, bool is_qualified_path) +{ // need to look up the reference for this identifier NodeId ref_node_id = UNKNOWN_NODEID; - if (ctx->get_resolver ()->lookup_resolved_name ( - expr.get_mappings ().get_nodeid (), &ref_node_id)) + if (ctx->get_resolver ()->lookup_resolved_name (mappings.get_nodeid (), + &ref_node_id)) { Resolver::Definition def; if (!ctx->get_resolver ()->lookup_definition (ref_node_id, &def)) { - rust_error_at (expr.get_locus (), - "unknown reference for resolved name"); + rust_error_at (expr_locus, "unknown reference for resolved name"); return; } ref_node_id = def.parent; @@ -50,10 +65,10 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) return; HirId ref; - if (!ctx->get_mappings ()->lookup_node_to_hir ( - expr.get_mappings ().get_crate_num (), ref_node_id, &ref)) + if (!ctx->get_mappings ()->lookup_node_to_hir (mappings.get_crate_num (), + ref_node_id, &ref)) { - rust_error_at (expr.get_locus (), "reverse call path lookup failure"); + rust_error_at (expr_locus, "reverse call path lookup failure"); return; } @@ -65,15 +80,14 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) Bvariable *var = nullptr; if (ctx->lookup_var_decl (ref, &var)) { - resolved = ctx->get_backend ()->var_expression (var, expr.get_locus ()); + resolved = ctx->get_backend ()->var_expression (var, expr_locus); return; } // must be a function call but it might be a generic function which needs to // be compiled first TyTy::BaseType *lookup = nullptr; - bool ok = ctx->get_tyctx ()->lookup_type (expr.get_mappings ().get_hirid (), - &lookup); + bool ok = ctx->get_tyctx ()->lookup_type (mappings.get_hirid (), &lookup); rust_assert (ok); rust_assert (lookup->get_kind () == TyTy::TypeKind::FNDEF); TyTy::FnType *fntype = static_cast<TyTy::FnType *> (lookup); @@ -82,8 +96,9 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) if (!ctx->lookup_function_decl (lookup->get_ty_ref (), &fn)) { // it must resolve to some kind of HIR::Item or HIR::InheritImplItem - HIR::Item *resolved_item = ctx->get_mappings ()->lookup_hir_item ( - expr.get_mappings ().get_crate_num (), ref); + HIR::Item *resolved_item + = ctx->get_mappings ()->lookup_hir_item (mappings.get_crate_num (), + ref); if (resolved_item != nullptr) { if (!lookup->has_subsititions_defined ()) @@ -96,14 +111,14 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) HirId parent_impl_id = UNKNOWN_HIRID; HIR::ImplItem *resolved_item = ctx->get_mappings ()->lookup_hir_implitem ( - expr.get_mappings ().get_crate_num (), ref, &parent_impl_id); + mappings.get_crate_num (), ref, &parent_impl_id); if (resolved_item == nullptr) { // it might be resolved to a trait item HIR::TraitItem *trait_item = ctx->get_mappings ()->lookup_hir_trait_item ( - expr.get_mappings ().get_crate_num (), ref); + mappings.get_crate_num (), ref); HIR::Trait *trait = ctx->get_mappings ()->lookup_trait_item_mapping ( trait_item->get_mappings ().get_hirid ()); @@ -115,8 +130,8 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) rust_assert (ok); TyTy::BaseType *receiver = nullptr; - ok = ctx->get_tyctx ()->lookup_receiver ( - expr.get_mappings ().get_hirid (), &receiver); + ok = ctx->get_tyctx ()->lookup_receiver (mappings.get_hirid (), + &receiver); rust_assert (ok); if (receiver->get_kind () == TyTy::TypeKind::PARAM) @@ -130,10 +145,13 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) // item so its up to us to figure out if this path should resolve // to an trait-impl-block-item or if it can be defaulted to the // trait-impl-item's definition - std::vector<Resolver::PathProbeCandidate> candidates - = Resolver::PathProbeType::Probe ( - receiver, expr.get_final_segment ().get_segment (), true, - false, true); + std::vector<Resolver::PathProbeCandidate> candidates; + if (!is_qualified_path) + { + candidates + = Resolver::PathProbeType::Probe (receiver, final_segment, + true, false, true); + } if (candidates.size () == 0) { @@ -152,6 +170,7 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) = ctx->get_tyctx () ->lookup_associated_impl_mapping_for_self ( trait_mappings.get_hirid (), receiver); + rust_assert (associated_impl_id != UNKNOWN_HIRID); Resolver::AssociatedImplTrait *associated = nullptr; @@ -168,7 +187,7 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &fn)) { resolved = ctx->get_backend ()->error_expression (); - rust_error_at (expr.get_locus (), + rust_error_at (expr_locus, "forward declaration was not compiled"); return; } @@ -201,7 +220,7 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) { rust_assert (parent_impl_id != UNKNOWN_HIRID); HIR::Item *impl_ref = ctx->get_mappings ()->lookup_hir_item ( - expr.get_mappings ().get_crate_num (), parent_impl_id); + mappings.get_crate_num (), parent_impl_id); rust_assert (impl_ref != nullptr); HIR::ImplBlock *impl = static_cast<HIR::ImplBlock *> (impl_ref); @@ -222,14 +241,12 @@ ResolvePathRef::visit (HIR::PathInExpression &expr) if (!ctx->lookup_function_decl (lookup->get_ty_ref (), &fn)) { resolved = ctx->get_backend ()->error_expression (); - rust_error_at (expr.get_locus (), - "forward declaration was not compiled"); + rust_error_at (expr_locus, "forward declaration was not compiled"); return; } } - resolved - = ctx->get_backend ()->function_code_expression (fn, expr.get_locus ()); + resolved = ctx->get_backend ()->function_code_expression (fn, expr_locus); } } // namespace Compile |