Add empty data extension editor view

This adds an empty data extension editor view which is only available
behind the `codeQL.dataExtensions.editor` and `codeQL.canary` settings.
This commit is contained in:
Koen Vlaswinkel
2023-04-04 12:07:59 +02:00
parent 35cb1137e8
commit 478c095d65
11 changed files with 110 additions and 2 deletions

View File

@@ -1,3 +1,4 @@
**/* @github/codeql-vscode-reviewers **/* @github/codeql-vscode-reviewers
**/variant-analysis/ @github/code-scanning-secexp-reviewers **/variant-analysis/ @github/code-scanning-secexp-reviewers
**/databases/ @github/code-scanning-secexp-reviewers **/databases/ @github/code-scanning-secexp-reviewers
**/data-extensions-editor/ @github/code-scanning-secexp-reviewers

View File

@@ -703,6 +703,10 @@
"title": "CodeQL: Go to QL Code", "title": "CodeQL: Go to QL Code",
"enablement": "codeql.hasQLSource" "enablement": "codeql.hasQLSource"
}, },
{
"command": "codeQL.openDataExtensionsEditor",
"title": "CodeQL: Open Data Extensions Editor"
},
{ {
"command": "codeQL.mockGitHubApiServer.startRecording", "command": "codeQL.mockGitHubApiServer.startRecording",
"title": "CodeQL: Mock GitHub API Server: Start Scenario Recording" "title": "CodeQL: Mock GitHub API Server: Start Scenario Recording"
@@ -1086,6 +1090,10 @@
"command": "codeQL.viewCfgContextEditor", "command": "codeQL.viewCfgContextEditor",
"when": "false" "when": "false"
}, },
{
"command": "codeQL.openDataExtensionsEditor",
"when": "config.codeQL.canary && config.codeQL.dataExtensions.editor"
},
{ {
"command": "codeQLVariantAnalysisRepositories.openConfigFile", "command": "codeQLVariantAnalysisRepositories.openConfigFile",
"when": "false" "when": "false"

View File

@@ -241,6 +241,10 @@ export type PackagingCommands = {
"codeQL.downloadPacks": () => Promise<void>; "codeQL.downloadPacks": () => Promise<void>;
}; };
export type DataExtensionsEditorCommands = {
"codeQL.openDataExtensionsEditor": () => Promise<void>;
};
export type EvalLogViewerCommands = { export type EvalLogViewerCommands = {
"codeQLEvalLogViewer.clear": () => Promise<void>; "codeQLEvalLogViewer.clear": () => Promise<void>;
}; };
@@ -273,6 +277,7 @@ export type AllExtensionCommands = BaseCommands &
AstCfgCommands & AstCfgCommands &
AstViewerCommands & AstViewerCommands &
PackagingCommands & PackagingCommands &
DataExtensionsEditorCommands &
EvalLogViewerCommands & EvalLogViewerCommands &
SummaryLanguageSupportCommands & SummaryLanguageSupportCommands &
Partial<TestUICommands> & Partial<TestUICommands> &

View File

@@ -0,0 +1,16 @@
import { ExtensionContext } from "vscode";
import { DataExtensionsEditorView } from "./data-extensions-editor-view";
import { DataExtensionsEditorCommands } from "../common/commands";
export class DataExtensionsEditorModule {
public constructor(private readonly ctx: ExtensionContext) {}
public getCommands(): DataExtensionsEditorCommands {
return {
"codeQL.openDataExtensionsEditor": async () => {
const view = new DataExtensionsEditorView(this.ctx);
await view.openView();
},
};
}
}

View File

@@ -0,0 +1,53 @@
import { ExtensionContext, ViewColumn } from "vscode";
import { AbstractWebview, WebviewPanelConfig } from "../abstract-webview";
import {
FromDataExtensionsEditorMessage,
ToDataExtensionsEditorMessage,
} from "../pure/interface-types";
export class DataExtensionsEditorView extends AbstractWebview<
ToDataExtensionsEditorMessage,
FromDataExtensionsEditorMessage
> {
public constructor(ctx: ExtensionContext) {
super(ctx);
}
public async openView() {
const panel = await this.getPanel();
panel.reveal(undefined, true);
await this.waitForPanelLoaded();
}
protected async getPanelConfig(): Promise<WebviewPanelConfig> {
return {
viewId: "data-extensions-editor",
title: "Data Extensions Editor",
viewColumn: ViewColumn.Active,
preserveFocus: true,
view: "data-extensions-editor",
};
}
protected onPanelDispose(): void {
// Nothing to do here
}
protected async onMessage(
msg: FromDataExtensionsEditorMessage,
): Promise<void> {
switch (msg.t) {
case "viewLoaded":
await this.onWebViewLoaded();
break;
default:
throw new Error("Unexpected message type");
}
}
protected async onWebViewLoaded() {
super.onWebViewLoaded();
}
}

View File

@@ -120,6 +120,7 @@ import { getAstCfgCommands } from "./ast-cfg-commands";
import { getQueryEditorCommands } from "./query-editor"; import { getQueryEditorCommands } from "./query-editor";
import { App } from "./common/app"; import { App } from "./common/app";
import { registerCommandWithErrorHandling } from "./common/vscode/commands"; import { registerCommandWithErrorHandling } from "./common/vscode/commands";
import { DataExtensionsEditorModule } from "./data-extensions-editor/data-extensions-editor-module";
/** /**
* extension.ts * extension.ts
@@ -860,6 +861,8 @@ async function activateWithInstalledDistribution(
); );
ctx.subscriptions.push(localQueries); ctx.subscriptions.push(localQueries);
const dataExtensionsEditorModule = new DataExtensionsEditorModule(ctx);
void extLogger.log("Initializing QLTest interface."); void extLogger.log("Initializing QLTest interface.");
const testExplorerExtension = extensions.getExtension<TestHub>( const testExplorerExtension = extensions.getExtension<TestHub>(
testExplorerExtensionId, testExplorerExtensionId,
@@ -922,6 +925,7 @@ async function activateWithInstalledDistribution(
...getPackagingCommands({ ...getPackagingCommands({
cliServer, cliServer,
}), }),
...dataExtensionsEditorModule.getCommands(),
...evalLogViewer.getCommands(), ...evalLogViewer.getCommands(),
...summaryLanguageSupport.getCommands(), ...summaryLanguageSupport.getCommands(),
...testUiCommands, ...testUiCommands,

View File

@@ -113,7 +113,8 @@ export type WebviewView =
| "results" | "results"
| "compare" | "compare"
| "variant-analysis" | "variant-analysis"
| "data-flow-paths"; | "data-flow-paths"
| "data-extensions-editor";
export interface WebviewMessage { export interface WebviewMessage {
t: string; t: string;

View File

@@ -478,3 +478,7 @@ export interface SetDataFlowPathsMessage {
export type ToDataFlowPathsMessage = SetDataFlowPathsMessage; export type ToDataFlowPathsMessage = SetDataFlowPathsMessage;
export type FromDataFlowPathsMessage = CommonFromViewMessages; export type FromDataFlowPathsMessage = CommonFromViewMessages;
export type ToDataExtensionsEditorMessage = never;
export type FromDataExtensionsEditorMessage = ViewLoadedMsg;

View File

@@ -0,0 +1,5 @@
import * as React from "react";
export function DataExtensionsEditor(): JSX.Element {
return <div>Data extensions editor</div>;
}

View File

@@ -0,0 +1,9 @@
import * as React from "react";
import { WebviewDefinition } from "../webview-definition";
import { DataExtensionsEditor } from "./DataExtensionsEditor";
const definition: WebviewDefinition = {
component: <DataExtensionsEditor />,
};
export default definition;

View File

@@ -1,5 +1,6 @@
import { import {
FromCompareViewMessage, FromCompareViewMessage,
FromDataExtensionsEditorMessage,
FromResultsViewMsg, FromResultsViewMsg,
FromVariantAnalysisMessage, FromVariantAnalysisMessage,
VariantAnalysisState, VariantAnalysisState,
@@ -13,7 +14,8 @@ export interface VsCodeApi {
msg: msg:
| FromResultsViewMsg | FromResultsViewMsg
| FromCompareViewMessage | FromCompareViewMessage
| FromVariantAnalysisMessage, | FromVariantAnalysisMessage
| FromDataExtensionsEditorMessage,
): void; ): void;
/** /**