Skip to content

Commit dbb5be0

Browse files
committed
Fixed automatic shutdown not working correctly, and started working on incremental document synchronization between editor -> language server -> project daemon
1 parent 73d1788 commit dbb5be0

File tree

14 files changed

+118
-35
lines changed

14 files changed

+118
-35
lines changed

Cargo.lock

Lines changed: 41 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,5 @@ bincode = { version = "2.0.1", features = ["serde"] }
3838
by_address = "1.2.1"
3939
thiserror = "2.0.17"
4040
pin-project-lite = "0.2"
41+
fluent-uri = "0.4.1"
42+

src/components/daemon/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ ipc_message = { version = "0.1.0", path = "../../representations/ipc_message" }
1616
transport = { version = "0.1.0", path = "../../components/transport" }
1717
serde_json.workspace = true
1818
fingerprint = { version = "0.1.0", path = "../../representations/fingerprint" }
19+
fluent-uri.workspace = true

src/components/daemon/src/serve.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,34 @@
11
use crate::server::Server;
22
use fingerprint::COMPILER_BUILT_AT;
3+
use fluent_uri::Uri;
34
use ipc_message::{
45
GenericRequestId, IpcMessage, IpcMessageId, IpcNotification, IpcRequest, IpcResponse,
56
};
67
use request::{Cache, PfIn, Req, Rt, RtStIn, TimeoutAfterSteps, UnwrapAft, WithErrors};
78
use smol::{
89
io::{self, AsyncWriteExt, BufReader, BufWriter},
10+
lock::Mutex,
911
net::TcpStream,
1012
stream::StreamExt,
1113
};
12-
use std::{num::NonZero, pin::pin};
14+
use std::{collections::HashMap, num::NonZero, pin::pin, sync::Arc};
1315
use transport::{read_message_raw_async, write_message_raw_async};
1416

