teo_parser/resolver/
resolve_generics.rs1use 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}