[gccrs COMMIT 12/17] gccrs: Refactor PathProbeType into its own file and call it PathProbeExpr

gerris.rs@gmail.com gerris.rs@gmail.com
Sun Aug 30 21:46:08 GMT 2026


From: Philip Herron <herron.philip@googlemail.com>

gcc/rust/ChangeLog:

	* Make-lang.in: new object
	* typecheck/rust-hir-path-probe.cc (PathProbeType::PathProbeType): refactor
	(PathProbeType::Probe): likewise
	(PathProbeType::visit): likewise
	(PathProbeType::process_enum_item_for_candiates): likewise
	(PathProbeType::process_impl_items_for_candidates): likewise
	(PathProbeType::process_impl_item_candidate): likewise
	(PathProbeType::is_receiver_generic): likewise
	* typecheck/rust-hir-path-probe.h (class PathProbeType): likewise
	* typecheck/rust-hir-type-check-path.cc (TypeCheckExpr::resolve_segments): likewise
	* typecheck/rust-hir-path-probe-expr.cc: New file.
	* typecheck/rust-hir-path-probe-expr.h: New file.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: https://github.com/Rust-GCC/gccrs/commit/0e7c12e47ccb8c485ec8e616ffcdeacb59ae4511

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4816

 gcc/rust/Make-lang.in                         |   1 +
 .../typecheck/rust-hir-path-probe-expr.cc     | 364 ++++++++++++++++++
 gcc/rust/typecheck/rust-hir-path-probe-expr.h |  79 ++++
 gcc/rust/typecheck/rust-hir-path-probe.cc     | 336 ----------------
 gcc/rust/typecheck/rust-hir-path-probe.h      |  49 ---
 .../typecheck/rust-hir-type-check-path.cc     |   6 +-
 6 files changed, 447 insertions(+), 388 deletions(-)
 create mode 100644 gcc/rust/typecheck/rust-hir-path-probe-expr.cc
 create mode 100644 gcc/rust/typecheck/rust-hir-path-probe-expr.h

diff --git a/gcc/rust/Make-lang.in b/gcc/rust/Make-lang.in
index 91caebbee..e4e570452 100644
--- a/gcc/rust/Make-lang.in
+++ b/gcc/rust/Make-lang.in
@@ -187,6 +187,7 @@ GRS_OBJS = \
     rust/rust-polonius.o\
     rust/rust-hir-dot-operator.o \
     rust/rust-hir-path-probe.o \
+    rust/rust-hir-path-probe-expr.o \
     rust/rust-hir-path-probe-impl-trait.o \
     rust/rust-hir-path-probe-type.o \
     rust/rust-hir-path.o \
