Skip to main content

shuck_server/
session.rs

1#![allow(dead_code)]
2
3use std::path::Path;
4use std::sync::Arc;
5
6use lsp_types::{ClientCapabilities, FileEvent, Url};
7
8use crate::edit::{DocumentKey, DocumentVersion};
9use crate::session::request_queue::RequestQueue;
10use crate::session::settings::{ClientSettings, GlobalClientSettings, ShuckSettings};
11use crate::workspace::Workspaces;
12use crate::{PositionEncoding, TextDocument};
13
14pub(crate) use self::capabilities::ResolvedClientCapabilities;
15pub use self::index::DocumentQuery;
16pub use self::options::ClientOptions;
17pub(crate) use self::options::{AllOptions, WorkspaceOptionsMap};
18pub use client::Client;
19
20mod capabilities;
21mod client;
22mod index;
23mod options;
24mod request_queue;
25mod settings;
26
27pub struct Session {
28    index: index::Index,
29    position_encoding: PositionEncoding,
30    global_settings: GlobalClientSettings,
31    resolved_client_capabilities: Arc<ResolvedClientCapabilities>,
32    request_queue: RequestQueue,
33    shutdown_requested: bool,
34}
35
36pub struct DocumentSnapshot {
37    resolved_client_capabilities: Arc<ResolvedClientCapabilities>,
38    client_settings: Arc<ClientSettings>,
39    document_ref: index::DocumentQuery,
40    position_encoding: PositionEncoding,
41}
42
43impl Session {
44    pub fn new(
45        client_capabilities: &ClientCapabilities,
46        position_encoding: PositionEncoding,
47        global: GlobalClientSettings,
48        workspaces: &Workspaces,
49        client: &Client,
50    ) -> crate::Result<Self> {
51        Ok(Self {
52            index: index::Index::new(workspaces, &global, client)?,
53            position_encoding,
54            global_settings: global,
55            resolved_client_capabilities: Arc::new(ResolvedClientCapabilities::new(
56                client_capabilities,
57            )),
58            request_queue: RequestQueue::new(),
59            shutdown_requested: false,
60        })
61    }
62
63    pub(crate) fn request_queue(&self) -> &RequestQueue {
64        &self.request_queue
65    }
66
67    pub(crate) fn request_queue_mut(&mut self) -> &mut RequestQueue {
68        &mut self.request_queue
69    }
70
71    pub(crate) fn is_shutdown_requested(&self) -> bool {
72        self.shutdown_requested
73    }
74
75    pub(crate) fn set_shutdown_requested(&mut self, requested: bool) {
76        self.shutdown_requested = requested;
77    }
78
79    pub fn key_from_url(&self, url: Url) -> DocumentKey {
80        self.index.key_from_url(url)
81    }
82
83    pub fn take_snapshot(&self, url: Url) -> Option<DocumentSnapshot> {
84        let key = self.key_from_url(url);
85        Some(DocumentSnapshot {
86            resolved_client_capabilities: self.resolved_client_capabilities.clone(),
87            client_settings: self
88                .index
89                .client_settings(&key)
90                .unwrap_or_else(|| self.global_settings.to_settings_arc()),
91            document_ref: self.index.make_document_ref(key)?,
92            position_encoding: self.position_encoding,
93        })
94    }
95
96    pub(crate) fn update_text_document(
97        &mut self,
98        key: &DocumentKey,
99        content_changes: Vec<lsp_types::TextDocumentContentChangeEvent>,
100        new_version: DocumentVersion,
101    ) -> crate::Result<()> {
102        self.index
103            .update_text_document(key, content_changes, new_version, self.encoding())
104    }
105
106    pub(crate) fn open_text_document(&mut self, url: Url, document: TextDocument) {
107        self.index.open_text_document(url, document);
108    }
109
110    pub(crate) fn close_document(&mut self, key: &DocumentKey) -> crate::Result<()> {
111        self.index.close_document(key)
112    }
113
114    pub(crate) fn reload_settings(&mut self, changes: &[FileEvent], client: &Client) {
115        self.index.reload_settings(changes, client);
116    }
117
118    pub(crate) fn open_workspace_folder(&mut self, url: Url, client: &Client) -> crate::Result<()> {
119        self.index
120            .open_workspace_folder(url, &self.global_settings, client)
121    }
122
123    pub(crate) fn close_workspace_folder(&mut self, url: &Url) -> crate::Result<()> {
124        self.index.close_workspace_folder(url)
125    }
126
127    pub(crate) fn resolved_client_capabilities(&self) -> &ResolvedClientCapabilities {
128        &self.resolved_client_capabilities
129    }
130
131    pub(crate) fn encoding(&self) -> PositionEncoding {
132        self.position_encoding
133    }
134
135    pub(crate) fn config_file_paths(&self) -> impl Iterator<Item = &Path> {
136        self.index.config_file_paths()
137    }
138}
139
140impl DocumentSnapshot {
141    pub(crate) fn resolved_client_capabilities(&self) -> &ResolvedClientCapabilities {
142        &self.resolved_client_capabilities
143    }
144
145    pub(crate) fn client_settings(&self) -> &ClientSettings {
146        &self.client_settings
147    }
148
149    pub(crate) fn shuck_settings(&self) -> &ShuckSettings {
150        self.document_ref.settings()
151    }
152
153    pub fn query(&self) -> &index::DocumentQuery {
154        &self.document_ref
155    }
156
157    pub(crate) fn encoding(&self) -> PositionEncoding {
158        self.position_encoding
159    }
160}