debug_str ().c_str ());
}
+bool
+BaseType::is_concrete () const
+{
+ const TyTy::BaseType *x = destructure ();
+ switch (x->get_kind ())
+ {
+ case PARAM:
+ case PROJECTION:
+ return false;
+
+ // placeholder is a special case for this case when it is not resolvable
+ // it means we its just an empty placeholder associated type which is
+ // concrete
+ case PLACEHOLDER:
+ return true;
+
+ case FNDEF: {
+ const FnType &fn = *static_cast<const FnType *> (x);
+ for (const auto ¶m : fn.get_params ())
+ {
+ const BaseType *p = param.second;
+ if (!p->is_concrete ())
+ return false;
+ }
+ return fn.get_return_type ()->is_concrete ();
+ }
+ break;
+
+ case FNPTR: {
+ const FnPtr &fn = *static_cast<const FnPtr *> (x);
+ for (const auto ¶m : fn.get_params ())
+ {
+ const BaseType *p = param.get_tyty ();
+ if (!p->is_concrete ())
+ return false;
+ }
+ return fn.get_return_type ()->is_concrete ();
+ }
+ break;
+
+ case ADT: {
+ const ADTType &adt = *static_cast<const ADTType *> (x);
+ if (adt.is_unit ())
+ {
+ return !adt.needs_substitution ();
+ }
+
+ for (auto &variant : adt.get_variants ())
+ {
+ bool is_num_variant
+ = variant->get_variant_type () == VariantDef::VariantType::NUM;
+ if (is_num_variant)
+ continue;
+
+ for (auto &field : variant->get_fields ())
+ {
+ const BaseType *field_type = field->get_field_type ();
+ if (!field_type->is_concrete ())
+ return false;
+ }
+ }
+ return true;
+ }
+ break;
+
+ case ARRAY: {
+ const ArrayType &arr = *static_cast<const ArrayType *> (x);
+ return arr.get_element_type ()->is_concrete ();
+ }
+ break;
+
+ case SLICE: {
+ const SliceType &slice = *static_cast<const SliceType *> (x);
+ return slice.get_element_type ()->is_concrete ();
+ }
+ break;
+
+ case POINTER: {
+ const PointerType &ptr = *static_cast<const PointerType *> (x);
+ return ptr.get_base ()->is_concrete ();
+ }
+ break;
+
+ case REF: {
+ const ReferenceType &ref = *static_cast<const ReferenceType *> (x);
+ return ref.get_base ()->is_concrete ();
+ }
+ break;
+
+ case TUPLE: {
+ const TupleType &tuple = *static_cast<const TupleType *> (x);
+ for (size_t i = 0; i < tuple.num_fields (); i++)
+ {
+ if (!tuple.get_field (i)->is_concrete ())
+ return false;
+ }
+ return true;
+ }
+ break;
+
+ case CLOSURE: {
+ const ClosureType &closure = *static_cast<const ClosureType *> (x);
+ if (closure.get_parameters ().is_concrete ())
+ return false;
+ return closure.get_result_type ().is_concrete ();
+ }
+ break;
+
+ case INFER:
+ case BOOL:
+ case CHAR:
+ case INT:
+ case UINT:
+ case FLOAT:
+ case USIZE:
+ case ISIZE:
+ case NEVER:
+ case STR:
+ case DYNAMIC:
+ case ERROR:
+ return true;
+ }
+
+ return false;
+}
+
// InferType
InferType::InferType (HirId ref, InferTypeKind infer_kind, Location locus,
return as_string ();
}
-bool
-InferType::is_concrete () const
-{
- return true;
-}
-
void
InferType::accept_vis (TyVisitor &vis)
{
{
return true;
}
-bool
-ErrorType::is_concrete () const
-{
- return false;
-}
std::string
ErrorType::get_name () const
ty = fty;
}
-bool
-StructFieldType::is_concrete () const
-{
- return ty->is_concrete ();
-}
-
void
StructFieldType::debug () const
{
return identifier + subst_as_string () + "{" + variants_buffer + "}";
}
-bool
-ADTType::is_concrete () const
-{
- if (is_unit ())
- {
- return !needs_substitution ();
- }
-
- for (auto &variant : variants)
- {
- bool is_num_variant
- = variant->get_variant_type () == VariantDef::VariantType::NUM;
- if (is_num_variant)
- continue;
-
- for (auto &field : variant->get_fields ())
- {
- if (!field->is_concrete ())
- return false;
- }
- }
- return true;
-}
-
bool
ADTType::can_eq (const BaseType *other, bool emit_errors) const
{
return fields.size ();
}
-bool
-TupleType::is_concrete () const
-{
- for (size_t i = 0; i < num_fields (); i++)
- {
- if (!get_field (i)->is_concrete ())
- return false;
- }
- return true;
-}
-
const std::vector<TyVar> &
TupleType::get_fields () const
{
return as_string ();
}
-bool
-BoolType::is_concrete () const
-{
- return true;
-}
-
void
BoolType::accept_vis (TyVisitor &vis)
{
return get_int_kind () == o.get_int_kind ();
}
-bool
-IntType::is_concrete () const
-{
- return true;
-}
-
// UintType
UintType::UintType (HirId ref, UintKind kind, std::set<HirId> refs)
return get_uint_kind () == o.get_uint_kind ();
}
-bool
-UintType::is_concrete () const
-{
- return true;
-}
-
// FloatType
FloatType::FloatType (HirId ref, FloatKind kind, std::set<HirId> refs)
return float_kind;
}
-bool
-FloatType::is_concrete () const
-{
- return true;
-}
-
void
FloatType::accept_vis (TyVisitor &vis)
{
return as_string ();
}
-bool
-USizeType::is_concrete () const
-{
- return true;
-}
-
void
USizeType::accept_vis (TyVisitor &vis)
{
return as_string ();
}
-bool
-ISizeType::is_concrete () const
-{
- return true;
-}
-
void
ISizeType::accept_vis (TyVisitor &vis)
{
refs)
{}
-bool
-CharType::is_concrete () const
-{
- return true;
-}
-
std::string
CharType::get_name () const
{
base (base), mut (mut)
{}
-bool
-ReferenceType::is_concrete () const
-{
- return get_base ()->is_concrete ();
-}
-
Mutability
ReferenceType::mutability () const
{
base (base), mut (mut)
{}
-bool
-PointerType::is_concrete () const
-{
- return get_base ()->is_concrete ();
-}
-
Mutability
PointerType::mutability () const
{
return get_ref () != get_ty_ref ();
}
-bool
-ParamType::is_concrete () const
-{
- auto r = resolve ();
- if (r == this)
- return false;
-
- return r->is_concrete ();
-}
-
void
ParamType::accept_vis (TyVisitor &vis)
{
return as_string ();
}
-bool
-StrType::is_concrete () const
-{
- return true;
-}
-
BaseType *
StrType::clone () const
{
return true;
}
-bool
-NeverType::is_concrete () const
-{
- return true;
-}
-
void
NeverType::accept_vis (TyVisitor &vis)
{
return symbol;
}
-bool
-PlaceholderType::is_concrete () const
-{
- if (!can_resolve ())
- return true;
-
- return resolve ()->is_concrete ();
-}
-
void
PlaceholderType::accept_vis (TyVisitor &vis)
{
return base;
}
-bool
-ProjectionType::is_concrete () const
-{
- return base->is_concrete ();
-}
-
void
ProjectionType::accept_vis (TyVisitor &vis)
{
: BaseType (ref, ty_ref, TypeKind::DYNAMIC, ident, specified_bounds, refs)
{}
-bool
-DynamicObjectType::is_concrete () const
-{
- return true;
-}
-
void
DynamicObjectType::accept_vis (TyVisitor &vis)
{
virtual bool is_unit () const;
- virtual bool is_concrete () const = 0;
+ bool is_concrete () const;
TypeKind get_kind () const;
bool default_type (BaseType **type) const;
- bool is_concrete () const final override;
-
private:
InferTypeKind infer_kind;
};
BaseType *monomorphized_clone () const final override;
std::string get_name () const override final;
-
- bool is_concrete () const final override;
};
class ParamType : public BaseType
bool is_equal (const BaseType &other) const override;
- bool is_concrete () const override final;
-
ParamType *handle_substitions (SubstitutionArgumentMappings &mappings);
void set_implicit_self_trait ();
StructFieldType *clone () const;
StructFieldType *monomorphized_clone () const;
- bool is_concrete () const;
-
void debug () const;
Location get_locus () const;
std::string as_string () const;
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
-
const std::vector<TyVar> &get_fields () const;
std::string get_name () const override final;
return identifier + subst_as_string ();
}
- bool is_concrete () const override final;
-
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
return param_at (0).second;
}
- bool is_concrete () const override final
- {
- for (const auto ¶m : params)
- {
- const BaseType *p = param.second;
- if (!p->is_concrete ())
- return false;
- }
- return get_return_type ()->is_concrete ();
- }
-
std::vector<std::pair<HIR::Pattern *, BaseType *>> &get_params ()
{
return params;
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- void iterate_params (std::function<bool (BaseType *)> cb) const
- {
- for (auto &p : params)
- {
- if (!cb (p.get_tyty ()))
- return;
- }
- }
-
std::vector<TyVar> &get_params () { return params; }
const std::vector<TyVar> &get_params () const { return params; }
- bool is_concrete () const override final
- {
- for (auto &p : params)
- {
- if (!p.get_tyty ()->is_concrete ())
- return false;
- }
- return result_type.get_tyty ()->is_concrete ();
- }
-
private:
std::vector<TyVar> params;
TyVar result_type;
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final
- {
- return parameters->is_concrete ()
- && result_type.get_tyty ()->is_concrete ();
- }
-
bool needs_generic_substitutions () const override final
{
return needs_substitution ();
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const final override
- {
- return get_element_type ()->is_concrete ();
- }
-
HIR::Expr &get_capacity_expr () const { return capacity_expr; }
ArrayType *handle_substitions (SubstitutionArgumentMappings &mappings);
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const final override
- {
- return get_element_type ()->is_concrete ();
- }
-
SliceType *handle_substitions (SubstitutionArgumentMappings &mappings);
private:
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
};
class IntType : public BaseType
BaseType *monomorphized_clone () const final override;
bool is_equal (const BaseType &other) const override;
- bool is_concrete () const override final;
private:
IntKind int_kind;
BaseType *monomorphized_clone () const final override;
bool is_equal (const BaseType &other) const override;
- bool is_concrete () const override final;
private:
UintKind uint_kind;
BaseType *monomorphized_clone () const final override;
bool is_equal (const BaseType &other) const override;
- bool is_concrete () const override final;
private:
FloatKind float_kind;
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
};
class ISizeType : public BaseType
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
};
class CharType : public BaseType
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
};
class StrType : public BaseType
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
};
class ReferenceType : public BaseType
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
-
ReferenceType *handle_substitions (SubstitutionArgumentMappings &mappings);
Mutability mutability () const;
BaseType *clone () const final override;
BaseType *monomorphized_clone () const final override;
- bool is_concrete () const override final;
-
PointerType *handle_substitions (SubstitutionArgumentMappings &mappings);
Mutability mutability () const;
std::string get_name () const override final;
bool is_unit () const override;
- bool is_concrete () const override final;
};
// used at the type in associated types in traits
bool is_equal (const BaseType &other) const override;
- bool is_concrete () const override final;
-
private:
std::string symbol;
};
const BaseType *get () const;
BaseType *get ();
- bool is_concrete () const override final;
-
ProjectionType *
handle_substitions (SubstitutionArgumentMappings &mappings) override final;
std::string get_name () const override final;
- bool is_concrete () const override final;
-
// this returns a flat list of items including super trait bounds
const std::vector<
std::pair<const Resolver::TraitItemReference *, const TypeBoundPredicate *>>