Use real file path when available in ruff server (#11800)

## Summary

As-is, we're using the URL path for all files, leading us to use paths
like:

```
/c%3A/Users/crmar/workspace/fastapi/tests/main.py
```

This doesn't match against per-file ignores and other patterns in Ruff
configuration.

This PR modifies the LSP to use the real file path if available, and the
virtual file path if not.

Closes https://github.com/astral-sh/ruff/issues/11751.

## Test Plan

Ran the LSP on Windows. In the FastAPI repo, added:

```toml
[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["F401"]
```

And verified that an unused import was ignored in `tests` after this
change, but not before.
This commit is contained in:
Charlie Marsh 2024-06-07 22:48:53 -07:00 committed by GitHub
parent 32ca704956
commit ee1621b2f9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 9 deletions

View file

@ -1,8 +1,12 @@
use std::borrow::Cow;
use std::path::PathBuf;
use std::{collections::BTreeMap, path::Path, sync::Arc};
use anyhow::anyhow;
use lsp_types::Url;
use rustc_hash::FxHashMap;
use std::path::PathBuf;
use std::{collections::BTreeMap, path::Path, sync::Arc};
pub(crate) use ruff_settings::RuffSettings;
use crate::{
edit::{DocumentKey, DocumentVersion, NotebookDocument},
@ -13,8 +17,6 @@ use super::{settings::ResolvedClientSettings, ClientSettings};
mod ruff_settings;
pub(crate) use ruff_settings::RuffSettings;
type SettingsIndex = BTreeMap<PathBuf, WorkspaceSettings>;
/// Stores and tracks all open documents in a session, along with their associated settings.
@ -544,8 +546,10 @@ impl DocumentQuery {
/// Get the path for the document selected by this query, ignoring whether the file exists on disk.
///
/// Returns the URL's path if this is an unsaved (untitled) document.
pub(crate) fn virtual_file_path(&self) -> &Path {
Path::new(self.file_url().path())
pub(crate) fn virtual_file_path(&self) -> Cow<Path> {
self.file_path()
.map(Cow::Owned)
.unwrap_or_else(|| Cow::Borrowed(Path::new(self.file_url().path())))
}
/// Attempt to access the single inner text document selected by the query.