teo-parser 0.3.0

Parser for Teo schema language
Documentation
use std::sync::Arc;
use crate::availability::Availability;
use crate::ast::decorator::Decorator;
use crate::ast::node::Node;
use crate::ast::reference_space::ReferenceSpace;
use crate::ast::schema::Schema;
use crate::ast::source::Source;
use crate::completion::collect_argument_list_names::collect_argument_list_names_from_decorator_declaration;
use crate::completion::completion_item::CompletionItem;
use crate::completion::find_completion_in_argument_list::find_completion_in_argument_list;
use crate::completion::find_top_completion_with_filter::find_top_completion_with_filter;
use crate::traits::node_trait::NodeTrait;
use crate::traits::resolved::Resolve;
use crate::utils::top_filter::top_filter_for_reference_type;

pub(super) fn find_completion_in_decorator<'a>(
    schema: &'a Schema,
    source: &'a Source,
    decorator: &'a Decorator,
    namespace_path: &Vec<&'a str>,
    line_col: (usize, usize),
    reference_type: ReferenceSpace,
    availability: Availability,
) -> Vec<CompletionItem> {
    find_completion_in_decorator_with_filter(schema, source, decorator, namespace_path, line_col, &top_filter_for_reference_type(reference_type), availability)
}

pub(super) fn find_completion_in_decorator_with_filter<'a>(
    schema: &'a Schema,
    source: &'a Source,
    decorator: &'a Decorator,
    namespace_path: &Vec<&'a str>,
    line_col: (usize, usize),
    filter: &Arc<dyn Fn(&Node) -> bool>,
    availability: Availability,
) -> Vec<CompletionItem> {
    if let Some(argument_list) = decorator.argument_list() {
        if argument_list.span().contains_line_col(line_col) {
            let names = if decorator.is_resolved() {
                collect_argument_list_names_from_decorator_declaration(schema.find_top_by_path(&decorator.resolved()).unwrap().as_decorator_declaration().unwrap())
            } else {
                vec![]
            };
            return find_completion_in_argument_list(schema, source, argument_list, line_col, namespace_path, availability, names);
        }
    }
    let mut user_typed_spaces = vec![];
    for identifier in decorator.identifier_path().identifiers() {
        if identifier.span.contains_line_col(line_col) {
            break
        } else {
            user_typed_spaces.push(identifier.name());
        }
    }
    find_top_completion_with_filter(schema, source, namespace_path, &user_typed_spaces, filter, availability)
}

pub(super) fn find_completion_in_empty_decorator<'a>(
    schema: &'a Schema,
    source: &'a Source,
    namespace_path: &Vec<&'a str>,
    reference_type: ReferenceSpace,
    availability: Availability,
) -> Vec<CompletionItem> {
    find_top_completion_with_filter(schema, source, namespace_path, &vec![], &top_filter_for_reference_type(reference_type), availability)
}