Bug/restore query editor tabs (#6654)

* trial run for query editor temp file fix

* Fixing restore tabs bug with right layering

* Moving FileService change from vscode to our code
This commit is contained in:
Udeesha Gautam
2019-08-13 18:41:25 -07:00
committed by GitHub
parent b5fdf8c2a7
commit a645a09f42
5 changed files with 38 additions and 13 deletions

View File

@@ -10,6 +10,7 @@ import { URI } from 'vs/base/common/uri';
import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput';
import { EditorInput, ConfirmResult, EncodingMode, IEncodingSupport } from 'vs/workbench/common/editor'; import { EditorInput, ConfirmResult, EncodingMode, IEncodingSupport } from 'vs/workbench/common/editor';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { IFileService } from 'vs/platform/files/common/files';
import { IConnectionManagementService, IConnectableInput, INewConnectionParams, RunQueryOnConnectionMode } from 'sql/platform/connection/common/connectionManagement'; import { IConnectionManagementService, IConnectableInput, INewConnectionParams, RunQueryOnConnectionMode } from 'sql/platform/connection/common/connectionManagement';
import { QueryResultsInput } from 'sql/workbench/parts/query/common/queryResultsInput'; import { QueryResultsInput } from 'sql/workbench/parts/query/common/queryResultsInput';
@@ -18,6 +19,7 @@ import { IQueryModelService } from 'sql/platform/query/common/queryModel';
import { ISelectionData, ExecutionPlanOptions } from 'azdata'; import { ISelectionData, ExecutionPlanOptions } from 'azdata';
import { UntitledEditorModel } from 'vs/workbench/common/editor/untitledEditorModel'; import { UntitledEditorModel } from 'vs/workbench/common/editor/untitledEditorModel';
import { IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService'; import { IResolvedTextEditorModel } from 'vs/editor/common/services/resolverService';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
const MAX_SIZE = 13; const MAX_SIZE = 13;
@@ -117,7 +119,8 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec
private _connectionProviderName: string, private _connectionProviderName: string,
@IConnectionManagementService private _connectionManagementService: IConnectionManagementService, @IConnectionManagementService private _connectionManagementService: IConnectionManagementService,
@IQueryModelService private _queryModelService: IQueryModelService, @IQueryModelService private _queryModelService: IQueryModelService,
@IConfigurationService private _configurationService: IConfigurationService @IConfigurationService private _configurationService: IConfigurationService,
@IFileService private _fileService: IFileService
) { ) {
super(); super();
this._updateSelection = new Emitter<ISelectionData>(); this._updateSelection = new Emitter<ISelectionData>();
@@ -218,6 +221,14 @@ export class QueryInput extends EditorInput implements IEncodingSupport, IConnec
return false; return false;
} }
public matchInputInstanceType(inputType: any): boolean {
return (this._sql instanceof inputType);
}
public inputFileExists(): Promise<boolean> {
return this._fileService.exists(this.getResource());
}
public getName(longForm?: boolean): string { public getName(longForm?: boolean): string {
if (this._configurationService.getValue('sql.showConnectionInfoInTitle')) { if (this._configurationService.getValue('sql.showConnectionInfoInTitle')) {
let profile = this._connectionManagementService.getConnectionProfile(this.uri); let profile = this._connectionManagementService.getConnectionProfile(this.uri);

View File

@@ -294,6 +294,7 @@ suite('SQL QueryEditor Tests', () => {
undefined, undefined,
connectionManagementService.object, connectionManagementService.object,
queryModelService.object, queryModelService.object,
undefined,
undefined undefined
); );
}); });

View File

