teo-parser 0.3.0

Parser for Teo schema language
Documentation
use itertools::Itertools;
use maplit::btreemap;
use crate::availability::Availability;
use crate::ast::generics::{GenericsConstraint, GenericsDeclaration};
use crate::resolver::resolve_type_expr::resolve_type_expr;
use crate::resolver::resolver_context::ResolverContext;

pub(super) fn resolve_generics_declaration<'a>(
    generics_declaration: &'a GenericsDeclaration,
    existing_generics_declarations: &Vec<&'a GenericsDeclaration>,
    context: &'a ResolverContext<'a>
) {
    generics_declaration.identifiers().duplicates_by(|i| i.name()).for_each(|i| {
        context.insert_diagnostics_error(i.span, "duplicated generics identifier")
    });
    for identifier in generics_declaration.identifiers() {
        for g in existing_generics_declarations {
            if g.identifiers().find(|i| i.name() == identifier.name()).is_some() {
                context.insert_diagnostics_error(identifier.span, "duplicated generics identifier")
            }
        }
    }
}

pub(super) fn resolve_generics_constraint<'a>(
    generics_constraint: &'a GenericsConstraint,
    context: &'a ResolverContext<'a>,
    generics_declaration: &'a GenericsDeclaration,
    availability: Availability,
) {
    generics_constraint.items().duplicates_by(|i| i.identifier().name()).for_each(|i| {
        context.insert_diagnostics_error(i.span, "duplicated generics constraint")
    });
    for item in generics_constraint.items() {
        if generics_declaration.identifiers().find(|i| i.name() == item.identifier().name()).is_none() {
            context.insert_diagnostics_error(item.identifier().span, "undefined generics identifier")
        }
        resolve_type_expr(
            item.type_expr(),
            &vec![generics_declaration],
            &vec![],
            &btreemap! {},
            context,
            availability,
        );
    }
}