14 const std::vector<TypeExpression*>& term_parameters,
15 const std::vector<std::optional<const Type*>>& term_argument_types)
16 : num_explicit_(explicit_type_arguments.size()),
17 type_parameter_from_name_(type_parameters.size()),
18 inferred_(type_parameters.size()) {
20 Fail(
"more explicit type arguments than expected");
23 if (term_argument_types.size() > term_parameters.size()) {
24 Fail(
"more arguments than expected");
28 for (
size_t i = 0;
i < type_parameters.size();
i++) {
35 for (
size_t i = 0;
i < term_argument_types.
size();
i++) {
36 if (term_argument_types[
i])
37 Match(term_parameters[
i], *term_argument_types[
i]);
41 for (
size_t i = 0;
i < type_parameters.size();
i++) {
43 Fail(
"failed to infer arguments for all type parameters");
54 [](std::optional<const Type*> maybe_type) { return *maybe_type; });
59 const Type* argument_type) {
61 BasicTypeExpression::DynamicCast(parameter)) {
63 if (basic->namespace_qualification.empty() && !basic->is_constexpr) {
66 size_t type_parameter_index =
result->second;
70 std::optional<const Type*>& maybe_inferred =
72 if (maybe_inferred && *maybe_inferred != argument_type) {
73 Fail(
"found conflicting types for generic parameter");
75 inferred_[type_parameter_index] = {argument_type};
81 if (!basic->generic_arguments.empty()) {
93 const Type* argument_type) {
99 if (!specialized_from || specialized_from->generic != generic_type) {
100 return Fail(
"found conflicting generic type constructors");
103 auto& argument_types = specialized_from->specialized_types;
104 if (parameters.size() != argument_types.size()) {
106 "cannot infer types from generic-struct-typed parameter with "
107 "incompatible number of arguments")
111 for (
size_t i = 0;
i < parameters.
size();
i++) {
112 Match(parameters[
i], argument_types[
i]);
static GenericType * LookupUniqueGenericType(const QualifiedName &name)
MessageBuilder & Position(SourcePosition position)
std::unordered_map< std::string, size_t > type_parameter_from_name_
TypeVector GetResult() const
TypeArgumentInference(const GenericParameters &type_parameters, const TypeVector &explicit_type_arguments, const std::vector< TypeExpression * > &term_parameters, const std::vector< std::optional< const Type * > > &term_argument_types)
void Fail(std::string reason)
std::vector< std::optional< const Type * > > inferred_
void MatchGeneric(BasicTypeExpression *parameter, const Type *argument_type)
void Match(TypeExpression *parameter, const Type *argument_type)
const MaybeSpecializationKey & GetSpecializedFrom() const
ZoneVector< RpoNumber > & result
std::vector< GenericParameter > GenericParameters
std::vector< const Type * > TypeVector
MessageBuilder Error(Args &&... args)
std::vector< TypeExpression * > generic_arguments
std::vector< std::string > namespace_qualification