1use bevy_ecs::prelude::*;
2
3use crate::prelude::*;
4
5mod shapes;
6use completion::{CompletionRequest, SimpleCompletion};
7pub use shapes::*;
8mod typed;
9pub use typed::*;
10mod links;
11pub use links::*;
12pub mod prefix;
13mod prefix_diagnostics;
14pub use prefix_diagnostics::{
15 add_missing_prefix_code_action, prefix_diagnostic_helper, prefix_diagnostics,
16};
17mod prefix_hover;
18pub use prefix_hover::{
19 get_current_prefix, goto_prefix, hover_prefix, PrefixComponent,
20};
21mod namespace_properties;
22pub use namespace_properties::{
23 unknown_property_code_action, validate_namespace_properties, ALLOW_PROPERTY_COMMAND,
24};
25use crate::lsp_types::CompletionItemKind;
26mod properties;
27pub use properties::{
28 complete_class, complete_properties, derive_ontologies, hover_class, hover_excluded_property,
29 hover_property,
30 DefinedClass, DefinedClasses, DefinedProperties, DefinedProperty,
31};
32mod lov;
33pub use lov::{
34 check_added_ontology_extract, fetch_lov_properties, init_ontology_extractor, open_imports,
35 populate_known_ontologies, FromPrefix, OntologyExtractor, PrefixEntry,
36};
37use tracing::instrument;
38
39pub fn spawn_or_insert(
40 url: crate::lsp_types::Url,
41 bundle: impl Bundle,
42 language_id: Option<String>,
43 extra: impl Bundle,
44) -> impl (FnOnce(&mut World) -> Entity) + 'static + Send + Sync {
45 move |world: &mut World| {
46 let out = if let Some(entity) = world
47 .query::<(Entity, &Label)>()
48 .iter(&world)
49 .find(|x| x.1 .0 == url)
50 .map(|x| x.0)
51 {
52 world.entity_mut(entity).insert(bundle).insert(extra);
53 entity
54 } else {
55 let entity = world.spawn(bundle).insert(extra).id();
56 world.trigger(CreateEvent {
57 url,
58 language_id,
59 entity,
60 });
61 entity
62 };
63
64 world.flush();
65 world.run_schedule(ParseLabel);
66 out
67 }
68}
69
70pub fn handle_tasks(mut commands: Commands, mut receiver: ResMut<CommandReceiver>) {
71 while let Ok(Some(mut com)) = receiver.0.try_next() {
72 commands.append(&mut com);
73 }
74}
75
76#[instrument(skip(query, config))]
77pub fn keyword_complete(
78 mut query: Query<(
79 Option<&TokenComponent>,
80 &PositionComponent,
81 &DynLang,
82 &mut CompletionRequest,
83 )>,
84 config: Res<ServerConfig>,
85) {
86 if config.config.local.is_disabled(Disabled::CompletionKeyword) {
87 return;
88 }
89 tracing::debug!("Keyword complete!");
90 for (m_token, position, helper, mut req) in &mut query {
91 let range = if let Some(ct) = m_token {
92 ct.range
93 } else {
94 crate::lsp_types::Range {
95 start: position.0,
96 end: position.0,
97 }
98 };
99
100 for kwd in helper.keyword() {
101 let completion = SimpleCompletion::new(
102 CompletionItemKind::KEYWORD,
103 kwd.to_string(),
104 crate::lsp_types::TextEdit {
105 range: range.clone(),
106 new_text: kwd.to_string(),
107 },
108 );
109 req.push(completion);
110 }
111 }
112}