teo-parser 0.3.0

Parser for Teo schema language
Documentation
use crate::availability::Availability;
use crate::ast::literals::EnumVariantLiteral;
use crate::ast::schema::Schema;
use crate::ast::source::Source;
use crate::definition::definition::Definition;
use crate::definition::jump_to_definition_in_argument_list::jump_to_definition_in_argument_list;
use crate::r#type::r#type::Type;
use crate::traits::identifiable::Identifiable;

pub(super) fn jump_to_definition_in_enum_variant_literal<'a>(
    schema: &'a Schema,
    source: &'a Source,
    enum_variant_literal: &'a EnumVariantLiteral,
    namespace_path: &Vec<&'a str>,
    line_col: (usize, usize),
    expect: &Type,
    availability: Availability,
) -> Vec<Definition> {
    if enum_variant_literal.identifier().span.contains_line_col(line_col) {
        match expect {
            Type::EnumVariant(reference) => {
                let r#enum = schema.find_top_by_path(reference.path()).unwrap().as_enum().unwrap();
                if let Some(member) = r#enum.members().find(|m| m.identifier().name() == enum_variant_literal.identifier().name()) {
                    vec![Definition {
                        path: schema.source(member.source_id()).unwrap().file_path.clone(),
                        selection_span: enum_variant_literal.identifier().span,
                        target_span: member.span,
                        identifier_span: member.identifier().span,
                    }]
                } else {
                    vec![]
                }
            }
            Type::SynthesizedEnumReference(reference) => {
                if let Some(reference) = reference.owner.as_model_object() {
                    let model = schema.find_top_by_path(reference.path()).unwrap().as_model().unwrap();
                    if let Some(field) = model.fields().find(|f| f.identifier().name() == enum_variant_literal.identifier().name()) {
                        vec![Definition {
                            path: schema.source(field.source_id()).unwrap().file_path.clone(),
                            selection_span: enum_variant_literal.identifier().span,
                            target_span: field.span,
                            identifier_span: field.identifier().span,
                        }]
                    } else {
                        vec![]
                    }
                } else {
                    vec![]
                }
            }
            _ => vec![]
        }
    } else if let Some(argument_list) = enum_variant_literal.argument_list() {
        if argument_list.span.contains_line_col(line_col) {
            jump_to_definition_in_argument_list(
                schema,
                source,
                argument_list,
                namespace_path,
                None,
                line_col,
                availability,
            )
        } else {
            vec![]
        }
    } else {
        vec![]
    }
}