use crate::analysis::DesignRoot;
use crate::ast::{AttributeDesignator, Designator};
use crate::completion::attributes::completions_for_attribute_name;
use crate::completion::generic::generic_completions;
use crate::completion::libraries::list_all_libraries;
use crate::completion::map_aspect::completions_for_map_aspect;
use crate::completion::selected::completions_for_selected_name;
use crate::completion::tokenizer::tokenize_input;
use crate::syntax::Kind;
use crate::{EntRef, Position, Source};
mod attributes;
mod entity_instantiation;
mod generic;
mod libraries;
mod map_aspect;
mod region;
mod selected;
mod tokenizer;
#[derive(Debug, PartialEq, Clone)]
pub enum CompletionItem<'a> {
Simple(EntRef<'a>),
Formal(EntRef<'a>),
Overloaded(Designator, usize),
Keyword(Kind),
Work,
Instantiation(EntRef<'a>, Vec<EntRef<'a>>),
Attribute(AttributeDesignator),
}
macro_rules! kind {
($kind: pat) => {
crate::syntax::Token { kind: $kind, .. }
};
}
pub fn list_completion_options<'a>(
root: &'a DesignRoot,
source: &Source,
cursor: Position,
) -> Vec<CompletionItem<'a>> {
use crate::syntax::Kind::*;
let tokens = tokenize_input(root.symbols(), source, cursor);
match &tokens[..] {
[.., kind!(SemiColon)] => vec![],
[.., kind!(Library)]
| [.., kind!(Library), kind!(Identifier)]
| [.., kind!(Use)]
| [.., kind!(Use), kind!(Identifier)] => list_all_libraries(root),
[.., token, kind!(Dot)] | [.., token, kind!(Dot), kind!(Identifier)] => {
if let Some((_, ent)) = root.item_at_cursor(source, token.pos.start()) {
completions_for_selected_name(root, ent)
} else {
vec![]
}
}
[.., token, kind!(Tick)] | [.., token, kind!(Tick), kind!(Identifier)] => {
if let Some((_, ent)) = root.item_at_cursor(source, token.pos.start()) {
completions_for_attribute_name(ent)
} else {
vec![]
}
}
[.., kind!(LeftPar | Comma)] | [.., kind!(LeftPar | Comma), kind!(Identifier)] => {
completions_for_map_aspect(root, cursor, source)
}
[.., kind!(CommAt)] | [.., kind!(CommAt), kind!(Identifier)] => list_all_libraries(root),
_ => generic_completions(root, cursor, source),
}
}