From b96b8d4b5a535d93c97f13357bbe36b4f69d2afa Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Wed, 16 Aug 2023 12:13:46 -0500 Subject: [PATCH 1/7] WIP: Add feature to get schema description --- src/features/contracts.ts | 20 +++++++++++++++-- src/features/metadata.ts | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/features/metadata.ts diff --git a/src/features/contracts.ts b/src/features/contracts.ts index 1074616..e3412ed 100644 --- a/src/features/contracts.ts +++ b/src/features/contracts.ts @@ -3,10 +3,9 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { NotificationType } from "vscode-languageclient"; +import { RequestType, NotificationType } from "vscode-languageclient"; import * as telemetry from '@microsoft/ads-extension-telemetry'; - // ------------------------------- < Telemetry Sent Event > ------------------------------------ /** @@ -29,3 +28,20 @@ export class TelemetryParams { } } // ------------------------------- ------------------------------------ + +// ------------------------------- < Metadata API > ------------------------------------ + +export interface PgSchemaMetadataParams { + ownerUri: string; +} + +export namespace PgSchemaMetadataRequest { + export const type = + new RequestType('metadata/schema'); +} + +export interface PgSchemaMetadataResponse { + description: string; +} + +// ------------------------------- ------------------------------------ diff --git a/src/features/metadata.ts b/src/features/metadata.ts new file mode 100644 index 0000000..0b5a952 --- /dev/null +++ b/src/features/metadata.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { SqlOpsDataClient, SqlOpsFeature } from 'dataprotocol-client'; +import { ClientCapabilities, RPCMessageType, ServerCapabilities } from 'vscode-languageclient'; +import * as UUID from 'vscode-languageclient/lib/utils/uuid'; +import { Disposable } from 'vscode'; + +import { PgSchemaMetadataParams, PgSchemaMetadataRequest, PgSchemaMetadataResponse } from './contracts'; + +export class PgSchemaMetadataFeature extends SqlOpsFeature { + constructor(client: SqlOpsDataClient) { + super(client, [PgSchemaMetadataRequest.type]); + } + + public fillClientCapabilities(capabilities: ClientCapabilities): void { + } + + public initialize(capabilities: ServerCapabilities): void { + this.register(this.messages, { + id: UUID.generateUuid(), + registerOptions: undefined + }); + } + + protected registerProvider(options: undefined): Disposable { + const client = this._client; + + let getSchemaMetadata = (ownerUri: string): Thenable => { + const params: PgSchemaMetadataParams = { + ownerUri: ownerUri + }; + + return client.sendRequest(PgSchemaMetadataRequest.type, params).then( + r => r, + e => { + client.logFailedRequest(PgSchemaMetadataRequest.type, e); + return Promise.reject(e); + } + ); + }; + + // TODO: "register" the provider somehow + } +} From 110430d2b355fbacf4c52c928b5114fedca15a2e Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Mon, 21 Aug 2023 16:50:59 -0500 Subject: [PATCH 2/7] Match Lewis' latest naming convention --- src/features/{metadata.ts => context.ts} | 27 +++++++++++++++++------- src/features/contracts.ts | 16 +++++++------- 2 files changed, 27 insertions(+), 16 deletions(-) rename src/features/{metadata.ts => context.ts} (51%) diff --git a/src/features/metadata.ts b/src/features/context.ts similarity index 51% rename from src/features/metadata.ts rename to src/features/context.ts index 0b5a952..081f29a 100644 --- a/src/features/metadata.ts +++ b/src/features/context.ts @@ -5,14 +5,16 @@ import { SqlOpsDataClient, SqlOpsFeature } from 'dataprotocol-client'; import { ClientCapabilities, RPCMessageType, ServerCapabilities } from 'vscode-languageclient'; +import * as azdata from 'azdata'; +import * as contracts from './contracts'; import * as UUID from 'vscode-languageclient/lib/utils/uuid'; import { Disposable } from 'vscode'; -import { PgSchemaMetadataParams, PgSchemaMetadataRequest, PgSchemaMetadataResponse } from './contracts'; +import { ServerContextualizationParams, GetServerContextualizationRequest } from './contracts'; -export class PgSchemaMetadataFeature extends SqlOpsFeature { +export class ServerContextualizationServiceFeature extends SqlOpsFeature { constructor(client: SqlOpsDataClient) { - super(client, [PgSchemaMetadataRequest.type]); + super(client, [contracts.GenerateServerContextualizationNotification.type]); } public fillClientCapabilities(capabilities: ClientCapabilities): void { @@ -28,20 +30,29 @@ export class PgSchemaMetadataFeature extends SqlOpsFeature { protected registerProvider(options: undefined): Disposable { const client = this._client; - let getSchemaMetadata = (ownerUri: string): Thenable => { - const params: PgSchemaMetadataParams = { + const generateServerContextualization = (ownerUri: string): Thenable => { + // TODO: Implement + return Promise.resolve(true) + }; + + const getServerContextualization = (ownerUri: string): Thenable => { + const params: contracts.ServerContextualizationParams = { ownerUri: ownerUri }; - return client.sendRequest(PgSchemaMetadataRequest.type, params).then( + return client.sendRequest(contracts.GetServerContextualizationRequest.type, params).then( r => r, e => { - client.logFailedRequest(PgSchemaMetadataRequest.type, e); + client.logFailedRequest(contracts.GetServerContextualizationRequest.type, e); return Promise.reject(e); } ); }; - // TODO: "register" the provider somehow + return azdata.dataprotocol.registerServerContextualizationProvider({ + providerId: client.providerId, + generateServerContextualization: generateServerContextualization, + getServerContextualization: getServerContextualization + }); } } diff --git a/src/features/contracts.ts b/src/features/contracts.ts index e3412ed..90df7ad 100644 --- a/src/features/contracts.ts +++ b/src/features/contracts.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { RequestType, NotificationType } from "vscode-languageclient"; +import * as azdata from 'azdata'; import * as telemetry from '@microsoft/ads-extension-telemetry'; // ------------------------------- < Telemetry Sent Event > ------------------------------------ @@ -29,19 +30,18 @@ export class TelemetryParams { } // ------------------------------- ------------------------------------ -// ------------------------------- < Metadata API > ------------------------------------ +// ------------------------------- < Server Contextualization API > ------------------------------------ -export interface PgSchemaMetadataParams { +export interface ServerContextualizationParams { ownerUri: string; } -export namespace PgSchemaMetadataRequest { - export const type = - new RequestType('metadata/schema'); +export namespace GenerateServerContextualizationNotification { + export const type = new NotificationType('metadata/generateServerContext'); } -export interface PgSchemaMetadataResponse { - description: string; +export namespace GetServerContextualizationRequest { + export const type = new RequestType('metadata/getServerContext'); } -// ------------------------------- ------------------------------------ +// ------------------------------- ------------------------------------ From f54c0b55ccaba2580dde369f0ec4c973f94c74ec Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Wed, 23 Aug 2023 10:46:01 -0500 Subject: [PATCH 3/7] Guard against undefined function --- src/features/context.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/features/context.ts b/src/features/context.ts index 081f29a..47bddfe 100644 --- a/src/features/context.ts +++ b/src/features/context.ts @@ -49,10 +49,13 @@ export class ServerContextualizationServiceFeature extends SqlOpsFeature Date: Wed, 23 Aug 2023 11:43:50 -0500 Subject: [PATCH 4/7] Duplicate and match latest contracts from ADS --- src/features/context.ts | 7 +++---- src/features/contracts.ts | 12 ++++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/features/context.ts b/src/features/context.ts index 47bddfe..a955239 100644 --- a/src/features/context.ts +++ b/src/features/context.ts @@ -30,12 +30,11 @@ export class ServerContextualizationServiceFeature extends SqlOpsFeature => { - // TODO: Implement - return Promise.resolve(true) + const generateServerContextualization = (ownerUri: string): void => { + // TODO }; - const getServerContextualization = (ownerUri: string): Thenable => { + const getServerContextualization = (ownerUri: string): Thenable => { const params: contracts.ServerContextualizationParams = { ownerUri: ownerUri }; diff --git a/src/features/contracts.ts b/src/features/contracts.ts index 90df7ad..6710120 100644 --- a/src/features/contracts.ts +++ b/src/features/contracts.ts @@ -32,16 +32,24 @@ export class TelemetryParams { // ------------------------------- < Server Contextualization API > ------------------------------------ +/* Duplicated from azdata.proposed.d.ts in core ADS */ + export interface ServerContextualizationParams { ownerUri: string; } +export interface GetServerContextualizationResult { + context: string[]; +} + export namespace GenerateServerContextualizationNotification { - export const type = new NotificationType('metadata/generateServerContext'); + export const type = new NotificationType + ('metadata/generateServerContext'); } export namespace GetServerContextualizationRequest { - export const type = new RequestType('metadata/getServerContext'); + export const type = new RequestType + ('metadata/getServerContext'); } // ------------------------------- ------------------------------------ From 655507811a5051f84b8ac53ed85551e2bf8f6719 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 25 Aug 2023 10:25:21 -0500 Subject: [PATCH 5/7] Duplicate upstream type definitions as well --- gulpfile.js | 1 + typings/azdata.proposed.d.ts | 48 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 typings/azdata.proposed.d.ts diff --git a/gulpfile.js b/gulpfile.js index 4d9eadc..928e136 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -35,6 +35,7 @@ gulp.task('localization:process-package-json', function () { gulp.task('ext:compile-src', (done) => { return gulp.src([ config.paths.project.root + '/src/**/*.ts', + config.paths.project.root + '/typings/**/*.ts', config.paths.project.root + '/src/**/*.js']) .pipe(srcmap.init()) .pipe(tsProject()) diff --git a/typings/azdata.proposed.d.ts b/typings/azdata.proposed.d.ts new file mode 100644 index 0000000..e3546a4 --- /dev/null +++ b/typings/azdata.proposed.d.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** +* Duplicated from Lewis Sanchez's contextualization feature in ADS. +* The definitions are not exported from the core ADS package, so we have to +* duplicate them here. +* +* Cross your fingers, and hope the upstream defintions don't change. +*/ + +import { Disposable } from 'vscode'; + +declare module 'azdata' { + export namespace contextualization { + export interface GetServerContextualizationResult { + /** + * An array containing the generated server context. + */ + context: string[]; + } + + export interface ServerContextualizationProvider extends DataProvider { + /** + * Generates server context. + * @param ownerUri The URI of the connection to generate context for. + */ + generateServerContextualization(ownerUri: string): void; + + /** + * Gets server context, which can be in the form of create scripts but is left up each provider. + * @param ownerUri The URI of the connection to get context for. + */ + getServerContextualization(ownerUri: string): Thenable; + } + } + + export namespace dataprotocol { + /** + * Registers a server contextualization provider, which can provide context about a server to extensions like GitHub + * Copilot for improved suggestions. + * @param provider The provider to register + */ + export function registerServerContextualizationProvider(provider: contextualization.ServerContextualizationProvider): Disposable + } +} From 072f9db763b8b3293242893c07f140e5191b2371 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 25 Aug 2023 10:26:23 -0500 Subject: [PATCH 6/7] Add PG contextualization on extension activation ServerContextualizationServiceFeature --- src/main.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.ts b/src/main.ts index 50391aa..cbf1193 100644 --- a/src/main.ts +++ b/src/main.ts @@ -18,6 +18,7 @@ import ContextProvider from './contextProvider'; import * as Utils from './utils'; import { TelemetryReporter, LanguageClientErrorHandler } from './telemetry'; import { TelemetryFeature } from './features/telemetry'; +import { ServerContextualizationServiceFeature } from './features/context'; const baseConfig = require('./config.json'); const outputChannel = vscode.window.createOutputChannel(Constants.serviceName); @@ -54,7 +55,8 @@ export async function activate(context: vscode.ExtensionContext) { features: [ // we only want to add new features ...SqlOpsDataClient.defaultFeatures, - TelemetryFeature + TelemetryFeature, + ServerContextualizationServiceFeature ] }; From 7e6fe8dae6e780d33f63558fc2e94efc6471e758 Mon Sep 17 00:00:00 2001 From: Joe Nelson Date: Fri, 25 Aug 2023 14:46:01 -0500 Subject: [PATCH 7/7] Use another unstable API type from ADS GetServerContextualizationResult --- src/features/context.ts | 4 +--- src/features/contracts.ts | 19 +++++++++---------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/features/context.ts b/src/features/context.ts index a955239..9d87a97 100644 --- a/src/features/context.ts +++ b/src/features/context.ts @@ -10,8 +10,6 @@ import * as contracts from './contracts'; import * as UUID from 'vscode-languageclient/lib/utils/uuid'; import { Disposable } from 'vscode'; -import { ServerContextualizationParams, GetServerContextualizationRequest } from './contracts'; - export class ServerContextualizationServiceFeature extends SqlOpsFeature { constructor(client: SqlOpsDataClient) { super(client, [contracts.GenerateServerContextualizationNotification.type]); @@ -34,7 +32,7 @@ export class ServerContextualizationServiceFeature extends SqlOpsFeature => { + const getServerContextualization = (ownerUri: string): Thenable => { const params: contracts.ServerContextualizationParams = { ownerUri: ownerUri }; diff --git a/src/features/contracts.ts b/src/features/contracts.ts index 6710120..8f3d8ac 100644 --- a/src/features/contracts.ts +++ b/src/features/contracts.ts @@ -32,24 +32,23 @@ export class TelemetryParams { // ------------------------------- < Server Contextualization API > ------------------------------------ -/* Duplicated from azdata.proposed.d.ts in core ADS */ - export interface ServerContextualizationParams { ownerUri: string; } -export interface GetServerContextualizationResult { - context: string[]; -} - export namespace GenerateServerContextualizationNotification { - export const type = new NotificationType - ('metadata/generateServerContext'); + export const type = new NotificationType< + ServerContextualizationParams, void + >('metadata/generateServerContext'); } export namespace GetServerContextualizationRequest { - export const type = new RequestType - ('metadata/getServerContext'); + export const type = + new RequestType< + ServerContextualizationParams, + azdata.contextualization.GetServerContextualizationResult, + void, void + >('metadata/getServerContext'); } // ------------------------------- ------------------------------------