Debugging

This commit is contained in:
2026-06-21 23:08:53 +02:00
parent 1546660435
commit 6a7c45ffbe
2 changed files with 64 additions and 6 deletions
+29 -3
View File
@@ -157,9 +157,32 @@ impl Backend {
modified.push(' '); modified.push(' ');
modified.push_str(&source[offset..]); modified.push_str(&source[offset..]);
let transpiled = transpile_mist(mist_path, &modified, extra_mod_decl).ok()?; let transpiled = match transpile_mist(mist_path, &modified, extra_mod_decl) {
let rust_pos = find_marker_position(&transpiled.rust_content, &marker)?; Ok(t) => t,
let rust_uri = clean_lsp_url(&transpiled.rust_path)?; Err(e) => {
eprintln!("[marker] transpile failed for {marker} at LSP({line},{character}): {e}");
return None;
}
};
let rust_pos = match find_marker_position(&transpiled.rust_content, &marker) {
Some(p) => p,
None => {
eprintln!("[marker] marker {marker} not found in transpiled output");
return None;
}
};
let rust_uri = match clean_lsp_url(&transpiled.rust_path) {
Some(u) => u,
None => {
eprintln!("[marker] failed to create URI for {:?}", transpiled.rust_path);
return None;
}
};
eprintln!(
"[marker] {marker}: mist LSP({line},{character}) -> rust LSP({},{})",
rust_pos.line, rust_pos.character
);
Some((rust_uri, rust_pos)) Some((rust_uri, rust_pos))
} }
@@ -552,6 +575,7 @@ impl LanguageServer for Backend {
) )
.await .await
else { else {
eprintln!("[completion] resolve_mist_via_marker returned None at ({}, {})", mist_pos.line, mist_pos.character);
return Ok(None); return Ok(None);
}; };
@@ -624,6 +648,7 @@ impl LanguageServer for Backend {
) )
.await .await
else { else {
eprintln!("[goto_definition] resolve_mist_via_marker returned None at ({}, {})", mist_pos.line, mist_pos.character);
return Ok(None); return Ok(None);
}; };
@@ -747,6 +772,7 @@ impl LanguageServer for Backend {
) )
.await .await
else { else {
eprintln!("[hover] resolve_mist_via_marker returned None at ({}, {})", mist_pos.line, mist_pos.character);
return Ok(None); return Ok(None);
}; };
+35 -3
View File
@@ -47,8 +47,16 @@ async fn send_lsp_message<W: AsyncWriteExt + Unpin>(
) -> std::io::Result<()> { ) -> std::io::Result<()> {
let payload = serde_json::to_string(value)?; let payload = serde_json::to_string(value)?;
let frame = format!("Content-Length: {}\r\n\r\n{}", payload.len(), payload); let frame = format!("Content-Length: {}\r\n\r\n{}", payload.len(), payload);
writer.write_all(frame.as_bytes()).await?; eprintln!("[send] writing {} bytes to child stdin", frame.len());
writer.flush().await?; if let Err(e) = writer.write_all(frame.as_bytes()).await {
eprintln!("[send] write_all failed: {e}");
return Err(e);
}
if let Err(e) = writer.flush().await {
eprintln!("[send] flush failed: {e}");
return Err(e);
}
eprintln!("[send] write OK");
Ok(()) Ok(())
} }
@@ -106,7 +114,7 @@ impl RustAnalyzer {
let mut child = tokio::process::Command::new("rust-analyzer") let mut child = tokio::process::Command::new("rust-analyzer")
.stdin(Stdio::piped()) .stdin(Stdio::piped())
.stdout(Stdio::piped()) .stdout(Stdio::piped())
.stderr(Stdio::null()) .stderr(Stdio::piped())
.spawn()?; .spawn()?;
let stdin = child let stdin = child
@@ -117,12 +125,35 @@ impl RustAnalyzer {
.stdout .stdout
.take() .take()
.ok_or("Failed to open child stdout pipe")?; .ok_or("Failed to open child stdout pipe")?;
let stderr = child
.stderr
.take()
.ok_or("Failed to open child stderr pipe")?;
tokio::spawn(async move {
let mut stderr = stderr;
let mut buf = vec![0u8; 4096];
loop {
match stderr.read(&mut buf).await {
Ok(0) => break,
Ok(n) => {
eprintln!("[ra-stderr] {}", String::from_utf8_lossy(&buf[..n]).trim_end());
}
Err(e) => {
eprintln!("[ra-stderr] read error: {e}");
break;
}
}
}
eprintln!("[ra-stderr] stream closed");
});
let pending: PendingMap = Arc::new(Mutex::new(HashMap::new())); let pending: PendingMap = Arc::new(Mutex::new(HashMap::new()));
let pending_clone = pending.clone(); let pending_clone = pending.clone();
tokio::spawn(async move { tokio::spawn(async move {
let mut stdout = BufReader::new(stdout); let mut stdout = BufReader::new(stdout);
eprintln!("[ra-reader] started");
loop { loop {
let raw = match read_lsp_message(&mut stdout).await { let raw = match read_lsp_message(&mut stdout).await {
@@ -137,6 +168,7 @@ impl RustAnalyzer {
// EOF means the child process exited — stop the reader. // EOF means the child process exited — stop the reader.
// Other errors (malformed frames) get a brief backoff then retry. // Other errors (malformed frames) get a brief backoff then retry.
if err.to_string().contains("LSP stream closed (EOF)") { if err.to_string().contains("LSP stream closed (EOF)") {
eprintln!("LSP reader task: EOF detected, stopping reader");
break; break;
} }
tokio::time::sleep(Duration::from_millis(50)).await; tokio::time::sleep(Duration::from_millis(50)).await;