Skip to main content

swls_core/systems/
mod.rs

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}