teo_parser/resolver/
resolve_generics.rs

1use itertools::Itertools;
2use maplit::btreemap;
3use crate::availability::Availability;
4use crate::ast::generics::{GenericsConstraint, GenericsDeclaration};
5use crate::resolver::resolve_type_expr::resolve_type_expr;
6use crate::resolver::resolver_context::ResolverContext;
7
8pub(super) fn resolve_generics_declaration<'a>(
9    generics_declaration: &'a GenericsDeclaration,
10    existing_generics_declarations: &Vec<&'a GenericsDeclaration>,
11    context: &'a ResolverContext<'a>
12) {
13    generics_declaration.identifiers().duplicates_by(|i| i.name()).for_each(|i| {
14        context.insert_diagnostics_error(i.span, "duplicated generics identifier")
15    });
16    for identifier in generics_declaration.identifiers() {
17        for g in existing_generics_declarations {
18            if g.identifiers().find(|i| i.name() == identifier.name()).is_some() {
19                context.insert_diagnostics_error(identifier.span, "duplicated generics identifier")
20            }
21        }
22    }
23}
24
25pub(super) fn resolve_generics_constraint<'a>(
26    generics_constraint: &'a GenericsConstraint,
27    context: &'a ResolverContext<'a>,
28    generics_declaration: &'a GenericsDeclaration,
29    availability: Availability,
30) {
31    generics_constraint.items().duplicates_by(|i| i.identifier().name()).for_each(|i| {
32        context.insert_diagnostics_error(i.span, "duplicated generics constraint")
33    });
34    for item in generics_constraint.items() {
35        if generics_declaration.identifiers().find(|i| i.name() == item.identifier().name()).is_none() {
36            context.insert_diagnostics_error(item.identifier().span, "undefined generics identifier")
37        }
38        resolve_type_expr(
39            item.type_expr(),
40            &vec![generics_declaration],
41            &vec![],
42            &btreemap! {},
43            context,
44            availability,
45        );
46    }
47}