Skip to content
This repository was archived by the owner on Sep 19, 2025. It is now read-only.

Commit 31b779f

Browse files
committed
Start adding goto functionality
1 parent c76828b commit 31b779f

File tree

4 files changed

+68
-14
lines changed

4 files changed

+68
-14
lines changed

demo/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
tsSyncWorker,
1919
tsFacet,
2020
tsFacetWorker,
21+
tsGotoWorker,
2122
} from "../src/index.js";
2223
import * as Comlink from "comlink";
2324
import { WorkerShape } from "../src/worker.js";
@@ -124,6 +125,7 @@ increment('not a number');`,
124125
],
125126
}),
126127
tsHoverWorker(),
128+
tsGotoWorker(),
127129
],
128130
parent: document.querySelector("#editor-worker")!,
129131
});

src/goto/tsGotoWorker.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { EditorView } from "@codemirror/view";
2+
import { tsFacetWorker } from "../index.js";
3+
4+
/**
5+
* Supports 'going to' a variable definition by meta or
6+
* ctrl-clicking on it.
7+
*/
8+
export function tsGotoWorker() {
9+
return EditorView.domEventHandlers({
10+
click: (event, view) => {
11+
const config = view.state.facet(tsFacetWorker);
12+
if (!config?.worker) return false;
13+
14+
// TODO: maybe this should be _just_ meta?
15+
// I think ctrl should probably be preserved.
16+
// Need to check what VS Code does
17+
if (!(event.metaKey || event.ctrlKey)) return false;
18+
19+
const pos = view.posAtCoords({
20+
x: event.clientX,
21+
y: event.clientY,
22+
});
23+
24+
if (pos === null) return;
25+
26+
config.worker
27+
.getHover({
28+
path: config.path,
29+
pos,
30+
})
31+
.then((hoverData) => {
32+
const definition = hoverData?.typeDef?.at(0);
33+
34+
if (definition) {
35+
if (config.path === definition.fileName) {
36+
const tr = view.state.update({
37+
selection: {
38+
anchor: definition.textSpan.start,
39+
head: definition.textSpan.start + definition.textSpan.length,
40+
},
41+
});
42+
view.dispatch(tr);
43+
}
44+
}
45+
});
46+
47+
return true;
48+
},
49+
});
50+
}

src/hover/renderTooltip.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import type ts from "typescript";
33
import type { HoverInfo } from "./getHover.js";
44

55
export type TooltipRenderer = (
6-
arg0: HoverInfo,
7-
editorView: EditorView,
6+
arg0: HoverInfo,
7+
editorView: EditorView,
88
) => TooltipView;
99

1010
/**
@@ -14,19 +14,19 @@ export type TooltipRenderer = (
1414
* classes.
1515
*/
1616
export const defaultRenderer: TooltipRenderer = (info: HoverInfo) => {
17-
const div = document.createElement("div");
18-
if (info.quickInfo?.displayParts) {
19-
div.appendChild(renderDisplayParts(info.quickInfo.displayParts));
20-
}
21-
return { dom: div };
17+
const div = document.createElement("div");
18+
if (info.quickInfo?.displayParts) {
19+
div.appendChild(renderDisplayParts(info.quickInfo.displayParts));
20+
}
21+
return { dom: div };
2222
};
2323

2424
export const renderDisplayParts = (displayParts: ts.SymbolDisplayPart[]) => {
25-
const div = document.createElement("div");
26-
for (const part of displayParts) {
27-
const span = div.appendChild(document.createElement("span"));
28-
span.className = `quick-info-${part.kind}`;
29-
span.innerText = part.text;
30-
}
31-
return div;
25+
const div = document.createElement("div");
26+
for (const part of displayParts) {
27+
const span = div.appendChild(document.createElement("span"));
28+
span.className = `quick-info-${part.kind}`;
29+
span.innerText = part.text;
30+
}
31+
return div;
3232
};

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ export * from "./hover/renderTooltip.js";
1717

1818
export * from "./facet/tsFacet.js";
1919
export * from "./facet/tsFacetWorker.js";
20+
21+
export * from "./goto/tsGotoWorker.js";

0 commit comments

Comments
 (0)