Skip to content

Commit 06cf608

Browse files
committed
Add link to example usage in data extensions editor
This will allow a user to click on the number of usages to jump to an example usage in the code.
1 parent 73bd6d6 commit 06cf608

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { CancellationTokenSource, ExtensionContext, ViewColumn } from "vscode";
1+
import {
2+
CancellationTokenSource,
3+
ExtensionContext,
4+
ViewColumn,
5+
window,
6+
} from "vscode";
27
import { AbstractWebview, WebviewPanelConfig } from "../abstract-webview";
38
import {
49
FromDataExtensionsEditorMessage,
@@ -14,6 +19,9 @@ import { dump } from "js-yaml";
1419
import { getOnDiskWorkspaceFolders } from "../helpers";
1520
import { DatabaseItem } from "../local-databases";
1621
import { CodeQLCliServer } from "../cli";
22+
import { assertNever } from "../pure/helpers-pure";
23+
import { ResolvableLocationValue } from "../pure/bqrs-cli-types";
24+
import { showResolvableLocation } from "../interface-utils";
1725

1826
export class DataExtensionsEditorView extends AbstractWebview<
1927
ToDataExtensionsEditorMessage,
@@ -57,9 +65,13 @@ export class DataExtensionsEditorView extends AbstractWebview<
5765
case "viewLoaded":
5866
await this.onWebViewLoaded();
5967

68+
break;
69+
case "jumpToUsage":
70+
await this.jumpToUsage(msg.location);
71+
6072
break;
6173
default:
62-
throw new Error("Unexpected message type");
74+
assertNever(msg);
6375
}
6476
}
6577

@@ -69,6 +81,26 @@ export class DataExtensionsEditorView extends AbstractWebview<
6981
await this.loadExternalApiUsages();
7082
}
7183

84+
protected async jumpToUsage(
85+
location: ResolvableLocationValue,
86+
): Promise<void> {
87+
try {
88+
await showResolvableLocation(location, this.databaseItem);
89+
} catch (e) {
90+
if (e instanceof Error) {
91+
if (e.message.match(/File not found/)) {
92+
void window.showErrorMessage(
93+
"Original file of this result is not in the database's source archive.",
94+
);
95+
} else {
96+
void extLogger.log(`Unable to handleMsgFromView: ${e.message}`);
97+
}
98+
} else {
99+
void extLogger.log(`Unable to handleMsgFromView: ${e}`);
100+
}
101+
}
102+
}
103+
72104
protected async loadExternalApiUsages(): Promise<void> {
73105
const queryResult = await this.runQuery();
74106
if (!queryResult) {

extensions/ql-vscode/src/pure/interface-types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,8 +492,15 @@ export interface ShowProgressMessage {
492492
message: string;
493493
}
494494

495+
export interface JumpToUsageMessage {
496+
t: "jumpToUsage";
497+
location: ResolvableLocationValue;
498+
}
499+
495500
export type ToDataExtensionsEditorMessage =
496501
| SetExternalApiResultsMessage
497502
| ShowProgressMessage;
498503

499-
export type FromDataExtensionsEditorMessage = ViewLoadedMsg;
504+
export type FromDataExtensionsEditorMessage =
505+
| ViewLoadedMsg
506+
| JumpToUsageMessage;

extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
import * as React from "react";
1313
import { useCallback, useMemo } from "react";
1414
import styled from "styled-components";
15+
import { vscode } from "../vscode-api";
1516

1617
const Dropdown = styled(VSCodeDropdown)`
1718
width: 100%;
@@ -29,6 +30,13 @@ const SupportedUnsupportedSpan = styled.span<SupportedUnsupportedSpanProps>`
2930
color: ${(props) => (props.supported ? "green" : "red")};
3031
`;
3132

33+
const UsagesButton = styled.button`
34+
color: var(--vscode-editor-foreground);
35+
background-color: transparent;
36+
border: none;
37+
cursor: pointer;
38+
`;
39+
3240
type Props = {
3341
method: ExternalApiUsage;
3442
model: ModeledMethod | undefined;
@@ -105,6 +113,13 @@ export const MethodRow = ({ method, model, onChange }: Props) => {
105113
[onChange, method, model],
106114
);
107115

116+
const jumpToUsage = useCallback(() => {
117+
vscode.postMessage({
118+
t: "jumpToUsage",
119+
location: method.usages[0].url,
120+
});
121+
}, [method]);
122+
108123
return (
109124
<VSCodeDataGridRow>
110125
<VSCodeDataGridCell gridColumn={1}>
@@ -119,7 +134,9 @@ export const MethodRow = ({ method, model, onChange }: Props) => {
119134
</SupportedUnsupportedSpan>
120135
</VSCodeDataGridCell>
121136
<VSCodeDataGridCell gridColumn={3}>
122-
{method.usages.length}
137+
<UsagesButton onClick={jumpToUsage}>
138+
{method.usages.length}
139+
</UsagesButton>
123140
</VSCodeDataGridCell>
124141
<VSCodeDataGridCell gridColumn={4}>
125142
{(!method.supported || (model && model?.type !== "none")) && (

0 commit comments

Comments
 (0)