diff --git a/crates/ty_wasm/src/lib.rs b/crates/ty_wasm/src/lib.rs index de101ae3c0..66f7e23bec 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 9f1528120b..c10b4c5dcb 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,35 @@ class PlaygroundServer 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 { + 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 +700,7 @@ class PlaygroundServer this.typeDefinitionProviderDisposable.dispose(); this.declarationProviderDisposable.dispose(); this.definitionProviderDisposable.dispose(); + this.referenceProviderDisposable.dispose(); this.inlayHintsDisposable.dispose(); this.formatDisposable.dispose(); this.rangeSemanticTokensDisposable.dispose();