diff --git a/extensions/machine-learning/src/prediction/predictService.ts b/extensions/machine-learning/src/prediction/predictService.ts index 2bcbad8e14..0561fb29c2 100644 --- a/extensions/machine-learning/src/prediction/predictService.ts +++ b/extensions/machine-learning/src/prediction/predictService.ts @@ -80,11 +80,7 @@ export class PredictService { predictParams.outputColumns || [], predictParams); } - let document = await this._apiWrapper.openTextDocument({ - language: 'sql', - content: query - }); - await this._apiWrapper.executeCommand('vscode.open', document.uri); + const document = await azdata.queryeditor.openQueryDocument({ content: query }); await this._apiWrapper.connect(document.uri.toString(), connection.connectionId); this._apiWrapper.runQuery(document.uri.toString(), undefined, false); return query; diff --git a/extensions/mssql/src/main.ts b/extensions/mssql/src/main.ts index 22941da135..be621b3864 100644 --- a/extensions/mssql/src/main.ts +++ b/extensions/mssql/src/main.ts @@ -98,9 +98,7 @@ export async function activate(context: vscode.ExtensionContext): Promise doc.uri.toString() === uri.toString()); const result = await appContext.getService(Constants.NotebookConvertService).convertNotebookToSql(doc.getText()); - - const sqlDoc = await vscode.workspace.openTextDocument({ language: 'sql', content: result.content }); - await vscode.commands.executeCommand('vscode.open', sqlDoc.uri); + await azdata.queryeditor.openQueryDocument({ content: result.content }); } catch (err) { vscode.window.showErrorMessage(localize('mssql.errorConvertingToSQL', "An error occurred converting the Notebook document to SQL. Error : {0}", err.toString())); } diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 567e5ac416..74fa06aa02 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -9,6 +9,19 @@ import * as vscode from 'vscode'; declare module 'azdata' { + export namespace queryeditor { + /** + * Opens an untitled text document. The editor will prompt the user for a file + * path when the document is to be saved. The `options` parameter allows to + * specify the *content* of the document. + * + * @param options Options to control how the document will be created. + * @param providerId Optional provider ID this editor will be associated with. Defaults to MSSQL. + * @return A promise that resolves to a [document](#QueryDocument). + */ + export function openQueryDocument(options?: { content?: string; }, providerId?: string): Thenable; + } + export namespace nb { export interface NotebookDocument { /** diff --git a/src/sql/workbench/api/browser/mainThreadQueryEditor.ts b/src/sql/workbench/api/browser/mainThreadQueryEditor.ts index 4439d90f9e..dd419eabf5 100644 --- a/src/sql/workbench/api/browser/mainThreadQueryEditor.ts +++ b/src/sql/workbench/api/browser/mainThreadQueryEditor.ts @@ -16,6 +16,8 @@ import { IQueryManagementService } from 'sql/workbench/services/query/common/que import { IConnectionProfile } from 'sql/platform/connection/common/interfaces'; import { ConnectionProfile } from 'sql/platform/connection/common/connectionProfile'; import { ILogService } from 'vs/platform/log/common/log'; +import { URI } from 'vs/base/common/uri'; +import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService'; @extHostNamedCustomer(SqlMainContext.MainThreadQueryEditor) export class MainThreadQueryEditor extends Disposable implements MainThreadQueryEditorShape { @@ -29,7 +31,8 @@ export class MainThreadQueryEditor extends Disposable implements MainThreadQuery @IQueryModelService private _queryModelService: IQueryModelService, @IEditorService private _editorService: IEditorService, @IQueryManagementService private _queryManagementService: IQueryManagementService, - @ILogService private _logService: ILogService + @ILogService private _logService: ILogService, + @IQueryEditorService private _queryEditorService: IQueryEditorService ) { super(); if (extHostContext) { @@ -145,4 +148,9 @@ export class MainThreadQueryEditor extends Disposable implements MainThreadQuery public $setQueryExecutionOptions(fileUri: string, options: azdata.QueryExecutionOptions): Thenable { return this._queryManagementService.setQueryExecutionOptions(fileUri, options); } + + public async $createQueryDocument(options?: { content?: string }, providerId?: string): Promise { + const queryInput = await this._queryEditorService.newSqlEditor({ initalContent: options.content }, providerId); + return queryInput.resource; + } } diff --git a/src/sql/workbench/api/common/extHostQueryEditor.ts b/src/sql/workbench/api/common/extHostQueryEditor.ts index 0808434628..9c37921f11 100644 --- a/src/sql/workbench/api/common/extHostQueryEditor.ts +++ b/src/sql/workbench/api/common/extHostQueryEditor.ts @@ -9,6 +9,7 @@ import * as azdata from 'azdata'; import { IQueryEvent } from 'sql/workbench/services/query/common/queryModel'; import { mssqlProviderName } from 'sql/platform/connection/common/constants'; import { Disposable } from 'vs/workbench/api/common/extHostTypes'; +import { URI } from 'vs/base/common/uri'; class ExtHostQueryDocument implements azdata.queryeditor.QueryDocument { constructor( @@ -77,4 +78,7 @@ export class ExtHostQueryEditor implements ExtHostQueryEditorShape { }); } + public createQueryDocument(options?: { content?: string }, providerId?: string): Promise { + return this._proxy.$createQueryDocument(options, providerId).then(data => URI.revive(data)); + } } diff --git a/src/sql/workbench/api/common/sqlExtHost.api.impl.ts b/src/sql/workbench/api/common/sqlExtHost.api.impl.ts index 3798048e76..28c8ab71fa 100644 --- a/src/sql/workbench/api/common/sqlExtHost.api.impl.ts +++ b/src/sql/workbench/api/common/sqlExtHost.api.impl.ts @@ -35,6 +35,7 @@ import { IExtensionApiFactory as vsIApiFactory, createApiFactoryAndRegisterActor import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostWorkspace } from 'sql/workbench/api/common/extHostWorkspace'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; +import { URI } from 'vs/base/common/uri'; export interface IAzdataExtensionApiFactory { (extension: IExtensionDescription): typeof azdata; @@ -96,7 +97,6 @@ export function createAdsApiFactory(accessor: ServicesAccessor): IAdsExtensionAp const extHostNotebookDocumentsAndEditors = rpcProtocol.set(SqlExtHostContext.ExtHostNotebookDocumentsAndEditors, new ExtHostNotebookDocumentsAndEditors(rpcProtocol)); const extHostExtensionManagement = rpcProtocol.set(SqlExtHostContext.ExtHostExtensionManagement, new ExtHostExtensionManagement(rpcProtocol)); const extHostWorkspace = rpcProtocol.set(SqlExtHostContext.ExtHostWorkspace, new ExtHostWorkspace(rpcProtocol)); - return { azdata: function (extension: IExtensionDescription): typeof azdata { // namespace: connection @@ -506,6 +506,15 @@ export function createAdsApiFactory(accessor: ServicesAccessor): IAdsExtensionAp getQueryDocument(fileUri: string): Thenable { return extHostQueryEditor.$getQueryDocument(fileUri); + }, + + openQueryDocument(options?: { content?: string; }, providerId?: string): Thenable { + let uriPromise: Thenable; + + uriPromise = extHostQueryEditor.createQueryDocument(options, providerId); + return uriPromise.then(uri => { + return extHostQueryEditor.$getQueryDocument(uri.toString()); + }); } }; diff --git a/src/sql/workbench/api/common/sqlExtHost.protocol.ts b/src/sql/workbench/api/common/sqlExtHost.protocol.ts index 00bd4f1920..850e810ba2 100644 --- a/src/sql/workbench/api/common/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/common/sqlExtHost.protocol.ts @@ -7,7 +7,7 @@ import { createMainContextProxyIdentifier as createMainId, createExtHostContextProxyIdentifier as createExtId } from 'vs/workbench/services/extensions/common/proxyIdentifier'; -import { UriComponents } from 'vs/base/common/uri'; +import { URI, UriComponents } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -847,6 +847,7 @@ export interface MainThreadQueryEditorShape extends IDisposable { $setQueryExecutionOptions(fileUri: string, options: azdata.QueryExecutionOptions): Thenable; $registerQueryInfoListener(handle: number): void; $unregisterQueryInfoListener(handle: number): void; + $createQueryDocument(options?: { content?: string }, providerId?: string): Promise; } export interface ExtHostNotebookShape {