@@ -76,7 +76,7 @@ suite('TaskUtilities', function () {
// Mock the workbench service to return the active tab connection // Mock the workbench service to return the active tab connection
let tabConnectionUri = 'file://test_uri'; let tabConnectionUri = 'file://test_uri';
let editorInput = new UntitledEditorInput(URI.parse(tabConnectionUri), false, undefined, undefined, undefined, undefined, undefined, undefined); let editorInput = new UntitledEditorInput(URI.parse(tabConnectionUri), false, undefined, undefined, undefined, undefined, undefined, undefined);
let queryInput = new QueryInput(undefined, editorInput, undefined, undefined, undefined, undefined, undefined); let queryInput = new QueryInput(undefined, editorInput, undefined, undefined, undefined, undefined, undefined, undefined);
mockConnectionManagementService.setup(x => x.getConnectionProfile(tabConnectionUri)).returns(() => tabProfile); mockConnectionManagementService.setup(x => x.getConnectionProfile(tabConnectionUri)).returns(() => tabProfile);
// If I call getCurrentGlobalConnection, it should return the expected profile from the active tab // If I call getCurrentGlobalConnection, it should return the expected profile from the active tab

View File

@@ -426,6 +426,8 @@ export class EditorGroupView extends Themable implements IEditorGroupView {
} }
private async restoreEditors(from: IEditorGroupView | ISerializedEditorGroup): Promise<void> { private async restoreEditors(from: IEditorGroupView | ISerializedEditorGroup): Promise<void> {
await this._group.removeNonExitingEditor(); // {{SQL CARBON EDIT}} @udeeshagautam perform async correction for non-existing files
if (this._group.count === 0) { if (this._group.count === 0) {
return; // nothing to show return; // nothing to show
} }

View File

@@ -19,8 +19,6 @@ import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorIn
import * as CustomInputConverter from 'sql/workbench/common/customInputConverter'; import * as CustomInputConverter from 'sql/workbench/common/customInputConverter';
import { NotebookInput } from 'sql/workbench/parts/notebook/common/models/notebookInput'; import { NotebookInput } from 'sql/workbench/parts/notebook/common/models/notebookInput';
import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput';
import * as path from 'vs/base/common/path';
import * as os from 'os';
const EditorOpenPositioning = { const EditorOpenPositioning = {
LEFT: 'left', LEFT: 'left',
@@ -666,15 +664,6 @@ export class EditorGroup extends Disposable {
&& !this.configurationService.getValue<boolean>('sql.promptToSaveGeneratedFiles')) { && !this.configurationService.getValue<boolean>('sql.promptToSaveGeneratedFiles')) {
return; return;
} }
// Do not add generated files from Temp if file is not dirty
if (e instanceof FileEditorInput && !e.isDirty()) {
let filePath = e.getResource() ? e.getResource().fsPath : undefined;
let tempPath = os.tmpdir();
if (filePath && tempPath &&
filePath.toLocaleLowerCase().includes(path.join(tempPath.toLocaleLowerCase(), 'mssql_definition'))) {
return;
}
}
// {{SQL CARBON EDIT}} - End // {{SQL CARBON EDIT}} - End
const value = factory.serialize(e); const value = factory.serialize(e);
@@ -740,4 +729,26 @@ export class EditorGroup extends Disposable {
this.preview = this.editors[data.preview]; this.preview = this.editors[data.preview];
} }
} }
// {{SQL CARBON EDIT}}
async removeNonExitingEditor(): Promise<void> {
let n = 0;
while (n < this.editors.length) {
let editor = this.editors[n];
if (editor instanceof QueryInput && editor.matchInputInstanceType(FileEditorInput) && !editor.isDirty() && await editor.inputFileExists() === false && this.editors.length > 1) {
// remove from editors list so that they do not get restored
this.editors.splice(n, 1);
let index = this.mru.findIndex(e => e.matches(editor));
// remove from MRU list otherwise later if we try to close them it leaves a sticky active editor with no data
this.mru.splice(index, 1);
this.active = this.isActive(editor) ? this.editors[0] : this.active;
editor.close();
}
else {
n++;
}
}
}
// {{SQL CARBON EDIT}}
} }