Skip to content
Draft
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
1 change: 1 addition & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
58 changes: 58 additions & 0 deletions src/features/context.ts
Original file line number Diff line number Diff line change
@@ -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<undefined> {
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<azdata.contextualization.GetServerContextualizationResult> => {
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();
}
}
27 changes: 25 additions & 2 deletions src/features/contracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 > ------------------------------------

/**
Expand All @@ -29,3 +29,26 @@ export class TelemetryParams {
}
}
// ------------------------------- </ Telemetry Sent Event > ------------------------------------

// ------------------------------- < 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');
}

// ------------------------------- </ Server Contextualization API > ------------------------------------
4 changes: 3 additions & 1 deletion src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -54,7 +55,8 @@ export async function activate(context: vscode.ExtensionContext) {
features: [
// we only want to add new features
...SqlOpsDataClient.defaultFeatures,
TelemetryFeature
TelemetryFeature,
ServerContextualizationServiceFeature
]
};

Expand Down
48 changes: 48 additions & 0 deletions typings/azdata.proposed.d.ts
Original file line number Diff line number Diff line change
@@ -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<GetServerContextualizationResult>;
}
}

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
}
}