Skip to content

Commit 63d1d33

Browse files
UnboundVariableUnboundVariable
andauthored
[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 <[email protected]>
1 parent e0149cd commit 63d1d33

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

crates/ty_wasm/src/lib.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use ruff_source_file::{LineIndex, OneIndexed, SourceLocation};
1616
use ruff_text_size::{Ranged, TextSize};
1717
use ty_ide::{
1818
MarkupKind, RangedValue, goto_declaration, goto_definition, goto_type_definition, hover,
19-
inlay_hints,
19+
inlay_hints, references,
2020
};
2121
use ty_ide::{NavigationTargets, signature_help};
2222
use ty_project::metadata::options::Options;
@@ -327,6 +327,29 @@ impl Workspace {
327327
))
328328
}
329329

330+
#[wasm_bindgen(js_name = "gotoReferences")]
331+
pub fn goto_references(
332+
&self,
333+
file_id: &FileHandle,
334+
position: Position,
335+
) -> Result<Vec<LocationLink>, Error> {
336+
let source = source_text(&self.db, file_id.file);
337+
let index = line_index(&self.db, file_id.file);
338+
339+
let offset = position.to_text_size(&source, &index, self.position_encoding)?;
340+
341+
let Some(targets) = references(&self.db, file_id.file, offset, true) else {
342+
return Ok(Vec::new());
343+
};
344+
345+
Ok(targets
346+
.into_iter()
347+
.flat_map(|target| {
348+
map_targets_to_links(&self.db, target, &source, &index, self.position_encoding)
349+
})
350+
.collect())
351+
}
352+
330353
#[wasm_bindgen]
331354
pub fn hover(&self, file_id: &FileHandle, position: Position) -> Result<Option<Hover>, Error> {
332355
let source = source_text(&self.db, file_id.file);

playground/ty/src/Editor/Editor.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class PlaygroundServer
148148
languages.TypeDefinitionProvider,
149149
languages.DeclarationProvider,
150150
languages.DefinitionProvider,
151+
languages.ReferenceProvider,
151152
editor.ICodeEditorOpener,
152153
languages.HoverProvider,
153154
languages.InlayHintsProvider,
@@ -160,6 +161,7 @@ class PlaygroundServer
160161
private typeDefinitionProviderDisposable: IDisposable;
161162
private declarationProviderDisposable: IDisposable;
162163
private definitionProviderDisposable: IDisposable;
164+
private referenceProviderDisposable: IDisposable;
163165
private editorOpenerDisposable: IDisposable;
164166
private hoverDisposable: IDisposable;
165167
private inlayHintsDisposable: IDisposable;
@@ -179,6 +181,8 @@ class PlaygroundServer
179181
monaco.languages.registerDeclarationProvider("python", this);
180182
this.definitionProviderDisposable =
181183
monaco.languages.registerDefinitionProvider("python", this);
184+
this.referenceProviderDisposable =
185+
monaco.languages.registerReferenceProvider("python", this);
182186
this.hoverDisposable = monaco.languages.registerHoverProvider(
183187
"python",
184188
this,
@@ -582,6 +586,35 @@ class PlaygroundServer
582586
return mapNavigationTargets(links);
583587
}
584588

589+
provideReferences(
590+
model: editor.ITextModel,
591+
position: Position,
592+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
593+
context: languages.ReferenceContext,
594+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
595+
_: CancellationToken,
596+
): languages.ProviderResult<languages.Location[]> {
597+
const workspace = this.props.workspace;
598+
599+
const selectedFile = this.props.files.selected;
600+
if (selectedFile == null) {
601+
return;
602+
}
603+
604+
const selectedHandle = this.props.files.handles[selectedFile];
605+
606+
if (selectedHandle == null) {
607+
return;
608+
}
609+
610+
const links = workspace.gotoReferences(
611+
selectedHandle,
612+
new TyPosition(position.lineNumber, position.column),
613+
);
614+
615+
return mapNavigationTargets(links);
616+
}
617+
585618
openCodeEditor(
586619
source: editor.ICodeEditor,
587620
resource: Uri,
@@ -667,6 +700,7 @@ class PlaygroundServer
667700
this.typeDefinitionProviderDisposable.dispose();
668701
this.declarationProviderDisposable.dispose();
669702
this.definitionProviderDisposable.dispose();
703+
this.referenceProviderDisposable.dispose();
670704
this.inlayHintsDisposable.dispose();
671705
this.formatDisposable.dispose();
672706
this.rangeSemanticTokensDisposable.dispose();

0 commit comments

Comments
 (0)