diff --git a/gcc/rust/typecheck/rust-hir-path-probe-expr.cc b/gcc/rust/typecheck/rust-hir-path-probe-expr.cc
new file mode 100644
index 000000000..690e3e35c
--- /dev/null
+++ b/gcc/rust/typecheck/rust-hir-path-probe-expr.cc
@@ -0,0 +1,364 @@
+// Copyright (C) 2020-2026 Free Software Foundation, Inc.
+//
+// This file is part of GCC.
+//
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+//
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include "rust-hir-path-probe-expr.h"
+#include "rust-hir-item.h"
+#include "rust-type-util.h"
+#include "rust-hir-type-bounds.h"
+
+namespace Rust {
+namespace Resolver {
+
+// PathProbeExpr
+
+PathProbeExpr::PathProbeExpr (TyTy::BaseType *receiver,
+			      const HIR::PathIdentSegment &query,
+			      DefId specific_trait_id)
+  : TypeCheckBase (), receiver (receiver), search (query),
+    current_impl (nullptr), specific_trait_id (specific_trait_id)
+{}
+
+std::set<PathProbeCandidate>
+PathProbeExpr::Probe (TyTy::BaseType *receiver,
+		      const HIR::PathIdentSegment &segment_name,
+		      bool probe_impls, bool probe_bounds,
+		      bool ignore_mandatory_trait_items,
+		      DefId specific_trait_id)
+{
+  Analysis::Mappings &mappings = Analysis::Mappings::get ();
+
+  PathProbeExpr probe (receiver, segment_name, specific_trait_id);
+  if (probe_impls)
+    {
+      if (receiver->get_kind () == TyTy::TypeKind::ADT)
+	{
+	  const TyTy::ADTType *adt
+	    = static_cast<const TyTy::ADTType *> (receiver);
+	  if (adt->is_enum ())
+	    probe.process_enum_item_for_candiates (adt);
+	}
+
+      probe.process_impl_items_for_candidates ();
+    }
+
+  if (!probe_bounds)
+    return probe.candidates;
+
+  if (!probe.is_receiver_generic ())
+    {
+      HIR::Trait *associated_trait = nullptr;
+      if (specific_trait_id != UNKNOWN_DEFID)
+	{
+	  auto item_lookup = mappings.lookup_defid (specific_trait_id);
+	  if (item_lookup.has_value ())
+	    {
+	      HIR::Item *item = item_lookup.value ();
+	      rust_assert (item->get_item_kind ()
+			   == HIR::Item::ItemKind::Trait);
+	      associated_trait = static_cast<HIR::Trait *> (item);
+	    }
+	}
+
+      auto probed_bounds = TypeBoundsProbe::Probe (receiver, associated_trait);
+      for (auto &candidate : probed_bounds)
+	{
+	  const TraitReference *trait_ref = candidate.first;
+	  if (specific_trait_id != UNKNOWN_DEFID)
+	    {
+	      if (trait_ref->get_mappings ().get_defid () != specific_trait_id)
+		continue;
+	    }
+
+	  HIR::ImplBlock *impl = candidate.second;
+	  probe.process_associated_trait_for_candidates (
+	    trait_ref, impl, ignore_mandatory_trait_items);
+	}
+    }
+
+  for (const TyTy::TypeBoundPredicate &predicate :
+       receiver->get_specified_bounds ())
+    {
+      const TraitReference *trait_ref = predicate.get ();
+      if (specific_trait_id != UNKNOWN_DEFID)
+	{
+	  if (trait_ref->get_mappings ().get_defid () != specific_trait_id)
+	    continue;
+	}
+
+      probe.process_predicate_for_candidates (predicate,
+					      ignore_mandatory_trait_items);
+    }
+
+  return probe.candidates;
+}
+
+void
+PathProbeExpr::visit (HIR::TypeAlias &alias)
+{
+  Identifier name = alias.get_new_type_name ();
+  if (search.to_string ().compare (name.as_string ()) == 0)
+    {
+      HirId tyid = alias.get_mappings ().get_hirid ();
+      TyTy::BaseType *ty = nullptr;
+      if (!query_type (tyid, &ty))
+	return;
+
+      PathProbeCandidate::ImplItemCandidate impl_item_candidate{&alias,
+								current_impl};
+      PathProbeCandidate candidate{
+	PathProbeCandidate::CandidateType::IMPL_TYPE_ALIAS, ty,
+	alias.get_locus (), impl_item_candidate};
+      candidates.insert (std::move (candidate));
+    }
+}
+
+void
+PathProbeExpr::visit (HIR::ConstantItem &constant)
+{
+  Identifier name = constant.get_identifier ();
+  if (search.to_string ().compare (name.as_string ()) == 0)
+    {
+      HirId tyid = constant.get_mappings ().get_hirid ();
+      TyTy::BaseType *ty = nullptr;
+      if (!query_type (tyid, &ty))
+	return;
+
+      PathProbeCandidate::ImplItemCandidate impl_item_candidate{&constant,
+								current_impl};
+      PathProbeCandidate candidate{
+	PathProbeCandidate::CandidateType::IMPL_CONST, ty,
+	constant.get_locus (), impl_item_candidate};
+      candidates.insert (std::move (candidate));
+    }
+}
+
+void
+PathProbeExpr::visit (HIR::Function &function)
+{
+  Identifier name = function.get_function_name ();
+  if (search.to_string ().compare (name.as_string ()) == 0)
+    {
+      HirId tyid = function.get_mappings ().get_hirid ();
+      TyTy::BaseType *ty = nullptr;
+      if (!query_type (tyid, &ty))
+	return;
+
+      PathProbeCandidate::ImplItemCandidate impl_item_candidate{&function,
+								current_impl};
+      PathProbeCandidate candidate{PathProbeCandidate::CandidateType::IMPL_FUNC,
+				   ty, function.get_locus (),
+				   impl_item_candidate};
+      candidates.insert (std::move (candidate));
+    }
+}
+
+void
+PathProbeExpr::process_enum_item_for_candiates (const TyTy::ADTType *adt)
+{
+  if (specific_trait_id != UNKNOWN_DEFID)
+    return;
+
+  TyTy::VariantDef *v;
+  if (!adt->lookup_variant (search.to_string (), &v))
+    return;
+
+  PathProbeCandidate::EnumItemCandidate enum_item_candidate{adt, v};
+  PathProbeCandidate candidate{PathProbeCandidate::CandidateType::ENUM_VARIANT,
+			       receiver->clone (),
+			       mappings.lookup_location (adt->get_ty_ref ()),
+			       enum_item_candidate};
+  candidates.insert (std::move (candidate));
+}
+
+void
+PathProbeExpr::process_impl_items_for_candidates ()
+{
+  if (auto *adt = receiver->try_as<TyTy::ADTType> ())
+    {
+      auto adt_item = mappings.lookup_defid (adt->get_id ());
+      if (adt_item.has_value ())
+	{
+	  NodeId adt_node_id = adt_item.value ()->get_mappings ().get_nodeid ();
+	  mappings.iterate_adt_impl_items (
+	    adt_node_id,
+	    [&] (HirId id, HIR::ImplItem *item,
+		 HIR::ImplBlock *impl) mutable -> bool {
+	      process_impl_item_candidate (id, item, impl);
+	      return true;
+	    });
+	  return;
+	}
+    }
+
+  mappings.iterate_impl_items (
+    [&] (HirId id, HIR::ImplItem *item, HIR::ImplBlock *impl) mutable -> bool {
+      process_impl_item_candidate (id, item, impl);
+      return true;
+    });
+}
+
+void
+PathProbeExpr::process_impl_item_candidate (HirId id, HIR::ImplItem *item,
+					    HIR::ImplBlock *impl)
+{
+  current_impl = impl;
+  HirId impl_ty_id = impl->get_type ().get_mappings ().get_hirid ();
+  TyTy::BaseType *impl_block_ty = nullptr;
+  if (!query_type (impl_ty_id, &impl_block_ty))
+    return;
+
+  if (!types_compatable (TyTy::TyWithLocation (receiver),
+			 TyTy::TyWithLocation (impl_block_ty),
+			 impl->get_locus (), false))
+    return;
+
+  // lets visit the impl_item
+  item->accept_vis (*this);
+}
+
+void
+PathProbeExpr::process_associated_trait_for_candidates (
+  const TraitReference *trait_ref, HIR::ImplBlock *impl,
+  bool ignore_mandatory_trait_items)
+{
+  const TraitItemReference *trait_item_ref = nullptr;
+  if (!trait_ref->lookup_trait_item (search.to_string (), &trait_item_ref))
+    return;
+
+  bool trait_item_needs_implementation = !trait_item_ref->is_optional ();
+  if (ignore_mandatory_trait_items && trait_item_needs_implementation)
+    return;
+
+  PathProbeCandidate::CandidateType candidate_type;
+  switch (trait_item_ref->get_trait_item_type ())
+    {
+    case TraitItemReference::TraitItemType::FN:
+      candidate_type = PathProbeCandidate::CandidateType::TRAIT_FUNC;
+      break;
+    case TraitItemReference::TraitItemType::CONST:
+      candidate_type = PathProbeCandidate::CandidateType::TRAIT_ITEM_CONST;
+      break;
+    case TraitItemReference::TraitItemType::TYPE:
+      candidate_type = PathProbeCandidate::CandidateType::TRAIT_TYPE_ALIAS;
+      break;
+
+    case TraitItemReference::TraitItemType::ERROR:
+    default:
+      rust_unreachable ();
+      break;
+    }
+
+  const TyTy::TypeBoundPredicate p (*trait_ref, BoundPolarity::RegularBound,
+				    UNDEF_LOCATION);
+  TyTy::TypeBoundPredicateItem item (p, trait_item_ref);
+
+  TyTy::BaseType *trait_item_tyty = item.get_raw_item ()->get_tyty ();
+  if (receiver->get_kind () != TyTy::DYNAMIC)
+    trait_item_tyty = item.get_tyty_for_receiver (receiver);
+
+  PathProbeCandidate::TraitItemCandidate trait_item_candidate{trait_ref,
+							      trait_item_ref,
+							      impl};
+  PathProbeCandidate candidate{candidate_type, trait_item_tyty,
+			       trait_item_ref->get_locus (),
+			       trait_item_candidate};
+  candidates.insert (std::move (candidate));
+}
+
+void
+PathProbeExpr::process_predicate_for_candidates (
+  const TyTy::TypeBoundPredicate &predicate, bool ignore_mandatory_trait_items)
+{
+  const TraitReference *trait_ref = predicate.get ();
+
+  tl::optional<TyTy::TypeBoundPredicateItem> item
+    = predicate.lookup_associated_item (search.to_string ());
+  if (!item.has_value ())
+    return;
+
+  if (ignore_mandatory_trait_items && item->needs_implementation ())
+    return;
+
+  const TraitItemReference *trait_item_ref = item->get_raw_item ();
+  PathProbeCandidate::CandidateType candidate_type;
+  switch (trait_item_ref->get_trait_item_type ())
+    {
+    case TraitItemReference::TraitItemType::FN:
+      candidate_type = PathProbeCandidate::CandidateType::TRAIT_FUNC;
+      break;
+    case TraitItemReference::TraitItemType::CONST:
+      candidate_type = PathProbeCandidate::CandidateType::TRAIT_ITEM_CONST;
+      break;
+    case TraitItemReference::TraitItemType::TYPE:
+      candidate_type = PathProbeCandidate::CandidateType::TRAIT_TYPE_ALIAS;
+      break;
+
+    case TraitItemReference::TraitItemType::ERROR:
+    default:
+      rust_unreachable ();
+      break;
+    }
+
+  TyTy::BaseType *trait_item_tyty = item->get_raw_item ()->get_tyty ();
+  if (receiver->get_kind () != TyTy::DYNAMIC)
+    trait_item_tyty = item->get_tyty_for_receiver (receiver);
+
+  PathProbeCandidate::TraitItemCandidate trait_item_candidate{trait_ref,
+							      trait_item_ref,
+							      nullptr};
+  PathProbeCandidate candidate{candidate_type, trait_item_tyty,
+			       trait_item_ref->get_locus (),
+			       trait_item_candidate};
+  candidates.insert (std::move (candidate));
+}
+
+std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>>
+PathProbeExpr::union_bounds (
+  const std::vector<std::pair</*const*/ TraitReference *, HIR::ImplBlock *>> a,
+  const std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>> b)
+  const
+{
+  std::map<DefId, std::pair<const TraitReference *, HIR::ImplBlock *>> mapper;
+  for (auto &ref : a)
+    {
+      mapper.insert ({ref.first->get_mappings ().get_defid (), ref});
+    }
+  for (auto &ref : b)
+    {
+      mapper.insert ({ref.first->get_mappings ().get_defid (), ref});
+    }
+
+  std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>> union_set;
+
+  for (auto it = mapper.begin (); it != mapper.end (); it++)
+    union_set.emplace_back (it->second.first, it->second.second);
+
+  return union_set;
+}
+
+bool
+PathProbeExpr::is_receiver_generic () const
+{
+  const TyTy::BaseType *root = receiver->get_root ();
+  bool receiver_is_type_param = root->get_kind () == TyTy::TypeKind::PARAM;
+  bool receiver_is_dyn = root->get_kind () == TyTy::TypeKind::DYNAMIC;
+  return receiver_is_type_param || receiver_is_dyn;
+}
+
+} // namespace Resolver
+} // namespace Rust
diff --git a/gcc/rust/typecheck/rust-hir-path-probe-expr.h b/gcc/rust/typecheck/rust-hir-path-probe-expr.h
new file mode 100644
index 000000000..e824da667
--- /dev/null
+++ b/gcc/rust/typecheck/rust-hir-path-probe-expr.h
@@ -0,0 +1,79 @@
+// Copyright (C) 2020-2026 Free Software Foundation, Inc.
+
+// This file is part of GCC.
+
+// GCC is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 3, or (at your option) any later
+// version.
+
+// GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with GCC; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef RUST_HIR_PATH_PROBE_EXPR_H
+#define RUST_HIR_PATH_PROBE_EXPR_H
+
+#include "rust-hir-path-probe.h"
+
+namespace Rust {
+namespace Resolver {
+
+class PathProbeExpr : public TypeCheckBase, public HIR::HIRImplVisitor
+{
+public:
+  static std::set<PathProbeCandidate>
+  Probe (TyTy::BaseType *receiver, const HIR::PathIdentSegment &segment_name,
+	 bool probe_impls, bool probe_bounds, bool ignore_mandatory_trait_items,
+	 DefId specific_trait_id = UNKNOWN_DEFID);
+
+  void visit (HIR::TypeAlias &alias) override;
+  void visit (HIR::ConstantItem &constant) override;
+  void visit (HIR::Function &function) override;
+
+protected:
+  void process_enum_item_for_candiates (const TyTy::ADTType *adt);
+
+  void process_impl_items_for_candidates ();
+
+  void process_impl_item_candidate (HirId id, HIR::ImplItem *item,
+				    HIR::ImplBlock *impl);
+
+  void
+  process_associated_trait_for_candidates (const TraitReference *trait_ref,
+					   HIR::ImplBlock *impl,
+					   bool ignore_mandatory_trait_items);
+
+  void
+  process_predicate_for_candidates (const TyTy::TypeBoundPredicate &predicate,
+				    bool ignore_mandatory_trait_items);
+
+protected:
+  PathProbeExpr (TyTy::BaseType *receiver, const HIR::PathIdentSegment &query,
+		 DefId specific_trait_id);
+
+  std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>>
+  union_bounds (
+    const std::vector<std::pair</*const*/ TraitReference *, HIR::ImplBlock *>>
+      a,
+    const std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>> b)
+    const;
+
+  bool is_receiver_generic () const;
+
+  TyTy::BaseType *receiver;
+  const HIR::PathIdentSegment &search;
+  std::set<PathProbeCandidate> candidates;
+  HIR::ImplBlock *current_impl;
+  DefId specific_trait_id;
+};
+
+} // namespace Resolver
+} // namespace Rust
+
+#endif // RUST_HIR_PATH_PROBE_EXPR_H
diff --git a/gcc/rust/typecheck/rust-hir-path-probe.cc b/gcc/rust/typecheck/rust-hir-path-probe.cc
index 2a6f93797..ca8c1468b 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.cc
+++ b/gcc/rust/typecheck/rust-hir-path-probe.cc
@@ -136,341 +136,5 @@ PathProbeCandidate::operator< (const PathProbeCandidate &c) const
   return get_defid () < c.get_defid ();
 }
 
