mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-30 22:01:18 +00:00
[ty] Implemented partial support for "find references" language server feature. (#19475)
This PR adds basic support for the "find all references" language server feature. --------- Co-authored-by: UnboundVariable <unbound@gmail.com>
This commit is contained in:
parent
89258f1938
commit
fa1df4cedc
11 changed files with 1468 additions and 169 deletions
|
@ -209,6 +209,7 @@ impl Server {
|
|||
type_definition_provider: Some(TypeDefinitionProviderCapability::Simple(true)),
|
||||
definition_provider: Some(lsp_types::OneOf::Left(true)),
|
||||
declaration_provider: Some(DeclarationCapability::Simple(true)),
|
||||
references_provider: Some(lsp_types::OneOf::Left(true)),
|
||||
hover_provider: Some(HoverProviderCapability::Simple(true)),
|
||||
signature_help_provider: Some(SignatureHelpOptions {
|
||||
trigger_characters: Some(vec!["(".to_string(), ",".to_string()]),
|
||||
|
|
|
@ -56,6 +56,9 @@ pub(super) fn request(req: server::Request) -> Task {
|
|||
requests::HoverRequestHandler::METHOD => background_document_request_task::<
|
||||
requests::HoverRequestHandler,
|
||||
>(req, BackgroundSchedule::Worker),
|
||||
requests::ReferencesRequestHandler::METHOD => background_document_request_task::<
|
||||
requests::ReferencesRequestHandler,
|
||||
>(req, BackgroundSchedule::Worker),
|
||||
requests::InlayHintRequestHandler::METHOD => background_document_request_task::<
|
||||
requests::InlayHintRequestHandler,
|
||||
>(req, BackgroundSchedule::Worker),
|
||||
|
|
|
@ -5,6 +5,7 @@ mod goto_definition;
|
|||
mod goto_type_definition;
|
||||
mod hover;
|
||||
mod inlay_hints;
|
||||
mod references;
|
||||
mod semantic_tokens;
|
||||
mod semantic_tokens_range;
|
||||
mod shutdown;
|
||||
|
@ -18,6 +19,7 @@ pub(super) use goto_definition::GotoDefinitionRequestHandler;
|
|||
pub(super) use goto_type_definition::GotoTypeDefinitionRequestHandler;
|
||||
pub(super) use hover::HoverRequestHandler;
|
||||
pub(super) use inlay_hints::InlayHintRequestHandler;
|
||||
pub(super) use references::ReferencesRequestHandler;
|
||||
pub(super) use semantic_tokens::SemanticTokensRequestHandler;
|
||||
pub(super) use semantic_tokens_range::SemanticTokensRangeRequestHandler;
|
||||
pub(super) use shutdown::ShutdownHandler;
|
||||
|
|
65
crates/ty_server/src/server/api/requests/references.rs
Normal file
65
crates/ty_server/src/server/api/requests/references.rs
Normal file
|
@ -0,0 +1,65 @@
|
|||
use std::borrow::Cow;
|
||||
|
||||
use lsp_types::request::References;
|
||||
use lsp_types::{Location, ReferenceParams, Url};
|
||||
use ruff_db::source::{line_index, source_text};
|
||||
use ty_ide::references;
|
||||
use ty_project::ProjectDatabase;
|
||||
|
||||
use crate::document::{PositionExt, ToLink};
|
||||
use crate::server::api::traits::{
|
||||
BackgroundDocumentRequestHandler, RequestHandler, RetriableRequestHandler,
|
||||
};
|
||||
use crate::session::DocumentSnapshot;
|
||||
use crate::session::client::Client;
|
||||
|
||||
pub(crate) struct ReferencesRequestHandler;
|
||||
|
||||
impl RequestHandler for ReferencesRequestHandler {
|
||||
type RequestType = References;
|
||||
}
|
||||
|
||||
impl BackgroundDocumentRequestHandler for ReferencesRequestHandler {
|
||||
fn document_url(params: &ReferenceParams) -> Cow<Url> {
|
||||
Cow::Borrowed(¶ms.text_document_position.text_document.uri)
|
||||
}
|
||||
|
||||
fn run_with_snapshot(
|
||||
db: &ProjectDatabase,
|
||||
snapshot: DocumentSnapshot,
|
||||
_client: &Client,
|
||||
params: ReferenceParams,
|
||||
) -> crate::server::Result<Option<Vec<Location>>> {
|
||||
if snapshot.client_settings().is_language_services_disabled() {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let Some(file) = snapshot.file(db) else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let source = source_text(db, file);
|
||||
let line_index = line_index(db, file);
|
||||
let offset = params.text_document_position.position.to_text_size(
|
||||
&source,
|
||||
&line_index,
|
||||
snapshot.encoding(),
|
||||
);
|
||||
|
||||
let include_declaration = params.context.include_declaration;
|
||||
|
||||
let Some(references_result) = references(db, file, offset, include_declaration) else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let locations: Vec<_> = references_result
|
||||
.into_iter()
|
||||
.flat_map(|ranged| ranged.value.into_iter())
|
||||
.filter_map(|target| target.to_location(db, snapshot.encoding()))
|
||||
.collect();
|
||||
|
||||
Ok(Some(locations))
|
||||
}
|
||||
}
|
||||
|
||||
impl RetriableRequestHandler for ReferencesRequestHandler {}
|
|
@ -26,6 +26,7 @@ expression: initialization_result
|
|||
},
|
||||
"definitionProvider": true,
|
||||
"typeDefinitionProvider": true,
|
||||
"referencesProvider": true,
|
||||
"declarationProvider": true,
|
||||
"semanticTokensProvider": {
|
||||
"legend": {
|
||||
|
|
|
@ -26,6 +26,7 @@ expression: initialization_result
|
|||
},
|
||||
"definitionProvider": true,
|
||||
"typeDefinitionProvider": true,
|
||||
"referencesProvider": true,
|
||||
"declarationProvider": true,
|
||||
"semanticTokensProvider": {
|
||||
"legend": {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue