From e766dcb9756c166ed8c3a0425725e3af2cdfc783 Mon Sep 17 00:00:00 2001 From: UnboundVariable Date: Wed, 23 Jul 2025 15:33:41 -0700 Subject: [PATCH 1/2] [ty] Added support for "go to references" in ty playground. --- crates/ty_wasm/src/lib.rs | 25 +++++++++++++++++++++- playground/ty/src/Editor/Editor.tsx | 33 +++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/crates/ty_wasm/src/lib.rs b/crates/ty_wasm/src/lib.rs index de101ae3c097d..66f7e23bec8a9 100644 --- a/crates/ty_wasm/src/lib.rs +++ b/crates/ty_wasm/src/lib.rs @@ -16,7 +16,7 @@ use ruff_source_file::{LineIndex, OneIndexed, SourceLocation}; use ruff_text_size::{Ranged, TextSize}; use ty_ide::{ MarkupKind, RangedValue, goto_declaration, goto_definition, goto_type_definition, hover, - inlay_hints, + inlay_hints, references, }; use ty_ide::{NavigationTargets, signature_help}; 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, 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] pub fn hover(&self, file_id: &FileHandle, position: Position) -> Result, Error> { let source = source_text(&self.db, file_id.file); diff --git a/playground/ty/src/Editor/Editor.tsx b/playground/ty/src/Editor/Editor.tsx index 9f1528120b3f8..27f1beb5f743e 100644 --- a/playground/ty/src/Editor/Editor.tsx +++ b/playground/ty/src/Editor/Editor.tsx @@ -148,6 +148,7 @@ class PlaygroundServer languages.TypeDefinitionProvider, languages.DeclarationProvider, languages.DefinitionProvider, + languages.ReferenceProvider, editor.ICodeEditorOpener, languages.HoverProvider, languages.InlayHintsProvider, @@ -160,6 +161,7 @@ class PlaygroundServer private typeDefinitionProviderDisposable: IDisposable; private declarationProviderDisposable: IDisposable; private definitionProviderDisposable: IDisposable; + private referenceProviderDisposable: IDisposable; private editorOpenerDisposable: IDisposable; private hoverDisposable: IDisposable; private inlayHintsDisposable: IDisposable; @@ -179,6 +181,8 @@ class PlaygroundServer monaco.languages.registerDeclarationProvider("python", this); this.definitionProviderDisposable = monaco.languages.registerDefinitionProvider("python", this); + this.referenceProviderDisposable = + monaco.languages.registerReferenceProvider("python", this); this.hoverDisposable = monaco.languages.registerHoverProvider( "python", this, @@ -582,6 +586,34 @@ class PlaygroundServer return mapNavigationTargets(links); } + provideReferences( + model: editor.ITextModel, + position: Position, + context: languages.ReferenceContext, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _: CancellationToken, + ): languages.ProviderResult { + 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( source: editor.ICodeEditor, resource: Uri, @@ -667,6 +699,7 @@ class PlaygroundServer this.typeDefinitionProviderDisposable.dispose(); this.declarationProviderDisposable.dispose(); this.definitionProviderDisposable.dispose(); + this.referenceProviderDisposable.dispose(); this.inlayHintsDisposable.dispose(); this.formatDisposable.dispose(); this.rangeSemanticTokensDisposable.dispose(); From da9478935633e2d448ee1dfa348c31eda35b006e Mon Sep 17 00:00:00 2001 From: UnboundVariable Date: Wed, 23 Jul 2025 15:42:02 -0700 Subject: [PATCH 2/2] Fixed lint error. --- playground/ty/src/Editor/Editor.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/playground/ty/src/Editor/Editor.tsx b/playground/ty/src/Editor/Editor.tsx index 27f1beb5f743e..c10b4c5dcbab1 100644 --- a/playground/ty/src/Editor/Editor.tsx +++ b/playground/ty/src/Editor/Editor.tsx @@ -589,6 +589,7 @@ class PlaygroundServer 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,