use crate::ast::node::Node;
use crate::availability::Availability;
use crate::ast::pipeline::Pipeline;
use crate::ast::schema::Schema;
use crate::ast::source::Source;
use crate::ast::unit::Unit;
use crate::definition::definition::Definition;
use crate::definition::jump_to_definition_in_argument_list::jump_to_definition_in_argument_list;
use crate::search::search_pipeline_unit_for_definition::search_pipeline_unit_for_definition;
use crate::traits::identifiable::Identifiable;
pub(super) fn jump_to_definition_in_pipeline<'a>(
schema: &'a Schema,
source: &'a Source,
pipeline: &'a Pipeline,
namespace_path: &Vec<&'a str>,
line_col: (usize, usize),
availability: Availability,
) -> Vec<Definition> {
if pipeline.unit().span.contains_line_col(line_col) {
jump_to_definition_in_pipeline_unit(
schema,
source,
pipeline.unit(),
namespace_path,
line_col,
availability
)
} else {
vec![]
}
}
pub(super) fn jump_to_definition_in_pipeline_unit<'a>(
schema: &'a Schema,
source: &'a Source,
unit: &'a Unit,
namespace_path: &Vec<&'a str>,
line_col: (usize, usize),
availability: Availability,
) -> Vec<Definition> {
search_pipeline_unit_for_definition(
schema,
source,
unit,
namespace_path,
line_col,
|argument_list, path| {
jump_to_definition_in_argument_list(
schema,
source,
argument_list,
namespace_path,
Some(path.clone()),
line_col,
availability
)
},
|span ,path| {
let top = schema.find_top_by_path(path).unwrap();
match top {
Node::Namespace(namespace) => vec![Definition {
path: schema.source(namespace.source_id()).unwrap().file_path.clone(),
selection_span: span,
target_span: namespace.span,
identifier_span: namespace.identifier().span,
}],
Node::PipelineItemDeclaration(pipeline_item_declaration) => vec![Definition {
path: schema.source(pipeline_item_declaration.source_id()).unwrap().file_path.clone(),
selection_span: span,
target_span: pipeline_item_declaration.span,
identifier_span: pipeline_item_declaration.identifier().span,
}],
_ => unreachable!(),
}
},
vec![],
availability
)
}