teo-parser 0.3.0

Parser for Teo schema language
Documentation
use crate::availability::Availability;
use crate::ast::decorator_declaration::{DecoratorDeclaration, DecoratorDeclarationVariant};
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::resolver_context::ResolverContext;

pub(super) fn resolve_decorator_declaration_references<'a>(decorator_declaration: &'a DecoratorDeclaration, context: &'a ResolverContext<'a>) {
    if let Some(generics_declaration) = decorator_declaration.generics_declaration() {
        resolve_generics_declaration(generics_declaration, &vec![], context);
        if let Some(generics_constraint) = &decorator_declaration.generics_constraint() {
            resolve_generics_constraint(generics_constraint, context, generics_declaration, decorator_declaration.define_availability);
        }
    }
    if let Some(argument_list_declaration) = decorator_declaration.argument_list_declaration() {
        resolve_argument_list_declaration(
            argument_list_declaration,
            &if let Some(generics_declaration) = decorator_declaration.generics_declaration() {
                vec![generics_declaration]
            } else {
                vec![]
            },
            &if let Some(generics_constraint) = decorator_declaration.generics_constraint() {
                vec![generics_constraint]
            } else {
                vec![]
            },
            context,
            decorator_declaration.define_availability
        )
    }
    for variant in decorator_declaration.variants() {
        resolve_decorator_declaration_variant(variant, context, decorator_declaration.define_availability);
    }
}

fn resolve_decorator_declaration_variant<'a>(
    decorator_declaration_variant: &'a DecoratorDeclarationVariant,
    context: &'a ResolverContext<'a>,
    availability: Availability,
) {
    if let Some(generics_declaration) = decorator_declaration_variant.generics_declaration() {
        resolve_generics_declaration(generics_declaration, &vec![], context);
        if let Some(generics_constraint) = decorator_declaration_variant.generics_constraint() {
            resolve_generics_constraint(generics_constraint, context, generics_declaration, availability);
        }
    }
    if let Some(argument_list_declaration) = decorator_declaration_variant.argument_list_declaration() {
        resolve_argument_list_declaration(
            argument_list_declaration,
            &if let Some(generics_declaration) = decorator_declaration_variant.generics_declaration() {
                vec![generics_declaration]
            } else {
                vec![]
            },
            &if let Some(generics_constraint) = decorator_declaration_variant.generics_constraint() {
                vec![generics_constraint]
            } else {
                vec![]
            },
            context,
            availability
        )
    }
}