17+
#[derive(Default)]
18+
pub struct LanguageClient {
19+
pub documents: Mutex<HashMap<Uri<String>, Document>>,
20+
}
21+
22+
#[derive(Clone, Debug)]
23+
pub struct Document {
24+
pub content: String,
25+
}
26+
1527
impl Server {
1628
pub async fn serve(&self, mut stream: TcpStream) -> io::Result<()> {
1729
let idle_tracker = self.idle_tracker.clone();
1830
let stream_writer = stream.clone();
31+
let client = Arc::new(LanguageClient::default());
1932

2033
// Channel for sending requests off to be processed
2134
let (tx_req, rx_req) =
@@ -52,8 +65,6 @@ impl Server {
5265
});
5366
break;
5467
}
55-
IpcRequest::DidChange(ipc_file, text_edits) => todo!(),
56-
IpcRequest::DidSave(ipc_file) => todo!(),
5768
IpcRequest::Completion(text_position) => request::ListSymbols.into(),
5869
IpcRequest::Diagnostics(ipc_file) => todo!(),
5970
};
@@ -75,8 +86,6 @@ impl Server {
7586
match ipc_request {
7687
IpcRequest::Initialize { .. } => unreachable!(),
7788
IpcRequest::Shutdown => unreachable!(),
78-
IpcRequest::DidChange(ipc_file, text_edits) => todo!(),
79-
IpcRequest::DidSave(ipc_file) => todo!(),
8089
IpcRequest::Completion(_text_position) => {
8190
let WithErrors { value: names, .. } = request::ListSymbols::unwrap_aft(aft);
8291

@@ -139,6 +148,15 @@ impl Server {
139148
let writer = pin!(BufWriter::new(&mut stream));
140149
write_message_raw_async(writer, &content).await?;
141150
}
151+
IpcMessage::Notification(_, IpcNotification::DidChange(ipc_file, edits)) => {
152+
todo!("daemon: notif {:?} {:?}", ipc_file, edits)
153+
}
154+
IpcMessage::Notification(_, IpcNotification::DidOpen(..)) => {
155+
todo!("daemon: did open")
156+
}
157+
IpcMessage::Notification(_, IpcNotification::DidSave(..)) => {
158+
todo!("daemon: did save")
159+
}
142160
IpcMessage::Notification(_, IpcNotification::Exit) => {
143161
eprintln!("daemon: Exit requested...");
144162
break;
@@ -155,6 +173,7 @@ impl Server {
155173
eprintln!("daemon: Closing language server connection...");
156174
tx_req.close();
157175
thread.join().unwrap();
176+
eprintln!("daemon: Closed language server connection...");
158177
Ok(())
159178
}
160179
}

src/components/daemon/src/server.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub fn server_main(max_idle_time: Duration) -> io::Result<()> {
4545
smol::spawn(talk_to_client(server.clone(), stream)).detach();
4646
}
4747

48-
if server.idle_tracker.shutting_down() {
48+
if server.idle_tracker.shutdown_if_idle() {
4949
break;
5050
}
5151
}

src/components/daemon/src/watch.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ pub async fn watch<'e, P: Pf, REQ: Into<P::Req<'e>> + Clone + Send + UnwrapAft<'
6363
)
6464
.await;
6565

66-
dbg!(&new_project);
67-
6866
// Determine if the watch config was changed as part of the project config.
6967
let new_watch_config = match new_project {
7068
Ok(BlockOn::Complete(Ok(project))) => {
@@ -122,7 +120,8 @@ pub async fn watch<'e, P: Pf, REQ: Into<P::Req<'e>> + Clone + Send + UnwrapAft<'
122120
Err(())
123121
};
124122

125-
log!("Watch Result is {:?}", run.or(timeout).await);
123+
let result = run.or(timeout).await;
124+
log!("Watch Result is {:?}", result);
126125
Timer::after(Duration::from_millis(watch_config.interval_ms)).await;
127126

128127
if server.idle_tracker.shutdown_if_idle() {

src/components/idle/src/lib.rs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl IdleTracker {
4444
.duration_since(self.shared.started)
4545
.as_millis() as u64;
4646

47-
self.shared.last_active_ms.store(ms, Ordering::Relaxed);
47+
self.shared.last_active_ms.store(ms, Ordering::SeqCst);
4848
}
4949

5050
pub fn set_max_idle_time(&self, new_max_idle_time: Option<Duration>) {
@@ -54,12 +54,12 @@ impl IdleTracker {
5454

5555
self.shared
5656
.max_idle_time_ms
57-
.store(max_idle_time_ms, Ordering::Relaxed)
57+
.store(max_idle_time_ms, Ordering::SeqCst)
5858
}
5959
None => self
6060
.shared
6161
.max_idle_time_ms
62-
.store(self.shared.original_max_idle_time_ms, Ordering::Relaxed),
62+
.store(self.shared.original_max_idle_time_ms, Ordering::SeqCst),
6363
}
6464
}
6565

@@ -68,40 +68,35 @@ impl IdleTracker {
6868
return Err(());
6969
}
7070

71-
self.shared.num_connections.fetch_add(1, Ordering::Relaxed);
71+
self.shared.num_connections.fetch_add(1, Ordering::SeqCst);
7272
self.still_active();
7373
Ok(())
7474
}
7575

7676
pub fn remove_connection(&self) {
77-
self.shared.num_connections.fetch_sub(1, Ordering::Relaxed);
77+
self.shared.num_connections.fetch_sub(1, Ordering::SeqCst);
7878
}
7979

8080
pub fn shutting_down(&self) -> bool {
81-
self.shared.num_connections.load(Ordering::Relaxed) == 0
82-
&& self.shared.should_shutdown.load(Ordering::Relaxed)
81+
self.shared.num_connections.load(Ordering::SeqCst) == 0
82+
&& self.shared.should_shutdown.load(Ordering::SeqCst)
8383
}
8484

8585
pub fn shutdown_if_idle(&self) -> bool {
86-
let no_connections = self.shared.num_connections.load(Ordering::Relaxed) == 0;
86+
let no_connections = self.shared.num_connections.load(Ordering::SeqCst) == 0;
8787

8888
let now = Instant::now()
8989
.duration_since(self.shared.started)
9090
.as_millis() as u64;
9191

92-
let expire_at = self.shared.last_active_ms.load(Ordering::Relaxed)
93-
+ self.shared.max_idle_time_ms.load(Ordering::Relaxed);
94-
95-
dbg!(self.shared.num_connections.load(Ordering::Relaxed));
96-
dbg!(self.shared.last_active_ms.load(Ordering::Relaxed));
97-
dbg!(self.shared.max_idle_time_ms.load(Ordering::Relaxed));
92+
let expire_at = self.shared.last_active_ms.load(Ordering::SeqCst)
93+
+ self.shared.max_idle_time_ms.load(Ordering::SeqCst);
9894

9995
if no_connections && now > expire_at {
100-
dbg!("should shutdown");
101-
self.shared.should_shutdown.store(true, Ordering::Relaxed);
96+
self.shared.should_shutdown.store(true, Ordering::SeqCst);
10297
true
10398
} else {
104-
self.shared.should_shutdown.load(Ordering::Relaxed)
99+
self.shared.should_shutdown.load(Ordering::SeqCst)
105100
}
106101
}
107102
}

src/components/language_server/src/lib.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ pub(crate) use document::*;
99
use fingerprint::COMPILER_BUILT_AT;
1010
use ipc_message::{IpcMessage, IpcMessageId, IpcRequest, IpcResponse};
1111
pub(crate) use log::*;
12-
use lsp_types::{CompletionItem, CompletionList, CompletionResponse, Uri};
12+
use lsp_types::{
13+
CompletionItem, CompletionList, CompletionResponse, DidChangeTextDocumentParams, Uri,
14+
};
1315
use pin_project_lite::pin_project;
1416
use smol::{
1517
io::{AsyncWriteExt, WriteHalf},
@@ -268,10 +270,23 @@ pub async fn start() -> ExitCode {
268270
};
269271
}
270272
Message::Response(_) => (),
271-
Message::Notification(notification) => match notification.method.as_str() {
273+
Message::Notification(notif) => match notif.method.as_str() {
272274
"initialized" => (),
273275
"textDocument/didChange" => {
274-
methods::text_document::did_change(&mut server, notification);
276+
let params =
277+
serde_json::from_value::<DidChangeTextDocumentParams>(notif.params)
278+
.unwrap();
279+
280+
dbg!(params);
281+
282+
/*
283+
notification.params
284+
285+
write_message_raw_async(server.as_mut().project().daemon, &data)
286+
.await
287+
.unwrap();
288+
server.as_mut().project().daemon.flush().await.unwrap();
289+
*/
275290
}
276291
"exit" => {
277292
return if server.did_shutdown {

src/components/language_server/src/methods/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ pub fn initialize() -> <Initialize as LspRequest>::Result {
1818
work_done_progress_options: WorkDoneProgressOptions::default(),
1919
completion_item: None,
2020
}),
21-
text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)),
21+
text_document_sync: Some(TextDocumentSyncCapability::Kind(
22+
TextDocumentSyncKind::INCREMENTAL,
23+
)),
2224
diagnostic_provider: Some(DiagnosticServerCapabilities::Options(DiagnosticOptions {
2325
identifier: None,
2426
inter_file_dependencies: true,

src/components/request/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ macro_rules! log {
4040
$crate::log!("\n")
4141
};
4242
($($arg:tt)*) => {{
43-
if true {
43+
if false {
4444
eprintln!($($arg)*);
4545
} else {
4646
let _ = format_args!($($arg)*);

0 commit comments

Comments
 (0)