Use Result for failed text document retrieval in LSP requests (#14579)

## Summary

Ref:
https://github.com/astral-sh/ruff-vscode/issues/644#issuecomment-2496588452

## Test Plan

Not sure how to test this as this is mainly to get more context on the
panic that the server is raising.
This commit is contained in:
Dhruv Manilawala 2024-11-25 15:14:30 +05:30 committed by GitHub
parent 9f6147490b
commit 0c9165fc3a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 31 additions and 8 deletions

View file

@ -6,6 +6,7 @@ use std::{collections::BTreeMap, path::Path, sync::Arc};
use anyhow::anyhow;
use lsp_types::Url;
use rustc_hash::FxHashMap;
use thiserror::Error;
pub(crate) use ruff_settings::RuffSettings;
@ -597,16 +598,24 @@ impl DocumentQuery {
/// Attempt to access the single inner text document selected by the query.
/// If this query is selecting an entire notebook document, this will return `None`.
pub(crate) fn as_single_document(&self) -> Option<&TextDocument> {
pub(crate) fn as_single_document(&self) -> Result<&TextDocument, SingleDocumentError> {
match self {
Self::Text { document, .. } => Some(document),
Self::Text { document, .. } => Ok(document),
Self::Notebook {
notebook,
file_url,
cell_url: cell_uri,
..
} => cell_uri
.as_ref()
.and_then(|cell_uri| notebook.cell_document_by_uri(cell_uri)),
} => {
if let Some(cell_uri) = cell_uri {
let cell = notebook
.cell_document_by_uri(cell_uri)
.ok_or_else(|| SingleDocumentError::CellDoesNotExist(cell_uri.clone()))?;
Ok(cell)
} else {
Err(SingleDocumentError::Notebook(file_url.clone()))
}
}
}
}
@ -618,3 +627,11 @@ impl DocumentQuery {
}
}
}
#[derive(Debug, Error)]
pub(crate) enum SingleDocumentError {
#[error("Expected a single text document, but found a notebook document: {0}")]
Notebook(Url),
#[error("Cell with URL {0} does not exist in the internal notebook document")]
CellDoesNotExist(Url),
}