[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:
UnboundVariable 2025-07-23 22:46:42 -07:00 committed by GitHub
parent e0149cd9f3
commit 63d1d332b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 58 additions and 1 deletions

View File

@ -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);

View 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();