Merge from vscode e3c4990c67c40213af168300d1cfeb71d680f877 (#16569)

This commit is contained in:
Cory Rivera
2021-08-25 16:28:29 -07:00
committed by GitHub
parent ab1112bfb3
commit cb7b7da0a4
1752 changed files with 59525 additions and 33878 deletions

View File

@@ -8,7 +8,7 @@ import { QueryResultsInput } from 'sql/workbench/common/editor/query/queryResult
import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement';
import { IQueryModelService } from 'sql/workbench/services/query/common/queryModel';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IMoveResult, GroupIdentifier } from 'vs/workbench/common/editor';
import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel';

View File

@@ -62,6 +62,7 @@ export class SqlFlavorStatusbarItem extends Disposable implements IWorkbenchCont
private statusItem: IStatusbarEntryAccessor;
private _sqlStatusEditors: { [editorUri: string]: SqlProviderEntry };
private readonly name = nls.localize('status.query.flavor', "SQL Language Flavor");
constructor(
@IStatusbarService private readonly statusbarService: IStatusbarService,
@@ -73,12 +74,12 @@ export class SqlFlavorStatusbarItem extends Disposable implements IWorkbenchCont
this.statusItem = this._register(
this.statusbarService.addEntry({
name: this.name,
text: nls.localize('changeProvider', "Change SQL language provider"),
ariaLabel: nls.localize('changeProvider', "Change SQL language provider"),
command: 'sql.action.editor.changeProvider'
},
SqlFlavorStatusbarItem.ID,
nls.localize('status.query.flavor', "SQL Language Flavor"),
StatusbarAlignment.RIGHT, 100)
);
@@ -160,7 +161,8 @@ export class SqlFlavorStatusbarItem extends Disposable implements IWorkbenchCont
private updateFlavorElement(text: string): void {
const props: IStatusbarEntry = {
text,
name: this.name,
text: text,
ariaLabel: text,
command: 'sql.action.editor.changeProvider'
};

View File

@@ -15,7 +15,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
import { WorkbenchDataTree } from 'vs/platform/list/browser/listService';
import { isArray, isString } from 'vs/base/common/types';
import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle';
import { $, Dimension, createStyleSheet, addStandardDisposableGenericMouseDownListner, toggleClass } from 'vs/base/browser/dom';
import { $, Dimension, createStyleSheet, addStandardDisposableGenericMouseDownListner } from 'vs/base/browser/dom';
import { resultsErrorColor } from 'sql/platform/theme/common/colors';
import { CachedListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list';
import { FuzzyScore } from 'vs/base/common/filters';
@@ -34,7 +34,6 @@ import { IDataTreeViewState } from 'vs/base/browser/ui/tree/dataTree';
import { IRange } from 'vs/editor/common/core/range';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IQueryEditorConfiguration } from 'sql/platform/query/common/query';
import { push } from 'vs/base/common/arrays';
export interface IResultMessageIntern {
id?: string;
@@ -109,7 +108,7 @@ export class MessagePanel extends Disposable {
) {
super();
const wordWrap = this.configurationService.getValue<IQueryEditorConfiguration>('queryEditor').messages.wordwrap;
toggleClass(this.container, 'word-wrap', wordWrap);
this.container.classList.toggle('word-wrap', wordWrap);
this.tree = <WorkbenchDataTree<Model, IResultMessageIntern, FuzzyScore>>instantiationService.createInstance(
WorkbenchDataTree,
'MessagePanel',
@@ -202,7 +201,7 @@ export class MessagePanel extends Disposable {
private onMessage(message: IQueryMessage | IQueryMessage[], setInput: boolean = false) {
if (isArray(message)) {
push(this.model.messages, message);
this.model.messages.push(...message);
} else {
this.model.messages.push(message);
}

View File

@@ -30,7 +30,7 @@ import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle
import { TimeElapsedStatusBarContributions, RowCountStatusBarContributions, QueryStatusStatusBarContributions, QueryResultSelectionSummaryStatusBarContribution } from 'sql/workbench/contrib/query/browser/statusBarItems';
import { SqlFlavorStatusbarItem, ChangeFlavorAction } from 'sql/workbench/contrib/query/browser/flavorStatus';
import { EditorExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor';
import { FileQueryEditorInput } from 'sql/workbench/contrib/query/common/fileQueryEditorInput';
import { FileQueryEditorInput } from 'sql/workbench/contrib/query/browser/fileQueryEditorInput';
import { FileQueryEditorInputSerializer, QueryEditorLanguageAssociation, UntitledQueryEditorInputSerializer } from 'sql/workbench/contrib/query/browser/queryInputFactory';
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
import { ILanguageAssociationRegistry, Extensions as LanguageAssociationExtensions } from 'sql/workbench/services/languageAssociation/common/languageAssociation';
@@ -43,7 +43,7 @@ import { ItemContextKey } from 'sql/workbench/contrib/dashboard/browser/widgets/
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
import { IModeService } from 'vs/editor/common/services/modeService';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput';
import { IEditorOverrideService, ContributedEditorPriority } from 'vs/workbench/services/editor/common/editorOverrideService';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { ILogService } from 'vs/platform/log/common/log';
@@ -523,7 +523,7 @@ export class QueryEditorOverrideContribution extends Disposable implements IWork
// Create the selector from the list of all the language extensions we want to associate with the
// query editor (filtering out any languages which didn't have any extensions registered yet)
const selector = `*{${langExtensions.join(',')}}`;
this._registeredOverrides.add(this._editorOverrideService.registerContributionPoint(
this._registeredOverrides.add(this._editorOverrideService.registerEditor(
selector,
{
id: QueryEditor.ID,
@@ -537,7 +537,7 @@ export class QueryEditorOverrideContribution extends Disposable implements IWork
resource: resource
}) as FileEditorInput;
const langAssociation = languageAssociationRegistry.getAssociationForLanguage(lang);
const queryEditorInput = langAssociation?.syncConvertinput?.(fileInput);
const queryEditorInput = langAssociation?.syncConvertInput?.(fileInput);
if (!queryEditorInput) {
this._logService.warn('Unable to create input for overriding editor ', resource);
return undefined;

View File

@@ -8,7 +8,7 @@ import 'vs/css!./media/queryEditor';
import { localize } from 'vs/nls';
import * as DOM from 'vs/base/browser/dom';
import * as path from 'vs/base/common/path';
import { EditorOptions, IEditorControl, IEditorMemento, IEditorOpenContext } from 'vs/workbench/common/editor';
import { IEditorControl, IEditorMemento, IEditorOpenContext } from 'vs/workbench/common/editor';
import { EditorPane, EditorMemento } from 'vs/workbench/browser/parts/editor/editorPane';
import { Orientation } from 'vs/base/browser/ui/sash/sash';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@@ -28,7 +28,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle';
import { IAction } from 'vs/base/common/actions';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput';
import { URI } from 'vs/base/common/uri';
import { IFileService, FileChangesEvent } from 'vs/platform/files/common/files';
import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement';
@@ -41,6 +41,7 @@ import * as actions from 'sql/workbench/contrib/query/browser/queryActions';
import { IRange } from 'vs/editor/common/core/range';
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar';
import { IEditorOptions } from 'vs/platform/editor/common/editor';
const QUERY_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'queryEditorViewState';
@@ -337,7 +338,7 @@ export class QueryEditor extends EditorPane {
this.taskbar.setContent(content);
}
public override async setInput(newInput: QueryEditorInput, options: EditorOptions, context: IEditorOpenContext, token: CancellationToken): Promise<void> {
public override async setInput(newInput: QueryEditorInput, options: IEditorOptions, context: IEditorOpenContext, token: CancellationToken): Promise<void> {
const oldInput = this.input;
if (newInput.matches(oldInput)) {
@@ -513,7 +514,7 @@ export class QueryEditor extends EditorPane {
return this.currentTextEditor.getControl();
}
public override setOptions(options: EditorOptions): void {
public override setOptions(options: IEditorOptions): void {
this.currentTextEditor.setOptions(options);
}

View File

@@ -9,8 +9,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti
import { QueryResultsInput } from 'sql/workbench/common/editor/query/queryResultsInput';
import { FILE_EDITOR_INPUT_ID } from 'vs/workbench/contrib/files/common/files';
import { UntitledQueryEditorInput } from 'sql/workbench/common/editor/query/untitledQueryEditorInput';
import { FileQueryEditorInput } from 'sql/workbench/contrib/query/common/fileQueryEditorInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import { FileQueryEditorInput } from 'sql/workbench/contrib/query/browser/fileQueryEditorInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput';
import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput';
import { ILanguageAssociation } from 'sql/workbench/services/languageAssociation/common/languageAssociation';
import { QueryEditorInput } from 'sql/workbench/common/editor/query/queryEditorInput';
@@ -71,7 +71,7 @@ export class QueryEditorLanguageAssociation implements ILanguageAssociation {
return queryEditorInput;
}
syncConvertinput(activeEditor: IEditorInput): QueryEditorInput | undefined {
syncConvertInput(activeEditor: IEditorInput): QueryEditorInput | undefined {
const queryResultsInput = this.instantiationService.createInstance(QueryResultsInput, activeEditor.resource.toString(true));
let queryEditorInput: QueryEditorInput;
if (activeEditor instanceof FileEditorInput) {

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { EditorOptions, IEditorOpenContext } from 'vs/workbench/common/editor';
import { IEditorOpenContext } from 'vs/workbench/common/editor';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane';
@@ -20,6 +20,7 @@ import { QueryResultsView } from 'sql/workbench/contrib/query/browser/queryResul
import { CancellationToken } from 'vs/base/common/cancellation';
import { IStorageService } from 'vs/platform/storage/common/storage';
import { RESULTS_GRID_DEFAULTS } from 'sql/workbench/common/constants';
import { IEditorOptions } from 'vs/platform/editor/common/editor';
export const TextCompareEditorVisible = new RawContextKey<boolean>('textCompareEditorVisible', false);
@@ -130,7 +131,7 @@ export class QueryResultsEditor extends EditorPane {
this.resultsView.layout(dimension);
}
override setInput(input: QueryResultsInput, options: EditorOptions, context: IEditorOpenContext): Promise<void> {
override setInput(input: QueryResultsInput, options: IEditorOptions, context: IEditorOpenContext): Promise<void> {
super.setInput(input, options, context, CancellationToken.None);
this.resultsView.input = input;
return Promise.resolve<void>(null);

View File

@@ -24,6 +24,7 @@ export class TimeElapsedStatusBarContributions extends Disposable implements IWo
private intervalTimer = new IntervalTimer();
private disposable = this._register(new DisposableStore());
private readonly name = localize('status.query.timeElapsed', "Time Elapsed");
constructor(
@IStatusbarService private readonly statusbarService: IStatusbarService,
@@ -33,11 +34,11 @@ export class TimeElapsedStatusBarContributions extends Disposable implements IWo
super();
this.statusItem = this._register(
this.statusbarService.addEntry({
name: this.name,
text: '',
ariaLabel: ''
},
TimeElapsedStatusBarContributions.ID,
localize('status.query.timeElapsed', "Time Elapsed"),
StatusbarAlignment.RIGHT, 100)
);
@@ -93,6 +94,7 @@ export class TimeElapsedStatusBarContributions extends Disposable implements IWo
const value = runner.queryStartTime ? Date.now() - runner.queryStartTime.getTime() : 0;
const timeString = parseNumAsTimeString(value, false);
this.statusItem.update({
name: this.name,
text: timeString,
ariaLabel: timeString
});
@@ -101,6 +103,7 @@ export class TimeElapsedStatusBarContributions extends Disposable implements IWo
const value = runner.queryStartTime ? Date.now() - runner.queryStartTime.getTime() : 0;
const timeString = parseNumAsTimeString(value, false);
this.statusItem.update({
name: this.name,
text: timeString,
ariaLabel: timeString
});
@@ -109,6 +112,7 @@ export class TimeElapsedStatusBarContributions extends Disposable implements IWo
? runner.queryEndTime.getTime() - runner.queryStartTime.getTime() : 0;
const timeString = parseNumAsTimeString(value, false);
this.statusItem.update({
name: this.name,
text: timeString,
ariaLabel: timeString
});
@@ -124,6 +128,7 @@ export class RowCountStatusBarContributions extends Disposable implements IWorkb
private statusItem: IStatusbarEntryAccessor;
private disposable = this._register(new DisposableStore());
private readonly name = localize('status.query.rowCount', "Row Count");
constructor(
@IStatusbarService private readonly statusbarService: IStatusbarService,
@@ -133,11 +138,11 @@ export class RowCountStatusBarContributions extends Disposable implements IWorkb
super();
this.statusItem = this._register(
this.statusbarService.addEntry({
name: this.name,
text: '',
ariaLabel: ''
},
RowCountStatusBarContributions.ID,
localize('status.query.rowCount', "Row Count"),
StatusbarAlignment.RIGHT, 100)
);
@@ -201,7 +206,7 @@ export class RowCountStatusBarContributions extends Disposable implements IWorkb
return p + cnt;
}, 0);
const text = localize('rowCount', "{0} rows", rowCount.toLocaleString());
this.statusItem.update({ text, ariaLabel: text });
this.statusItem.update({ name: this.name, text: text, ariaLabel: text });
this.show();
}
}
@@ -220,11 +225,11 @@ export class QueryStatusStatusBarContributions extends Disposable implements IWo
super();
this._register(
this.statusbarService.addEntry({
name: localize('status.query.status', "Execution Status"),
text: localize('query.status.executing', "Executing query..."),
ariaLabel: localize('query.status.executing', "Executing query...")
},
QueryStatusStatusBarContributions.ID,
localize('status.query.status', "Execution Status"),
StatusbarAlignment.RIGHT, 100)
);
@@ -259,6 +264,7 @@ export class QueryStatusStatusBarContributions extends Disposable implements IWo
export class QueryResultSelectionSummaryStatusBarContribution extends Disposable implements IWorkbenchContribution {
private static readonly ID = 'status.query.selection-summary';
private statusItem: IStatusbarEntryAccessor;
private readonly name = localize('status.query.selection-summary', "Selection Summary");
constructor(
@IStatusbarService private readonly statusbarService: IStatusbarService,
@@ -269,11 +275,11 @@ export class QueryResultSelectionSummaryStatusBarContribution extends Disposable
super();
this.statusItem = this._register(
this.statusbarService.addEntry({
name: this.name,
text: '',
ariaLabel: ''
},
QueryResultSelectionSummaryStatusBarContribution.ID,
localize('status.query.selection-summary', "Selection Summary"),
StatusbarAlignment.RIGHT, 100)
);
this._register(editorService.onDidActiveEditorChange(() => { this.hide(); }, this));
@@ -302,6 +308,7 @@ export class QueryResultSelectionSummaryStatusBarContribution extends Disposable
const sum = numericValues.reduce((previous, current, idx, array) => previous + current);
const summaryText = localize('status.query.summaryText', "Average: {0} Count: {1} Sum: {2}", Number((sum / numericValues.length).toFixed(3)), selectedCells.length, sum);
this.statusItem.update({
name: this.name,
text: summaryText,
ariaLabel: summaryText
});

View File

@@ -73,8 +73,8 @@ suite('SQL QueryEditor Tests', () => {
// Mock EditorDescriptorService to give us a mock editor description
let descriptor: IEditorDescriptor = {
getId: function (): string { return 'id'; },
getName: function (): string { return 'name'; },
typeId: 'id',
name: 'name',
describes: function (obj: any): boolean { return true; },
instantiate(instantiationService: IInstantiationService): EditorPane { return undefined; }
};

View File

@@ -9,7 +9,7 @@ import { ITestInstantiationService, TestEditorService } from 'vs/workbench/test/
import { URI } from 'vs/base/common/uri';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorInput } from 'vs/workbench/common/editor';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/browser/editors/fileEditorInput';
import { workbenchInstantiationService } from 'sql/workbench/test/workbenchTestServices';
import { QueryEditorLanguageAssociation } from 'sql/workbench/contrib/query/browser/queryInputFactory';
import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/browser/objectExplorerService';
@@ -26,12 +26,13 @@ import { isThenable } from 'vs/base/common/async';
import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService';
import { QueryResultsInput } from 'sql/workbench/common/editor/query/queryResultsInput';
import { extUri } from 'vs/base/common/resources';
import { IResourceEditorInputIdentifier } from 'vs/platform/editor/common/editor';
suite('Query Input Factory', () => {
let instantiationService: ITestInstantiationService;
function createFileInput(resource: URI, preferredResource?: URI, preferredMode?: string, preferredName?: string, preferredDescription?: string): FileEditorInput {
return instantiationService.createInstance(FileEditorInput, resource, preferredResource, preferredName, preferredDescription, undefined, preferredMode);
return instantiationService.createInstance(FileEditorInput, resource, preferredResource, preferredName, preferredDescription, undefined, preferredMode, undefined);
}
test('sync query editor input is connected if global connection exists (OE)', async () => {
@@ -100,11 +101,11 @@ suite('Query Input Factory', () => {
const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation);
const untitledService = instantiationService.invokeFunction(accessor => accessor.get(IUntitledTextEditorService));
const queryeditorservice = instantiationService.invokeFunction(accessor => accessor.get(IQueryEditorService));
const newsqlEditorStub = sinon.stub(queryeditorservice, 'newSqlEditor', () => {
const newsqlEditorStub = sinon.stub(queryeditorservice, 'newSqlEditor').callsFake(() => {
const untitledInput = instantiationService.createInstance(UntitledTextEditorInput, untitledService.create());
const queryResultsInput: QueryResultsInput = instantiationService.createInstance(QueryResultsInput, untitledInput.resource.toString());
let queryInput = instantiationService.createInstance(UntitledQueryEditorInput, '', untitledInput, queryResultsInput);
return queryInput;
return Promise.resolve(queryInput);
});
const input = instantiationService.createInstance(UntitledTextEditorInput, untitledService.create());
const response = queryEditorLanguageAssociation.convertInput(input);
@@ -122,7 +123,7 @@ suite('Query Input Factory', () => {
instantiationService.stub(IEditorService, editorService);
const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation);
const input = createFileInput(URI.file('/test/file.sql'), undefined, undefined, undefined);
queryEditorLanguageAssociation.syncConvertinput(input);
queryEditorLanguageAssociation.syncConvertInput(input);
assert(connectionManagementService.numberConnects === 0, 'Convert input should not have been called connect when no global connections exist');
});
@@ -148,12 +149,12 @@ suite('Query Input Factory', () => {
const untitledService = instantiationService.invokeFunction(accessor => accessor.get(IUntitledTextEditorService));
const queryeditorservice = instantiationService.invokeFunction(accessor => accessor.get(IQueryEditorService));
const input = instantiationService.createInstance(UntitledTextEditorInput, untitledService.create());
sinon.stub(editorService, 'isOpened', (editor: IEditorInput) => extUri.isEqual(editor.resource, input.resource));
const newsqlEditorStub = sinon.stub(queryeditorservice, 'newSqlEditor', () => {
sinon.stub(editorService, 'isOpened').callsFake((editor: IResourceEditorInputIdentifier) => extUri.isEqual(editor.resource, input.resource));
const newsqlEditorStub = sinon.stub(queryeditorservice, 'newSqlEditor').callsFake(() => {
const untitledInput = instantiationService.createInstance(UntitledTextEditorInput, untitledService.create());
const queryResultsInput: QueryResultsInput = instantiationService.createInstance(QueryResultsInput, untitledInput.resource.toString());
let queryInput = instantiationService.createInstance(UntitledQueryEditorInput, '', untitledInput, queryResultsInput);
return queryInput;
return Promise.resolve(queryInput);
});
const response = queryEditorLanguageAssociation.convertInput(input);
assert(isThenable(response));