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