Skip to content

Commit f0983ab

Browse files
committed
1 parent ce3f0c1 commit f0983ab

8 files changed

Lines changed: 130 additions & 134 deletions

File tree

src/tsconfig.strictNullChecks.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"./vs/workbench/services/themes/**/*.ts",
2929
"./vs/workbench/services/bulkEdit/**/*.ts",
3030
"./vs/workbench/services/progress/**/*.ts",
31+
"./vs/workbench/services/preferences/**/*.ts",
3132
"./vs/workbench/services/timer/**/*.ts"
3233
],
3334
"files": [

src/vs/workbench/common/editor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ export class SideBySideEditorInput extends EditorInput {
533533

534534
static readonly ID: string = 'workbench.editorinputs.sidebysideEditorInput';
535535

536-
constructor(private name: string, private description: string, private _details: EditorInput, private _master: EditorInput) {
536+
constructor(private name: string, private description: string | null, private _details: EditorInput, private _master: EditorInput) {
537537
super();
538538

539539
this.registerListeners();
@@ -602,7 +602,7 @@ export class SideBySideEditorInput extends EditorInput {
602602
return this.name;
603603
}
604604

605-
getDescription(): string {
605+
getDescription(): string | null {
606606
return this.description;
607607
}
608608

src/vs/workbench/contrib/preferences/electron-browser/preferencesSearch.ts

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { IPreferencesSearchService, ISearchProvider, IWorkbenchSettingsConfigura
2323
import { CancellationToken } from 'vs/base/common/cancellation';
2424
import { canceled } from 'vs/base/common/errors';
2525
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
26+
import { nullRange } from 'vs/workbench/services/preferences/common/preferencesModels';
2627

2728
export interface IEndpointDetails {
2829
urlBase: string;
@@ -426,12 +427,12 @@ function remoteSettingToISetting(remoteSetting: IRemoteSetting): IExtensionSetti
426427
return {
427428
description: remoteSetting.description.split('\n'),
428429
descriptionIsMarkdown: false,
429-
descriptionRanges: null,
430+
descriptionRanges: [],
430431
key: remoteSetting.key,
431-
keyRange: null,
432+
keyRange: nullRange,
432433
value: remoteSetting.defaultValue,
433-
range: null,
434-
valueRange: null,
434+
range: nullRange,
435+
valueRange: nullRange,
435436
overrides: [],
436437
extensionName: remoteSetting.extensionName,
437438
extensionPublisher: remoteSetting.extensionPublisher
@@ -536,16 +537,6 @@ class SettingMatches {
536537
}
537538

538539
private toKeyRange(setting: ISetting, match: IMatch): IRange {
539-
if (!setting.keyRange) {
540-
// No source range? Return fake range, don't care
541-
return {
542-
startLineNumber: 0,
543-
startColumn: 0,
544-
endLineNumber: 0,
545-
endColumn: 0,
546-
};
547-
}
548-
549540
return {
550541
startLineNumber: setting.keyRange.startLineNumber,
551542
startColumn: setting.keyRange.startColumn + match.start,
@@ -555,16 +546,6 @@ class SettingMatches {
555546
}
556547

557548
private toDescriptionRange(setting: ISetting, match: IMatch, lineIndex: number): IRange {
558-
if (!setting.keyRange) {
559-
// No source range? Return fake range, don't care
560-
return {
561-
startLineNumber: 0,
562-
startColumn: 0,
563-
endLineNumber: 0,
564-
endColumn: 0,
565-
};
566-
}
567-
568549
return {
569550
startLineNumber: setting.descriptionRanges[lineIndex].startLineNumber,
570551
startColumn: setting.descriptionRanges[lineIndex].startColumn + match.start,
@@ -574,16 +555,6 @@ class SettingMatches {
574555
}
575556

576557
private toValueRange(setting: ISetting, match: IMatch): IRange {
577-
if (!setting.keyRange) {
578-
// No source range? Return fake range, don't care
579-
return {
580-
startLineNumber: 0,
581-
startColumn: 0,
582-
endLineNumber: 0,
583-
endColumn: 0,
584-
};
585-
}
586-
587558
return {
588559
startLineNumber: setting.valueRange.startLineNumber,
589560
startColumn: setting.valueRange.startColumn + match.start + 1,

src/vs/workbench/services/preferences/browser/preferencesService.ts

Lines changed: 68 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -89,22 +89,22 @@ export class PreferencesService extends Disposable implements IPreferencesServic
8989
private readonly defaultSettingsRawResource = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/defaultSettings.json' });
9090

9191
get userSettingsResource(): URI {
92-
return this.getEditableSettingsURI(ConfigurationTarget.USER);
92+
return this.getEditableSettingsURI(ConfigurationTarget.USER)!;
9393
}
9494

95-
get workspaceSettingsResource(): URI {
95+
get workspaceSettingsResource(): URI | null {
9696
return this.getEditableSettingsURI(ConfigurationTarget.WORKSPACE);
9797
}
9898

9999
get settingsEditor2Input(): SettingsEditor2Input {
100100
return this.instantiationService.createInstance(SettingsEditor2Input);
101101
}
102102

103-
getFolderSettingsResource(resource: URI): URI {
103+
getFolderSettingsResource(resource: URI): URI | null {
104104
return this.getEditableSettingsURI(ConfigurationTarget.WORKSPACE_FOLDER, resource);
105105
}
106106

107-
resolveModel(uri: URI): Promise<ITextModel> {
107+
resolveModel(uri: URI): Promise<ITextModel | null> {
108108
if (this.isDefaultSettingsResource(uri)) {
109109

110110
const target = this.getConfigurationTargetFromDefaultSettingsResource(uri);
@@ -156,7 +156,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
156156
return this.createDefaultSettingsEditorModel(uri);
157157
}
158158

159-
if (this.getEditableSettingsURI(ConfigurationTarget.USER).toString() === uri.toString()) {
159+
if (this.userSettingsResource.toString() === uri.toString()) {
160160
return this.createEditableSettingsEditorModel(ConfigurationTarget.USER, uri);
161161
}
162162

@@ -169,7 +169,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
169169
return this.createEditableSettingsEditorModel(ConfigurationTarget.WORKSPACE_FOLDER, uri);
170170
}
171171

172-
return Promise.resolve<IPreferencesEditorModel<any>>(null);
172+
return Promise.reject(`unknown resource: ${uri.toString()}`);
173173
}
174174

175175
openRawDefaultSettings(): Promise<IEditor> {
@@ -190,15 +190,15 @@ export class PreferencesService extends Disposable implements IPreferencesServic
190190
}
191191

192192
const editorInput = this.getActiveSettingsEditorInput() || this.lastOpenedSettingsInput;
193-
const resource = editorInput ? editorInput.master.getResource() : this.userSettingsResource;
193+
const resource = editorInput ? editorInput.master.getResource()! : this.userSettingsResource;
194194
const target = this.getConfigurationTargetFromSettingsResource(resource);
195195
return this.openOrSwitchSettings(target, resource);
196196
}
197197

198198
private openSettings2(): Promise<IEditor> {
199199
const input = this.settingsEditor2Input;
200200
return this.editorGroupService.activeGroup.openEditor(input)
201-
.then(() => this.editorGroupService.activeGroup.activeControl);
201+
.then(() => this.editorGroupService.activeGroup.activeControl!);
202202
}
203203

204204
openGlobalSettings(jsonEditor?: boolean, options?: ISettingsEditorOptions, group?: IEditorGroup): Promise<IEditor> {
@@ -211,14 +211,14 @@ export class PreferencesService extends Disposable implements IPreferencesServic
211211
this.openOrSwitchSettings2(ConfigurationTarget.USER, undefined, options, group);
212212
}
213213

214-
openWorkspaceSettings(jsonEditor?: boolean, options?: ISettingsEditorOptions, group?: IEditorGroup): Promise<IEditor | null> {
214+
openWorkspaceSettings(jsonEditor?: boolean, options?: ISettingsEditorOptions, group?: IEditorGroup): Promise<IEditor> {
215215
jsonEditor = typeof jsonEditor === 'undefined' ?
216216
this.configurationService.getValue('workbench.settings.editor') === 'json' :
217217
jsonEditor;
218218

219-
if (this.contextService.getWorkbenchState() === WorkbenchState.EMPTY) {
219+
if (!this.workspaceSettingsResource) {
220220
this.notificationService.info(nls.localize('openFolderFirst', "Open a folder first to create workspace settings"));
221-
return Promise.resolve(null);
221+
return Promise.reject(null);
222222
}
223223

224224
return jsonEditor ?
@@ -230,22 +230,26 @@ export class PreferencesService extends Disposable implements IPreferencesServic
230230
jsonEditor = typeof jsonEditor === 'undefined' ?
231231
this.configurationService.getValue('workbench.settings.editor') === 'json' :
232232
jsonEditor;
233-
234-
return jsonEditor ?
235-
this.openOrSwitchSettings(ConfigurationTarget.WORKSPACE_FOLDER, this.getEditableSettingsURI(ConfigurationTarget.WORKSPACE_FOLDER, folder), options, group) :
236-
this.openOrSwitchSettings2(ConfigurationTarget.WORKSPACE_FOLDER, folder, options, group);
233+
const folderSettingsUri = this.getEditableSettingsURI(ConfigurationTarget.WORKSPACE_FOLDER, folder);
234+
if (jsonEditor) {
235+
if (folderSettingsUri) {
236+
return this.openOrSwitchSettings(ConfigurationTarget.WORKSPACE_FOLDER, folderSettingsUri, options, group);
237+
}
238+
return Promise.reject(`Invalid folder URI - ${folder.toString()}`);
239+
}
240+
return this.openOrSwitchSettings2(ConfigurationTarget.WORKSPACE_FOLDER, folder, options, group);
237241
}
238242

239243
switchSettings(target: ConfigurationTarget, resource: URI, jsonEditor?: boolean): Promise<void> {
240244
if (!jsonEditor) {
241-
return this.doOpenSettings2(target, resource).then(() => null);
245+
return this.doOpenSettings2(target, resource).then(() => undefined);
242246
}
243247

244248
const activeControl = this.editorService.activeControl;
245249
if (activeControl && activeControl.input instanceof PreferencesEditorInput) {
246-
return this.doSwitchSettings(target, resource, activeControl.input, activeControl.group).then(() => null);
250+
return this.doSwitchSettings(target, resource, activeControl.input, activeControl.group).then(() => undefined);
247251
} else {
248-
return this.doOpenSettings(target, resource).then(() => null);
252+
return this.doOpenSettings(target, resource).then(() => undefined);
249253
}
250254
}
251255

@@ -276,7 +280,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
276280
});
277281
}
278282

279-
return this.editorService.openEditor(this.instantiationService.createInstance(KeybindingsEditorInput), { pinned: true, revealIfOpened: true }).then(() => null);
283+
return this.editorService.openEditor(this.instantiationService.createInstance(KeybindingsEditorInput), { pinned: true, revealIfOpened: true }).then(() => undefined);
280284
}
281285

282286
openDefaultKeybindingsFile(): Promise<IEditor> {
@@ -291,7 +295,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
291295
if (codeEditor) {
292296
this.addLanguageOverrideEntry(language, settingsModel, codeEditor)
293297
.then(position => {
294-
if (codeEditor) {
298+
if (codeEditor && position) {
295299
codeEditor.setPosition(position);
296300
codeEditor.revealLine(position.lineNumber);
297301
codeEditor.focus();
@@ -303,8 +307,11 @@ export class PreferencesService extends Disposable implements IPreferencesServic
303307

304308
private openOrSwitchSettings(configurationTarget: ConfigurationTarget, resource: URI, options?: ISettingsEditorOptions, group: IEditorGroup = this.editorGroupService.activeGroup): Promise<IEditor> {
305309
const editorInput = this.getActiveSettingsEditorInput(group);
306-
if (editorInput && editorInput.master.getResource().fsPath !== resource.fsPath) {
307-
return this.doSwitchSettings(configurationTarget, resource, editorInput, group, options);
310+
if (editorInput) {
311+
const editorInputResource = editorInput.master.getResource();
312+
if (editorInputResource && editorInputResource.fsPath !== resource.fsPath) {
313+
return this.doSwitchSettings(configurationTarget, resource, editorInput, group, options);
314+
}
308315
}
309316
return this.doOpenSettings(configurationTarget, resource, options, group);
310317
}
@@ -335,7 +342,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
335342
return Promise.all([
336343
this.editorService.openEditor({ resource: this.defaultSettingsRawResource, options: { pinned: true, preserveFocus: true, revealIfOpened: true }, label: nls.localize('defaultSettings', "Default Settings"), description: '' }),
337344
this.editorService.openEditor(editableSettingsEditorInput, { pinned: true, revealIfOpened: true }, sideEditorGroup.id)
338-
]).then(() => null);
345+
]).then(([defaultEditor, editor]) => editor);
339346
} else {
340347
return this.editorService.openEditor(editableSettingsEditorInput, SettingsEditorOptions.create(options), group);
341348
}
@@ -374,18 +381,22 @@ export class PreferencesService extends Disposable implements IPreferencesServic
374381
}
375382

376383
private doSwitchSettings(target: ConfigurationTarget, resource: URI, input: PreferencesEditorInput, group: IEditorGroup, options?: ISettingsEditorOptions): Promise<IEditor> {
377-
return this.getOrCreateEditableSettingsEditorInput(target, this.getEditableSettingsURI(target, resource))
384+
const settingsURI = this.getEditableSettingsURI(target, resource);
385+
if (!settingsURI) {
386+
return Promise.reject(`Invalid settings URI - ${resource.toString()}`);
387+
}
388+
return this.getOrCreateEditableSettingsEditorInput(target, settingsURI)
378389
.then(toInput => {
379390
return group.openEditor(input).then(() => {
380391
const replaceWith = new PreferencesEditorInput(this.getPreferencesEditorInputName(target, resource), toInput.getDescription(), this.instantiationService.createInstance(DefaultPreferencesEditorInput, this.getDefaultSettingsResource(target)), toInput);
381392

382393
return group.replaceEditors([{
383394
editor: input,
384395
replacement: replaceWith,
385-
options: SettingsEditorOptions.create(options)
396+
options: options ? SettingsEditorOptions.create(options) : undefined
386397
}]).then(() => {
387398
this.lastOpenedSettingsInput = replaceWith;
388-
return group.activeControl;
399+
return group.activeControl!;
389400
});
390401
});
391402
});
@@ -464,7 +475,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
464475
return this.textModelResolverService.createModelReference(settingsUri)
465476
.then(reference => this.instantiationService.createInstance(SettingsEditorModel, reference, configurationTarget));
466477
}
467-
return Promise.resolve<SettingsEditorModel>(null);
478+
return Promise.reject(`unknown target: ${configurationTarget} and resource: ${resource.toString()}`);
468479
}
469480

470481
private createDefaultSettingsEditorModel(defaultSettingsUri: URI): Promise<DefaultSettingsEditorModel> {
@@ -494,7 +505,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
494505
return this._defaultUserSettingsContentModel;
495506
}
496507

497-
private getEditableSettingsURI(configurationTarget: ConfigurationTarget, resource?: URI): URI {
508+
private getEditableSettingsURI(configurationTarget: ConfigurationTarget, resource?: URI): URI | null {
498509
switch (configurationTarget) {
499510
case ConfigurationTarget.USER:
500511
return URI.file(this.environmentService.appSettingsPath);
@@ -505,8 +516,10 @@ export class PreferencesService extends Disposable implements IPreferencesServic
505516
const workspace = this.contextService.getWorkspace();
506517
return workspace.configuration || workspace.folders[0].toResource(FOLDER_SETTINGS_PATH);
507518
case ConfigurationTarget.WORKSPACE_FOLDER:
508-
const folder = this.contextService.getWorkspaceFolder(resource);
509-
return folder ? folder.toResource(FOLDER_SETTINGS_PATH) : null;
519+
if (resource) {
520+
const folder = this.contextService.getWorkspaceFolder(resource);
521+
return folder ? folder.toResource(FOLDER_SETTINGS_PATH) : null;
522+
}
510523
}
511524
return null;
512525
}
@@ -523,7 +536,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic
523536
if (Object.keys(parse(content.value)).indexOf('settings') === -1) {
524537
return this.jsonEditingService.write(resource, { key: 'settings', value: {} }, true).then(undefined, () => { });
525538
}
526-
return null;
539+
return undefined;
527540
});
528541
}
529542
return this.createIfNotExists(resource, emptyEditableSettingsContent).then(() => { });
@@ -557,29 +570,35 @@ export class PreferencesService extends Disposable implements IPreferencesServic
557570
];
558571
}
559572

560-
private addLanguageOverrideEntry(language: string, settingsModel: IPreferencesEditorModel<ISetting>, codeEditor: ICodeEditor): Promise<IPosition> {
573+
private addLanguageOverrideEntry(language: string, settingsModel: IPreferencesEditorModel<ISetting>, codeEditor: ICodeEditor): Promise<IPosition | null> {
561574
const languageKey = `[${language}]`;
562575
let setting = settingsModel.getPreference(languageKey);
563576
const model = codeEditor.getModel();
564-
const configuration = this.configurationService.getValue<{ editor: { tabSize: number; insertSpaces: boolean } }>();
565-
const eol = model.getEOL();
566-
if (setting) {
567-
if (setting.overrides.length) {
568-
const lastSetting = setting.overrides[setting.overrides.length - 1];
569-
return Promise.resolve({ lineNumber: lastSetting.valueRange.endLineNumber, column: model.getLineMaxColumn(lastSetting.valueRange.endLineNumber) });
577+
if (model) {
578+
const configuration = this.configurationService.getValue<{ editor: { tabSize: number; insertSpaces: boolean } }>();
579+
const eol = model.getEOL();
580+
if (setting) {
581+
if (setting.overrides && setting.overrides.length) {
582+
const lastSetting = setting.overrides[setting.overrides.length - 1];
583+
return Promise.resolve({ lineNumber: lastSetting.valueRange.endLineNumber, column: model.getLineMaxColumn(lastSetting.valueRange.endLineNumber) });
584+
}
585+
return Promise.resolve({ lineNumber: setting.valueRange.startLineNumber, column: setting.valueRange.startColumn + 1 });
570586
}
571-
return Promise.resolve({ lineNumber: setting.valueRange.startLineNumber, column: setting.valueRange.startColumn + 1 });
587+
return this.configurationService.updateValue(languageKey, {}, ConfigurationTarget.USER)
588+
.then(() => {
589+
setting = settingsModel.getPreference(languageKey);
590+
if (setting) {
591+
let content = eol + this.spaces(2, configuration.editor) + eol + this.spaces(1, configuration.editor);
592+
let editOperation = EditOperation.insert(new Position(setting.valueRange.endLineNumber, setting.valueRange.endColumn - 1), content);
593+
model.pushEditOperations([], [editOperation], () => []);
594+
let lineNumber = setting.valueRange.endLineNumber + 1;
595+
settingsModel.dispose();
596+
return { lineNumber, column: model.getLineMaxColumn(lineNumber) };
597+
}
598+
return null;
599+
});
572600
}
573-
return this.configurationService.updateValue(languageKey, {}, ConfigurationTarget.USER)
574-
.then(() => {
575-
setting = settingsModel.getPreference(languageKey);
576-
let content = eol + this.spaces(2, configuration.editor) + eol + this.spaces(1, configuration.editor);
577-
let editOperation = EditOperation.insert(new Position(setting.valueRange.endLineNumber, setting.valueRange.endColumn - 1), content);
578-
model.pushEditOperations([], [editOperation], () => []);
579-
let lineNumber = setting.valueRange.endLineNumber + 1;
580-
settingsModel.dispose();
581-
return { lineNumber, column: model.getLineMaxColumn(lineNumber) };
582-
});
601+
return Promise.resolve(null);
583602
}
584603

585604
private spaces(count: number, { tabSize, insertSpaces }: { tabSize: number; insertSpaces: boolean }): string {

0 commit comments

Comments
 (0)