teo-parser 0.3.0

Parser for Teo schema language
Documentation
use std::collections::BTreeMap;
use crate::ast::function_declaration::FunctionDeclaration;
use crate::ast::generics::{GenericsConstraint, GenericsDeclaration};
use crate::r#type::keyword::Keyword;
use crate::r#type::r#type::Type;
use crate::resolver::resolve_argument_list_declaration::resolve_argument_list_declaration;
use crate::resolver::resolve_generics::{resolve_generics_constraint, resolve_generics_declaration};
use crate::resolver::resolve_type_expr::resolve_type_expr;
use crate::resolver::resolver_context::ResolverContext;

pub(super) fn resolve_function_declaration<'a>(
    function_declaration: &'a FunctionDeclaration,
    struct_generics_declaration: Option<&'a GenericsDeclaration>,
    struct_generics_constraint: Option<&'a GenericsConstraint>,
    keywords_map: &BTreeMap<Keyword, Type>,
    context: &'a ResolverContext<'a>,
) {
    if let Some(generics_declaration) = function_declaration.generics_declaration() {
        resolve_generics_declaration(generics_declaration, &struct_generics_declaration.iter().map(|i| *i).collect(), context);
        if let Some(generics_constraint) = function_declaration.generics_constraint() {
            resolve_generics_constraint(generics_constraint, context, generics_declaration, function_declaration.define_availability);
        }
    }
    let mut generics_declarations = vec![];
    let mut generics_constraints = vec![];
    if let Some(generics_declaration) = struct_generics_declaration {
        generics_declarations.push(generics_declaration);
    }
    if let Some(generics_constraint) = struct_generics_constraint {
        generics_constraints.push(generics_constraint);
    }
    if let Some(generics_declaration) = function_declaration.generics_declaration() {
        generics_declarations.push(generics_declaration);
    }
    if let Some(generics_constraint) = function_declaration.generics_constraint() {
        generics_constraints.push(generics_constraint);
    }
    resolve_argument_list_declaration(
        function_declaration.argument_list_declaration(),
        &generics_declarations,
        &generics_constraints,
        context,
        function_declaration.define_availability,
    );
    resolve_type_expr(
        function_declaration.return_type(),
        &generics_declarations,
        &generics_constraints,
        keywords_map,
        context,
        function_declaration.define_availability,
    );
}