@@ -40,6 +40,7 @@ export namespace FileResourceVersion {
4040}
4141
4242export interface FileResourceOptions {
43+ isReadonly : boolean
4344 shouldOverwrite : ( ) => Promise < boolean >
4445 shouldOpenAsText : ( error : string ) => Promise < boolean >
4546}
@@ -60,6 +61,9 @@ export class FileResource implements Resource {
6061 get encoding ( ) : string | undefined {
6162 return this . _version ?. encoding ;
6263 }
64+ get isReadonly ( ) : boolean {
65+ return this . options . isReadonly || this . fileService . hasCapability ( this . uri , FileSystemProviderCapabilities . Readonly ) ;
66+ }
6367
6468 constructor (
6569 readonly uri : URI ,
@@ -184,15 +188,7 @@ export class FileResource implements Resource {
184188 }
185189 }
186190
187- saveContents ( content : string , options ?: ResourceSaveOptions ) : Promise < void > {
188- return this . doWrite ( content , options ) ;
189- }
190-
191- saveStream ( content : Readable < string > , options ?: ResourceSaveOptions ) : Promise < void > {
192- return this . doWrite ( content , options ) ;
193- }
194-
195- protected async doWrite ( content : string | Readable < string > , options ?: ResourceSaveOptions ) : Promise < void > {
191+ protected doWrite = async ( content : string | Readable < string > , options ?: ResourceSaveOptions ) : Promise < void > => {
196192 const version = options ?. version || this . _version ;
197193 const current = FileResourceVersion . is ( version ) ? version : undefined ;
198194 const etag = current ?. etag ;
@@ -218,14 +214,22 @@ export class FileResource implements Resource {
218214 }
219215 throw e ;
220216 }
221- }
217+ } ;
222218
219+ saveStream ?: Resource [ 'saveStream' ] ;
220+ saveContents ?: Resource [ 'saveContents' ] ;
223221 saveContentChanges ?: Resource [ 'saveContentChanges' ] ;
224222 protected updateSavingContentChanges ( ) : void {
225- if ( this . fileService . hasCapability ( this . uri , FileSystemProviderCapabilities . Update ) ) {
226- this . saveContentChanges = this . doSaveContentChanges ;
227- } else {
223+ if ( this . isReadonly ) {
228224 delete this . saveContentChanges ;
225+ delete this . saveContents ;
226+ delete this . saveStream ;
227+ } else {
228+ this . saveContents = this . doWrite ;
229+ this . saveStream = this . doWrite ;
230+ if ( this . fileService . hasCapability ( this . uri , FileSystemProviderCapabilities . Update ) ) {
231+ this . saveContentChanges = this . doSaveContentChanges ;
232+ }
229233 }
230234 }
231235 protected doSaveContentChanges : Resource [ 'saveContentChanges' ] = async ( changes , options ) => {
@@ -317,6 +321,7 @@ export class FileResourceResolver implements ResourceResolver {
317321 throw new Error ( 'The given uri is a directory: ' + this . labelProvider . getLongName ( uri ) ) ;
318322 }
319323 return new FileResource ( uri , this . fileService , {
324+ isReadonly : stat ?. isReadonly ?? false ,
320325 shouldOverwrite : ( ) => this . shouldOverwrite ( uri ) ,
321326 shouldOpenAsText : error => this . shouldOpenAsText ( uri , error )
322327 } ) ;
0 commit comments