mirror of https://github.com/astral-sh/ruff
[ty] Added support for "go to references" in ty playground. (#19516)
This PR adds support for "go to references" in the ty playground. <img width="393" height="168" alt="image" src="https://github.com/user-attachments/assets/ce3ae1bf-c17c-4510-9f77-20b10f6170c4" /> --------- Co-authored-by: UnboundVariable <unbound@gmail.com>
This commit is contained in:
parent
e0149cd9f3
commit
63d1d332b3
|
|
@ -16,7 +16,7 @@ use ruff_source_file::{LineIndex, OneIndexed, SourceLocation};
|
||||||
use ruff_text_size::{Ranged, TextSize};
|
use ruff_text_size::{Ranged, TextSize};
|
||||||
use ty_ide::{
|
use ty_ide::{
|
||||||
MarkupKind, RangedValue, goto_declaration, goto_definition, goto_type_definition, hover,
|
MarkupKind, RangedValue, goto_declaration, goto_definition, goto_type_definition, hover,
|
||||||
inlay_hints,
|
inlay_hints, references,
|
||||||
};
|
};
|
||||||
use ty_ide::{NavigationTargets, signature_help};
|
use ty_ide::{NavigationTargets, signature_help};
|
||||||
use ty_project::metadata::options::Options;
|
use ty_project::metadata::options::Options;
|
||||||
|
|
@ -327,6 +327,29 @@ impl Workspace {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen(js_name = "gotoReferences")]
|
||||||
|
pub fn goto_references(
|
||||||
|
&self,
|
||||||
|
file_id: &FileHandle,
|
||||||
|
position: Position,
|
||||||
|
) -> Result<Vec<LocationLink>, Error> {
|
||||||
|
let source = source_text(&self.db, file_id.file);
|
||||||
|
let index = line_index(&self.db, file_id.file);
|
||||||
|
|
||||||
|
let offset = position.to_text_size(&source, &index, self.position_encoding)?;
|
||||||
|
|
||||||
|
let Some(targets) = references(&self.db, file_id.file, offset, true) else {
|
||||||
|
return Ok(Vec::new());
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(targets
|
||||||
|
.into_iter()
|
||||||
|
.flat_map(|target| {
|
||||||
|
map_targets_to_links(&self.db, target, &source, &index, self.position_encoding)
|
||||||
|
})
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn hover(&self, file_id: &FileHandle, position: Position) -> Result<Option<Hover>, Error> {
|
pub fn hover(&self, file_id: &FileHandle, position: Position) -> Result<Option<Hover>, Error> {
|
||||||
let source = source_text(&self.db, file_id.file);
|
let source = source_text(&self.db, file_id.file);
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ class PlaygroundServer
|
||||||
languages.TypeDefinitionProvider,
|
languages.TypeDefinitionProvider,
|
||||||
languages.DeclarationProvider,
|
languages.DeclarationProvider,
|
||||||
languages.DefinitionProvider,
|
languages.DefinitionProvider,
|
||||||
|
languages.ReferenceProvider,
|
||||||
editor.ICodeEditorOpener,
|
editor.ICodeEditorOpener,
|
||||||
languages.HoverProvider,
|
languages.HoverProvider,
|
||||||
languages.InlayHintsProvider,
|
languages.InlayHintsProvider,
|
||||||
|
|
@ -160,6 +161,7 @@ class PlaygroundServer
|
||||||
private typeDefinitionProviderDisposable: IDisposable;
|
private typeDefinitionProviderDisposable: IDisposable;
|
||||||
private declarationProviderDisposable: IDisposable;
|
private declarationProviderDisposable: IDisposable;
|
||||||
private definitionProviderDisposable: IDisposable;
|
private definitionProviderDisposable: IDisposable;
|
||||||
|
private referenceProviderDisposable: IDisposable;
|
||||||
private editorOpenerDisposable: IDisposable;
|
private editorOpenerDisposable: IDisposable;
|
||||||
private hoverDisposable: IDisposable;
|
private hoverDisposable: IDisposable;
|
||||||
private inlayHintsDisposable: IDisposable;
|
private inlayHintsDisposable: IDisposable;
|
||||||
|
|
@ -179,6 +181,8 @@ class PlaygroundServer
|
||||||
monaco.languages.registerDeclarationProvider("python", this);
|
monaco.languages.registerDeclarationProvider("python", this);
|
||||||
this.definitionProviderDisposable =
|
this.definitionProviderDisposable =
|
||||||
monaco.languages.registerDefinitionProvider("python", this);
|
monaco.languages.registerDefinitionProvider("python", this);
|
||||||
|
this.referenceProviderDisposable =
|
||||||
|
monaco.languages.registerReferenceProvider("python", this);
|
||||||
this.hoverDisposable = monaco.languages.registerHoverProvider(
|
this.hoverDisposable = monaco.languages.registerHoverProvider(
|
||||||
"python",
|
"python",
|
||||||
this,
|
this,
|
||||||
|
|
@ -582,6 +586,35 @@ class PlaygroundServer
|
||||||
return mapNavigationTargets(links);
|
return mapNavigationTargets(links);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
provideReferences(
|
||||||
|
model: editor.ITextModel,
|
||||||
|
position: Position,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
context: languages.ReferenceContext,
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
_: CancellationToken,
|
||||||
|
): languages.ProviderResult<languages.Location[]> {
|
||||||
|
const workspace = this.props.workspace;
|
||||||
|
|
||||||
|
const selectedFile = this.props.files.selected;
|
||||||
|
if (selectedFile == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedHandle = this.props.files.handles[selectedFile];
|
||||||
|
|
||||||
|
if (selectedHandle == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const links = workspace.gotoReferences(
|
||||||
|
selectedHandle,
|
||||||
|
new TyPosition(position.lineNumber, position.column),
|
||||||
|
);
|
||||||
|
|
||||||
|
return mapNavigationTargets(links);
|
||||||
|
}
|
||||||
|
|
||||||
openCodeEditor(
|
openCodeEditor(
|
||||||
source: editor.ICodeEditor,
|
source: editor.ICodeEditor,
|
||||||
resource: Uri,
|
resource: Uri,
|
||||||
|
|
@ -667,6 +700,7 @@ class PlaygroundServer
|
||||||
this.typeDefinitionProviderDisposable.dispose();
|
this.typeDefinitionProviderDisposable.dispose();
|
||||||
this.declarationProviderDisposable.dispose();
|
this.declarationProviderDisposable.dispose();
|
||||||
this.definitionProviderDisposable.dispose();
|
this.definitionProviderDisposable.dispose();
|
||||||
|
this.referenceProviderDisposable.dispose();
|
||||||
this.inlayHintsDisposable.dispose();
|
this.inlayHintsDisposable.dispose();
|
||||||
this.formatDisposable.dispose();
|
this.formatDisposable.dispose();
|
||||||
this.rangeSemanticTokensDisposable.dispose();
|
this.rangeSemanticTokensDisposable.dispose();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue