lsp_core/systems/
mod.rs

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