Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,15 @@ import { redactableError } from "../common/errors";
import { extLogger } from "../common/logging/vscode";
import { isQueryLanguage } from "../common/query-language";
import { setUpPack } from "./external-api-usage-query";
import { DisposableObject } from "../common/disposable-object";
import { ModelDetailsPanel } from "./model-details/model-details-panel";
import { Mode } from "./shared/mode";

const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];

export class DataExtensionsEditorModule {
export class DataExtensionsEditorModule extends DisposableObject {
private readonly queryStorageDir: string;
private readonly modelDetailsPanel: ModelDetailsPanel;

private constructor(
private readonly ctx: ExtensionContext,
Expand All @@ -34,10 +38,12 @@ export class DataExtensionsEditorModule {
private readonly queryRunner: QueryRunner,
baseQueryStorageDir: string,
) {
super();
this.queryStorageDir = join(
baseQueryStorageDir,
"data-extensions-editor-results",
);
this.modelDetailsPanel = this.push(new ModelDetailsPanel());
}

public static async initialize(
Expand Down Expand Up @@ -138,6 +144,8 @@ export class DataExtensionsEditorModule {
queryDir,
db,
modelFile,
Mode.Application,
(usages) => this.modelDetailsPanel.setExternalApiUsages(usages),
);
await view.openView();
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,10 @@ export class DataExtensionsEditorView extends AbstractWebview<
private readonly queryDir: string,
private readonly databaseItem: DatabaseItem,
private readonly extensionPack: ExtensionPack,
private mode: Mode = Mode.Application,
private mode: Mode,
private readonly onExternalApiUsagesChanged: (
externalApiUsages: ExternalApiUsage[],
) => void,
) {
super(ctx);
}
Expand Down Expand Up @@ -307,6 +310,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
t: "setExternalApiUsages",
externalApiUsages,
});
this.onExternalApiUsagesChanged(externalApiUsages);
} catch (err) {
void showAndLogExceptionWithTelemetry(
this.app.logger,
Expand Down Expand Up @@ -588,6 +592,7 @@ export class DataExtensionsEditorView extends AbstractWebview<
addedDatabase,
modelFile,
Mode.Framework,
this.onExternalApiUsagesChanged,
);
await view.openView();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export enum CallClassification {
Generated = "generated",
}

type Usage = Call & {
export type Usage = Call & {
classification: CallClassification;
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import {
Event,
EventEmitter,
TreeDataProvider,
TreeItem,
TreeItemCollapsibleState,
} from "vscode";
import { DisposableObject } from "../../common/disposable-object";
import { ExternalApiUsage, Usage } from "../external-api-usage";

export class ModelDetailsDataProvider
extends DisposableObject
implements TreeDataProvider<ModelDetailsTreeViewItem>
{
private externalApiUsages: ExternalApiUsage[] = [];

private readonly onDidChangeTreeDataEmitter = this.push(
new EventEmitter<void>(),
);

public get onDidChangeTreeData(): Event<void> {
return this.onDidChangeTreeDataEmitter.event;
}

public setExternalApiUsages(externalApiUsages: ExternalApiUsage[]): void {
this.externalApiUsages = externalApiUsages;
this.onDidChangeTreeDataEmitter.fire();
}

getTreeItem(item: ModelDetailsTreeViewItem): TreeItem {
if (isExternalApiUsage(item)) {
return {
label: item.signature,
collapsibleState: TreeItemCollapsibleState.Collapsed,
};
} else {
return {
label: item.label,
collapsibleState: TreeItemCollapsibleState.None,
};
}
}

getChildren(item?: ModelDetailsTreeViewItem): ModelDetailsTreeViewItem[] {
if (item === undefined) {
return this.externalApiUsages;
} else if (isExternalApiUsage(item)) {
return item.usages;
} else {
return [];
}
}
}

type ModelDetailsTreeViewItem = ExternalApiUsage | Usage;

function isExternalApiUsage(
item: ModelDetailsTreeViewItem,
): item is ExternalApiUsage {
return (item as any).usages !== undefined;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { window } from "vscode";
import { DisposableObject } from "../../common/disposable-object";
import { ModelDetailsDataProvider } from "./model-details-data-provider";
import { ExternalApiUsage } from "../external-api-usage";

export class ModelDetailsPanel extends DisposableObject {
private readonly dataProvider: ModelDetailsDataProvider;

public constructor() {
super();

this.dataProvider = new ModelDetailsDataProvider();

const treeView = window.createTreeView("codeQLModelDetails", {
treeDataProvider: this.dataProvider,
});
this.push(treeView);
}

public setExternalApiUsages(externalApiUsages: ExternalApiUsage[]): void {
this.dataProvider.setExternalApiUsages(externalApiUsages);
}
}