@@ -31,7 +31,9 @@ import {
3131 type IFileSystemProviderWithFileAtomicReadCapability ,
3232 type IFileSystemProviderWithFileAtomicWriteCapability ,
3333 type IFileSystemProviderWithFileAtomicDeleteCapability ,
34- hasFileReadStreamCapability
34+ hasFileReadStreamCapability ,
35+ type IFileStat ,
36+ type IFileStatWithMetadata
3537} from 'vs/platform/files/common/files'
3638import {
3739 DisposableStore ,
@@ -1079,8 +1081,15 @@ const providers: Record<string, IFileSystemProvider> = {
10791081 [ Schemas . file ] : overlayFileSystemProvider
10801082}
10811083
1084+ export interface FileServiceOptions {
1085+ statMiddleware ?: ( resource : URI , next : ( ) => Promise < IFileStat > ) => Promise < IFileStat >
1086+ }
1087+
10821088class FileServiceOverride extends FileService {
1083- constructor ( logService : ILogService ) {
1089+ constructor (
1090+ logService : ILogService ,
1091+ private options : FileServiceOptions
1092+ ) {
10841093 super ( logService )
10851094
10861095 for ( const [ scheme , provider ] of Object . entries ( providers ) ) {
@@ -1104,6 +1113,36 @@ class FileServiceOverride extends FileService {
11041113 return super . withProvider ( resource )
11051114 }
11061115
1116+ protected override async toFileStat (
1117+ provider : IFileSystemProvider ,
1118+ resource : URI ,
1119+ stat : IStat | ( { type : FileType } & Partial < IStat > ) ,
1120+ siblings : number | undefined ,
1121+ resolveMetadata : boolean ,
1122+ recurse : ( stat : IFileStat , siblings ?: number ) => boolean
1123+ ) : Promise < IFileStat >
1124+ protected override async toFileStat (
1125+ provider : IFileSystemProvider ,
1126+ resource : URI ,
1127+ stat : IStat ,
1128+ siblings : number | undefined ,
1129+ resolveMetadata : true ,
1130+ recurse : ( stat : IFileStat , siblings ?: number ) => boolean
1131+ ) : Promise < IFileStatWithMetadata >
1132+ protected override async toFileStat (
1133+ provider : IFileSystemProvider ,
1134+ resource : URI ,
1135+ stat : IStat | ( { type : FileType } & Partial < IStat > ) ,
1136+ siblings : number | undefined ,
1137+ resolveMetadata : boolean ,
1138+ recurse : ( stat : IFileStat , siblings ?: number ) => boolean
1139+ ) : Promise < IFileStat > {
1140+ const next = async ( ) => {
1141+ return await super . toFileStat ( provider , resource , stat , siblings , resolveMetadata , recurse )
1142+ }
1143+ return this . options . statMiddleware ?.( resource , next ) ?? next ( )
1144+ }
1145+
11071146 /**
11081147 * Hack: the parent class has dependencies, we don't, dependencies are stored in a static field
11091148 * Having no dependencies mean the field won't be overriden, so we'll inherit dependencies from the parent
@@ -1118,9 +1157,11 @@ registerServiceInitializePreParticipant(async (accessor) => {
11181157 fileLogger . logger = accessor . get ( ILogService )
11191158} )
11201159
1121- export default function getServiceOverride ( ) : IEditorOverrideServices {
1160+ export default function getServiceOverride (
1161+ options : FileServiceOptions = { }
1162+ ) : IEditorOverrideServices {
11221163 return {
1123- [ IFileService . toString ( ) ] : new SyncDescriptor ( FileServiceOverride , [ fileLogger ] , true ) ,
1164+ [ IFileService . toString ( ) ] : new SyncDescriptor ( FileServiceOverride , [ fileLogger , options ] , true ) ,
11241165 [ ITextFileService . toString ( ) ] : new SyncDescriptor ( BrowserTextFileService , [ ] , true ) ,
11251166 [ IFilesConfigurationService . toString ( ) ] : new SyncDescriptor (
11261167 FilesConfigurationService ,
@@ -1311,5 +1352,6 @@ export type {
13111352 IFileWriteOptions ,
13121353 IFileDeleteOptions ,
13131354 IFileOverwriteOptions ,
1314- IFileChange
1355+ IFileChange ,
1356+ IFileStat
13151357}
0 commit comments