-// PathProbeType
-
-PathProbeType::PathProbeType (TyTy::BaseType *receiver,
-			      const HIR::PathIdentSegment &query,
-			      DefId specific_trait_id)
-  : TypeCheckBase (), receiver (receiver), search (query),
-    current_impl (nullptr), specific_trait_id (specific_trait_id)
-{}
-
-std::set<PathProbeCandidate>
-PathProbeType::Probe (TyTy::BaseType *receiver,
-		      const HIR::PathIdentSegment &segment_name,
-		      bool probe_impls, bool probe_bounds,
-		      bool ignore_mandatory_trait_items,
-		      DefId specific_trait_id)
-{
-  Analysis::Mappings &mappings = Analysis::Mappings::get ();
-
-  PathProbeType probe (receiver, segment_name, specific_trait_id);
-  if (probe_impls)
-    {
-      if (receiver->get_kind () == TyTy::TypeKind::ADT)
-	{
-	  const TyTy::ADTType *adt
-	    = static_cast<const TyTy::ADTType *> (receiver);
-	  if (adt->is_enum ())
-	    probe.process_enum_item_for_candiates (adt);
-	}
-
-      probe.process_impl_items_for_candidates ();
-    }
-
-  if (!probe_bounds)
-    return probe.candidates;
-
-  if (!probe.is_receiver_generic ())
-    {
-      HIR::Trait *associated_trait = nullptr;
-      if (specific_trait_id != UNKNOWN_DEFID)
-	{
-	  auto item_lookup = mappings.lookup_defid (specific_trait_id);
-	  if (item_lookup.has_value ())
-	    {
-	      HIR::Item *item = item_lookup.value ();
-	      rust_assert (item->get_item_kind ()
-			   == HIR::Item::ItemKind::Trait);
-	      associated_trait = static_cast<HIR::Trait *> (item);
-	    }
-	}
-
-      auto probed_bounds = TypeBoundsProbe::Probe (receiver, associated_trait);
-      for (auto &candidate : probed_bounds)
-	{
-	  const TraitReference *trait_ref = candidate.first;
-	  if (specific_trait_id != UNKNOWN_DEFID)
-	    {
-	      if (trait_ref->get_mappings ().get_defid () != specific_trait_id)
-		continue;
-	    }
-
-	  HIR::ImplBlock *impl = candidate.second;
-	  probe.process_associated_trait_for_candidates (
-	    trait_ref, impl, ignore_mandatory_trait_items);
-	}
-    }
-
-  for (const TyTy::TypeBoundPredicate &predicate :
-       receiver->get_specified_bounds ())
-    {
-      const TraitReference *trait_ref = predicate.get ();
-      if (specific_trait_id != UNKNOWN_DEFID)
-	{
-	  if (trait_ref->get_mappings ().get_defid () != specific_trait_id)
-	    continue;
-	}
-
-      probe.process_predicate_for_candidates (predicate,
-					      ignore_mandatory_trait_items);
-    }
-
-  return probe.candidates;
-}
-
-void
-PathProbeType::visit (HIR::TypeAlias &alias)
-{
-  Identifier name = alias.get_new_type_name ();
-  if (search.to_string ().compare (name.as_string ()) == 0)
-    {
-      HirId tyid = alias.get_mappings ().get_hirid ();
-      TyTy::BaseType *ty = nullptr;
-      if (!query_type (tyid, &ty))
-	return;
-
-      PathProbeCandidate::ImplItemCandidate impl_item_candidate{&alias,
-								current_impl};
-      PathProbeCandidate candidate{
-	PathProbeCandidate::CandidateType::IMPL_TYPE_ALIAS, ty,
-	alias.get_locus (), impl_item_candidate};
-      candidates.insert (std::move (candidate));
-    }
-}
-
-void
-PathProbeType::visit (HIR::ConstantItem &constant)
-{
-  Identifier name = constant.get_identifier ();
-  if (search.to_string ().compare (name.as_string ()) == 0)
-    {
-      HirId tyid = constant.get_mappings ().get_hirid ();
-      TyTy::BaseType *ty = nullptr;
-      if (!query_type (tyid, &ty))
-	return;
-
-      PathProbeCandidate::ImplItemCandidate impl_item_candidate{&constant,
-								current_impl};
-      PathProbeCandidate candidate{
-	PathProbeCandidate::CandidateType::IMPL_CONST, ty,
-	constant.get_locus (), impl_item_candidate};
-      candidates.insert (std::move (candidate));
-    }
-}
-
-void
-PathProbeType::visit (HIR::Function &function)
-{
-  Identifier name = function.get_function_name ();
-  if (search.to_string ().compare (name.as_string ()) == 0)
-    {
-      HirId tyid = function.get_mappings ().get_hirid ();
-      TyTy::BaseType *ty = nullptr;
-      if (!query_type (tyid, &ty))
-	return;
-
-      PathProbeCandidate::ImplItemCandidate impl_item_candidate{&function,
-								current_impl};
-      PathProbeCandidate candidate{PathProbeCandidate::CandidateType::IMPL_FUNC,
-				   ty, function.get_locus (),
-				   impl_item_candidate};
-      candidates.insert (std::move (candidate));
-    }
-}
-
-void
-PathProbeType::process_enum_item_for_candiates (const TyTy::ADTType *adt)
-{
-  if (specific_trait_id != UNKNOWN_DEFID)
-    return;
-
-  TyTy::VariantDef *v;
-  if (!adt->lookup_variant (search.to_string (), &v))
-    return;
-
-  PathProbeCandidate::EnumItemCandidate enum_item_candidate{adt, v};
-  PathProbeCandidate candidate{PathProbeCandidate::CandidateType::ENUM_VARIANT,
-			       receiver->clone (),
-			       mappings.lookup_location (adt->get_ty_ref ()),
-			       enum_item_candidate};
-  candidates.insert (std::move (candidate));
-}
-
-void
-PathProbeType::process_impl_items_for_candidates ()
-{
-  if (auto *adt = receiver->try_as<TyTy::ADTType> ())
-    {
-      auto adt_item = mappings.lookup_defid (adt->get_id ());
-      if (adt_item.has_value ())
-	{
-	  NodeId adt_node_id = adt_item.value ()->get_mappings ().get_nodeid ();
-	  mappings.iterate_adt_impl_items (
-	    adt_node_id,
-	    [&] (HirId id, HIR::ImplItem *item,
-		 HIR::ImplBlock *impl) mutable -> bool {
-	      process_impl_item_candidate (id, item, impl);
-	      return true;
-	    });
-	  return;
-	}
-    }
-
-  mappings.iterate_impl_items (
-    [&] (HirId id, HIR::ImplItem *item, HIR::ImplBlock *impl) mutable -> bool {
-      process_impl_item_candidate (id, item, impl);
-      return true;
-    });
-}
-
-void
-PathProbeType::process_impl_item_candidate (HirId id, HIR::ImplItem *item,
-					    HIR::ImplBlock *impl)
-{
-  current_impl = impl;
-  HirId impl_ty_id = impl->get_type ().get_mappings ().get_hirid ();
-  TyTy::BaseType *impl_block_ty = nullptr;
-  if (!query_type (impl_ty_id, &impl_block_ty))
-    return;
-
-  if (!types_compatable (TyTy::TyWithLocation (receiver),
-			 TyTy::TyWithLocation (impl_block_ty),
-			 impl->get_locus (), false))
-    return;
-
-  // lets visit the impl_item
-  item->accept_vis (*this);
-}
-
-void
-PathProbeType::process_associated_trait_for_candidates (
-  const TraitReference *trait_ref, HIR::ImplBlock *impl,
-  bool ignore_mandatory_trait_items)
-{
-  const TraitItemReference *trait_item_ref = nullptr;
-  if (!trait_ref->lookup_trait_item (search.to_string (), &trait_item_ref))
-    return;
-
-  bool trait_item_needs_implementation = !trait_item_ref->is_optional ();
-  if (ignore_mandatory_trait_items && trait_item_needs_implementation)
-    return;
-
-  PathProbeCandidate::CandidateType candidate_type;
-  switch (trait_item_ref->get_trait_item_type ())
-    {
-    case TraitItemReference::TraitItemType::FN:
-      candidate_type = PathProbeCandidate::CandidateType::TRAIT_FUNC;
-      break;
-    case TraitItemReference::TraitItemType::CONST:
-      candidate_type = PathProbeCandidate::CandidateType::TRAIT_ITEM_CONST;
-      break;
-    case TraitItemReference::TraitItemType::TYPE:
-      candidate_type = PathProbeCandidate::CandidateType::TRAIT_TYPE_ALIAS;
-      break;
-
-    case TraitItemReference::TraitItemType::ERROR:
-    default:
-      rust_unreachable ();
-      break;
-    }
-
-  const TyTy::TypeBoundPredicate p (*trait_ref, BoundPolarity::RegularBound,
-				    UNDEF_LOCATION);
-  TyTy::TypeBoundPredicateItem item (p, trait_item_ref);
-
-  TyTy::BaseType *trait_item_tyty = item.get_raw_item ()->get_tyty ();
-  if (receiver->get_kind () != TyTy::DYNAMIC)
-    trait_item_tyty = item.get_tyty_for_receiver (receiver);
-
-  PathProbeCandidate::TraitItemCandidate trait_item_candidate{trait_ref,
-							      trait_item_ref,
-							      impl};
-  PathProbeCandidate candidate{candidate_type, trait_item_tyty,
-			       trait_item_ref->get_locus (),
-			       trait_item_candidate};
-  candidates.insert (std::move (candidate));
-}
-
-void
-PathProbeType::process_predicate_for_candidates (
-  const TyTy::TypeBoundPredicate &predicate, bool ignore_mandatory_trait_items)
-{
-  const TraitReference *trait_ref = predicate.get ();
-
-  tl::optional<TyTy::TypeBoundPredicateItem> item
-    = predicate.lookup_associated_item (search.to_string ());
-  if (!item.has_value ())
-    return;
-
-  if (ignore_mandatory_trait_items && item->needs_implementation ())
-    return;
-
-  const TraitItemReference *trait_item_ref = item->get_raw_item ();
-  PathProbeCandidate::CandidateType candidate_type;
-  switch (trait_item_ref->get_trait_item_type ())
-    {
-    case TraitItemReference::TraitItemType::FN:
-      candidate_type = PathProbeCandidate::CandidateType::TRAIT_FUNC;
-      break;
-    case TraitItemReference::TraitItemType::CONST:
-      candidate_type = PathProbeCandidate::CandidateType::TRAIT_ITEM_CONST;
-      break;
-    case TraitItemReference::TraitItemType::TYPE:
-      candidate_type = PathProbeCandidate::CandidateType::TRAIT_TYPE_ALIAS;
-      break;
-
-    case TraitItemReference::TraitItemType::ERROR:
-    default:
-      rust_unreachable ();
-      break;
-    }
-
-  TyTy::BaseType *trait_item_tyty = item->get_raw_item ()->get_tyty ();
-  if (receiver->get_kind () != TyTy::DYNAMIC)
-    trait_item_tyty = item->get_tyty_for_receiver (receiver);
-
-  PathProbeCandidate::TraitItemCandidate trait_item_candidate{trait_ref,
-							      trait_item_ref,
-							      nullptr};
-  PathProbeCandidate candidate{candidate_type, trait_item_tyty,
-			       trait_item_ref->get_locus (),
-			       trait_item_candidate};
-  candidates.insert (std::move (candidate));
-}
-
-std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>>
-PathProbeType::union_bounds (
-  const std::vector<std::pair</*const*/ TraitReference *, HIR::ImplBlock *>> a,
-  const std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>> b)
-  const
-{
-  std::map<DefId, std::pair<const TraitReference *, HIR::ImplBlock *>> mapper;
-  for (auto &ref : a)
-    {
-      mapper.insert ({ref.first->get_mappings ().get_defid (), ref});
-    }
-  for (auto &ref : b)
-    {
-      mapper.insert ({ref.first->get_mappings ().get_defid (), ref});
-    }
-
-  std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>> union_set;
-
-  for (auto it = mapper.begin (); it != mapper.end (); it++)
-    union_set.emplace_back (it->second.first, it->second.second);
-
-  return union_set;
-}
-
-bool
-PathProbeType::is_receiver_generic () const
-{
-  const TyTy::BaseType *root = receiver->get_root ();
-  bool receiver_is_type_param = root->get_kind () == TyTy::TypeKind::PARAM;
-  bool receiver_is_dyn = root->get_kind () == TyTy::TypeKind::DYNAMIC;
-  return receiver_is_type_param || receiver_is_dyn;
-}
-
 } // namespace Resolver
 } // namespace Rust
