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/src/features/context.ts b/src/features/context.ts new file mode 100644 index 0000000..9d87a97 --- /dev/null +++ b/src/features/context.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * 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 azdata from 'azdata'; +import * as contracts from './contracts'; +import * as UUID from 'vscode-languageclient/lib/utils/uuid'; +import { Disposable } from 'vscode'; + +export class ServerContextualizationServiceFeature extends SqlOpsFeature { + constructor(client: SqlOpsDataClient) { + super(client, [contracts.GenerateServerContextualizationNotification.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; + + const generateServerContextualization = (ownerUri: string): void => { + // TODO + }; + + const getServerContextualization = (ownerUri: string): Thenable => { + const params: contracts.ServerContextualizationParams = { + ownerUri: ownerUri + }; + + return client.sendRequest(contracts.GetServerContextualizationRequest.type, params).then( + r => r, + e => { + client.logFailedRequest(contracts.GetServerContextualizationRequest.type, e); + return Promise.reject(e); + } + ); + }; + + // register the provider if the API is available in the current version of ADS + return azdata.dataprotocol.registerServerContextualizationProvider + ? azdata.dataprotocol.registerServerContextualizationProvider({ + providerId: client.providerId, + generateServerContextualization: generateServerContextualization, + getServerContextualization: getServerContextualization + }) + : Disposable.from(); + } +} diff --git a/src/features/contracts.ts b/src/features/contracts.ts index 1074616..8f3d8ac 100644 --- a/src/features/contracts.ts +++ b/src/features/contracts.ts @@ -3,10 +3,10 @@ * 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 azdata from 'azdata'; import * as telemetry from '@microsoft/ads-extension-telemetry'; - // ------------------------------- < Telemetry Sent Event > ------------------------------------ /** @@ -29,3 +29,26 @@ export class TelemetryParams { } } // ------------------------------- ------------------------------------ + +// ------------------------------- < Server Contextualization API > ------------------------------------ + +export interface ServerContextualizationParams { + ownerUri: string; +} + +export namespace GenerateServerContextualizationNotification { + export const type = new NotificationType< + ServerContextualizationParams, void + >('metadata/generateServerContext'); +} + +export namespace GetServerContextualizationRequest { + export const type = + new RequestType< + ServerContextualizationParams, + azdata.contextualization.GetServerContextualizationResult, + void, void + >('metadata/getServerContext'); +} + +// ------------------------------- ------------------------------------ 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 ] }; 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 + } +}