// Copyright (C) 2020-2024 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 // . #include "rust-hir-path.h" #include "optional.h" #include "rust-hir-bound.h" namespace Rust { namespace HIR { GenericArgsBinding::GenericArgsBinding (Identifier ident, std::unique_ptr type_ptr, location_t locus) : identifier (std::move (ident)), type (std::move (type_ptr)), locus (locus) {} GenericArgsBinding::GenericArgsBinding (GenericArgsBinding const &other) : identifier (other.identifier), type (other.type->clone_type ()), locus (other.locus) {} GenericArgsBinding & GenericArgsBinding::operator= (GenericArgsBinding const &other) { identifier = other.identifier; type = other.type->clone_type (); locus = other.locus; return *this; } ConstGenericArg::ConstGenericArg (std::unique_ptr expression, location_t locus) : expression (std::move (expression)), locus (locus) {} ConstGenericArg::ConstGenericArg (const ConstGenericArg &other) : locus (other.locus) { expression = other.expression->clone_expr (); } ConstGenericArg ConstGenericArg::operator= (const ConstGenericArg &other) { expression = other.expression->clone_expr (); locus = other.locus; return *this; } GenericArgs & GenericArgs::operator= (GenericArgs const &other) { lifetime_args = other.lifetime_args; binding_args = other.binding_args; const_args = other.const_args; locus = other.locus; type_args.clear (); type_args.reserve (other.type_args.size ()); for (const auto &e : other.type_args) type_args.push_back (e->clone_type ()); return *this; } GenericArgs::GenericArgs (std::vector lifetime_args, std::vector > type_args, std::vector binding_args, std::vector const_args, location_t locus) : lifetime_args (std::move (lifetime_args)), type_args (std::move (type_args)), binding_args (std::move (binding_args)), const_args (std::move (const_args)), locus (locus) {} GenericArgs::GenericArgs (GenericArgs const &other) : lifetime_args (other.lifetime_args), binding_args (other.binding_args), const_args (other.const_args), locus (other.locus) { type_args.clear (); type_args.reserve (other.type_args.size ()); for (const auto &e : other.type_args) type_args.push_back (e->clone_type ()); } bool GenericArgs::is_empty () const { return lifetime_args.size () == 0 && type_args.size () == 0 && binding_args.size () == 0; } PathExprSegment::PathExprSegment (Analysis::NodeMapping mappings, PathIdentSegment segment_name, location_t locus, GenericArgs generic_args) : mappings (std::move (mappings)), segment_name (std::move (segment_name)), generic_args (std::move (generic_args)), locus (locus) {} PathExprSegment::PathExprSegment (PathExprSegment const &other) : mappings (other.mappings), segment_name (other.segment_name), generic_args (other.generic_args), locus (other.locus) {} PathExprSegment & PathExprSegment::operator= (PathExprSegment const &other) { mappings = other.mappings; segment_name = other.segment_name; generic_args = other.generic_args; locus = other.locus; return *this; } void PathPattern::iterate_path_segments (std::function cb) { rust_assert (kind == Kind::Segmented); for (auto it = segments.begin (); it != segments.end (); it++) { if (!cb (*it)) return; } } PathInExpression::PathInExpression (Analysis::NodeMapping mappings, std::vector path_segments, location_t locus, bool has_opening_scope_resolution, std::vector outer_attrs) : PathPattern (std::move (path_segments)), PathExpr (std::move (mappings), std::move (outer_attrs)), has_opening_scope_resolution (has_opening_scope_resolution), locus (locus) {} PathInExpression::PathInExpression (Analysis::NodeMapping mappings, LangItem::Kind lang_item, location_t locus, bool has_opening_scope_resolution, std::vector outer_attrs) : PathPattern (lang_item), PathExpr (std::move (mappings), std::move (outer_attrs)), has_opening_scope_resolution (has_opening_scope_resolution), locus (locus) {} bool PathInExpression::is_self () const { if (!is_single_segment ()) return false; return get_final_segment ().get_segment ().as_string ().compare ("self") == 0; } TypePathSegment::TypePathSegment (Analysis::NodeMapping mappings, PathIdentSegment ident_segment, bool has_separating_scope_resolution, location_t locus) : mappings (std::move (mappings)), ident_segment (std::move (ident_segment)), lang_item (tl::nullopt), locus (locus), has_separating_scope_resolution (has_separating_scope_resolution), type (SegmentType::REG) {} TypePathSegment::TypePathSegment (Analysis::NodeMapping mappings, LangItem::Kind lang_item, location_t locus) : mappings (std::move (mappings)), ident_segment (tl::nullopt), lang_item (lang_item), locus (locus), has_separating_scope_resolution (false), type (SegmentType::REG) {} TypePathSegment::TypePathSegment (Analysis::NodeMapping mappings, std::string segment_name, bool has_separating_scope_resolution, location_t locus) : mappings (std::move (mappings)), ident_segment (PathIdentSegment (std::move (segment_name))), lang_item (tl::nullopt), locus (locus), has_separating_scope_resolution (has_separating_scope_resolution), type (SegmentType::REG) {} TypePathSegmentGeneric::TypePathSegmentGeneric ( Analysis::NodeMapping mappings, PathIdentSegment ident_segment, bool has_separating_scope_resolution, GenericArgs generic_args, location_t locus) : TypePathSegment (std::move (mappings), std::move (ident_segment), has_separating_scope_resolution, locus), generic_args (std::move (generic_args)) {} TypePathSegmentGeneric::TypePathSegmentGeneric (Analysis::NodeMapping mappings, LangItem::Kind lang_item, GenericArgs generic_args, location_t locus) : TypePathSegment (std::move (mappings), lang_item, locus), generic_args (std::move (generic_args)) {} TypePathSegmentGeneric::TypePathSegmentGeneric ( Analysis::NodeMapping mappings, std::string segment_name, bool has_separating_scope_resolution, std::vector lifetime_args, std::vector > type_args, std::vector binding_args, std::vector const_args, location_t locus) : TypePathSegment (std::move (mappings), std::move (segment_name), has_separating_scope_resolution, locus), generic_args (GenericArgs (std::move (lifetime_args), std::move (type_args), std::move (binding_args), std::move (const_args), locus)) {} TypePathFunction::TypePathFunction (std::vector > inputs, std::unique_ptr type) : inputs (std::move (inputs)), return_type (std::move (type)) {} TypePathFunction::TypePathFunction (TypePathFunction const &other) { return_type = other.has_return_type () ? other.get_return_type ().clone_type () : nullptr; inputs.reserve (other.inputs.size ()); for (const auto &e : other.inputs) inputs.push_back (e->clone_type ()); } TypePathFunction & TypePathFunction::operator= (TypePathFunction const &other) { return_type = other.has_return_type () ? other.get_return_type ().clone_type () : nullptr; inputs.reserve (other.inputs.size ()); for (const auto &e : other.inputs) inputs.push_back (e->clone_type ()); return *this; } TypePathSegmentFunction::TypePathSegmentFunction ( Analysis::NodeMapping mappings, PathIdentSegment ident_segment, bool has_separating_scope_resolution, TypePathFunction function_path, location_t locus) : TypePathSegment (std::move (mappings), std::move (ident_segment), has_separating_scope_resolution, locus), function_path (std::move (function_path)) {} TypePathSegmentFunction::TypePathSegmentFunction ( Analysis::NodeMapping mappings, std::string segment_name, bool has_separating_scope_resolution, TypePathFunction function_path, location_t locus) : TypePathSegment (std::move (mappings), std::move (segment_name), has_separating_scope_resolution, locus), function_path (std::move (function_path)) {} TypePath::TypePath (Analysis::NodeMapping mappings, std::vector > segments, location_t locus, bool has_opening_scope_resolution) : TypeNoBounds (mappings, locus), has_opening_scope_resolution (has_opening_scope_resolution), segments (std::move (segments)) {} TypePath::TypePath (TypePath const &other) : TypeNoBounds (other.mappings, other.locus), has_opening_scope_resolution (other.has_opening_scope_resolution) { segments.reserve (other.segments.size ()); for (const auto &e : other.segments) segments.push_back (e->clone_type_path_segment ()); } TypePath & TypePath::operator= (TypePath const &other) { has_opening_scope_resolution = other.has_opening_scope_resolution; locus = other.locus; mappings = other.mappings; segments.reserve (other.segments.size ()); for (const auto &e : other.segments) segments.push_back (e->clone_type_path_segment ()); return *this; } QualifiedPathType::QualifiedPathType (Analysis::NodeMapping mappings, std::unique_ptr type, std::unique_ptr trait, location_t locus) : type (std::move (type)), trait (std::move (trait)), locus (locus), mappings (mappings) {} QualifiedPathType::QualifiedPathType (QualifiedPathType const &other) : type (other.type->clone_type ()), trait (other.has_as_clause () ? std::unique_ptr (new HIR::TypePath (*other.trait)) : nullptr), locus (other.locus), mappings (other.mappings) {} QualifiedPathType & QualifiedPathType::operator= (QualifiedPathType const &other) { type = other.type->clone_type (); locus = other.locus; mappings = other.mappings; trait = other.has_as_clause () ? std::unique_ptr (new HIR::TypePath (*other.trait)) : nullptr; return *this; } bool QualifiedPathType::trait_has_generic_args () const { rust_assert (has_as_clause ()); bool is_generic_seg = trait->get_final_segment ().get_type () == TypePathSegment::SegmentType::GENERIC; if (!is_generic_seg) return false; auto &seg = static_cast (trait->get_final_segment ()); return seg.has_generic_args (); } GenericArgs & QualifiedPathType::get_trait_generic_args () { rust_assert (trait_has_generic_args ()); auto &seg = static_cast (trait->get_final_segment ()); return seg.get_generic_args (); } QualifiedPathInExpression::QualifiedPathInExpression ( Analysis::NodeMapping mappings, QualifiedPathType qual_path_type, std::vector path_segments, location_t locus, std::vector outer_attrs) : PathPattern (std::move (path_segments)), PathExpr (std::move (mappings), std::move (outer_attrs)), path_type (std::move (qual_path_type)), locus (locus) {} QualifiedPathInExpression::QualifiedPathInExpression ( Analysis::NodeMapping mappings, QualifiedPathType qual_path_type, LangItem::Kind lang_item, location_t locus, std::vector outer_attrs) : PathPattern (lang_item), PathExpr (std::move (mappings), std::move (outer_attrs)), path_type (std::move (qual_path_type)), locus (locus) {} QualifiedPathInType::QualifiedPathInType ( Analysis::NodeMapping mappings, QualifiedPathType qual_path_type, std::unique_ptr associated_segment, std::vector > path_segments, location_t locus) : TypeNoBounds (mappings, locus), path_type (std::move (qual_path_type)), associated_segment (std::move (associated_segment)), segments (std::move (path_segments)) {} QualifiedPathInType::QualifiedPathInType (QualifiedPathInType const &other) : TypeNoBounds (other.mappings, other.locus), path_type (other.path_type) { auto seg = other.associated_segment->clone_type_path_segment_impl (); associated_segment = std::unique_ptr (seg); segments.reserve (other.segments.size ()); for (const auto &e : other.segments) segments.push_back (e->clone_type_path_segment ()); } QualifiedPathInType & QualifiedPathInType::operator= (QualifiedPathInType const &other) { auto seg = other.associated_segment->clone_type_path_segment_impl (); associated_segment = std::unique_ptr (seg); path_type = other.path_type; locus = other.locus; mappings = other.mappings; segments.reserve (other.segments.size ()); for (const auto &e : other.segments) segments.push_back (e->clone_type_path_segment ()); return *this; } } // namespace HIR } // namespace Rust