diff --git a/gcc/rust/typecheck/rust-hir-path-probe.h b/gcc/rust/typecheck/rust-hir-path-probe.h
index d9800e1c6..87bf17689 100644
--- a/gcc/rust/typecheck/rust-hir-path-probe.h
+++ b/gcc/rust/typecheck/rust-hir-path-probe.h
@@ -104,55 +104,6 @@ struct PathProbeCandidate
   bool operator< (const PathProbeCandidate &c) const;
 };
 
-class PathProbeType : public TypeCheckBase, public HIR::HIRImplVisitor
-{
-public:
-  static std::set<PathProbeCandidate>
-  Probe (TyTy::BaseType *receiver, const HIR::PathIdentSegment &segment_name,
-	 bool probe_impls, bool probe_bounds, bool ignore_mandatory_trait_items,
-	 DefId specific_trait_id = UNKNOWN_DEFID);
-
-  void visit (HIR::TypeAlias &alias) override;
-  void visit (HIR::ConstantItem &constant) override;
-  void visit (HIR::Function &function) override;
-
-protected:
-  void process_enum_item_for_candiates (const TyTy::ADTType *adt);
-
-  void process_impl_items_for_candidates ();
-
-  void process_impl_item_candidate (HirId id, HIR::ImplItem *item,
-				    HIR::ImplBlock *impl);
-
-  void
-  process_associated_trait_for_candidates (const TraitReference *trait_ref,
-					   HIR::ImplBlock *impl,
-					   bool ignore_mandatory_trait_items);
-
-  void
-  process_predicate_for_candidates (const TyTy::TypeBoundPredicate &predicate,
-				    bool ignore_mandatory_trait_items);
-
-protected:
-  PathProbeType (TyTy::BaseType *receiver, const HIR::PathIdentSegment &query,
-		 DefId specific_trait_id);
-
-  std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>>
-  union_bounds (
-    const std::vector<std::pair</*const*/ TraitReference *, HIR::ImplBlock *>>
-      a,
-    const std::vector<std::pair<const TraitReference *, HIR::ImplBlock *>> b)
-    const;
-
-  bool is_receiver_generic () const;
-
-  TyTy::BaseType *receiver;
-  const HIR::PathIdentSegment &search;
-  std::set<PathProbeCandidate> candidates;
-  HIR::ImplBlock *current_impl;
-  DefId specific_trait_id;
-};
-
 class ReportMultipleCandidateError : private TypeCheckBase
 {
 public:
diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index 9a44fcebc..4c7a796d7 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -25,7 +25,7 @@
 #include "rust-hir-trait-resolve.h"
 #include "rust-rib.h"
 #include "rust-substitution-mapper.h"
-#include "rust-hir-path-probe.h"
+#include "rust-hir-path-probe-expr.h"
 #include "rust-type-util.h"
 #include "rust-hir-type-bounds.h"
 #include "rust-hir-item.h"
@@ -423,13 +423,13 @@ TypeCheckExpr::resolve_segments (NodeId root_resolved_node_id,
       // probe the path is done in two parts one where we search impls if no
       // candidate is found then we search extensions from traits
       auto candidates
-	= PathProbeType::Probe (prev_segment, seg.get_segment (), probe_impls,
+	= PathProbeExpr::Probe (prev_segment, seg.get_segment (), probe_impls,
 				false /*probe_bounds*/,
 				true /*ignore_mandatory_trait_items*/);
       if (candidates.size () == 0)
 	{
 	  candidates
-	    = PathProbeType::Probe (prev_segment, seg.get_segment (), false,
+	    = PathProbeExpr::Probe (prev_segment, seg.get_segment (), false,
 				    true /*probe_bounds*/,
 				    false /*ignore_mandatory_trait_items*/);
 
-- 
2.55.0



More information about the Gcc-rust mailing list