diff --git a/src/Protocol/Features/FileOperationsFeature.cs b/src/Protocol/Features/FileOperationsFeature.cs index 158e0a40e..ed64a6cab 100644 --- a/src/Protocol/Features/FileOperationsFeature.cs +++ b/src/Protocol/Features/FileOperationsFeature.cs @@ -20,7 +20,7 @@ namespace Models /// /// @since 3.16.0 /// - public abstract record FileOperationParams + public abstract record FileOperationsParams where T : FileOperationItem { /// @@ -40,33 +40,33 @@ public abstract record FileOperationItem public Uri Uri { get; init; } = null!; } - /// + /// [Parallel] [Method(WorkspaceNames.DidCreateFiles, Direction.ClientToServer)] [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageClient), typeof(ILanguageClient))] - [RegistrationOptions(typeof(DidCreateFileRegistrationOptions))] + [RegistrationOptions(typeof(DidCreateFilesRegistrationOptions))] [Capability(typeof(FileOperationsWorkspaceClientCapabilities))] - public partial record DidCreateFileParams : FileOperationParams, IRequest + public partial record DidCreateFilesParams : FileOperationsParams, IRequest { - public static implicit operator WillCreateFileParams(DidCreateFileParams @params) + public static implicit operator WillCreateFilesParams(DidCreateFilesParams @params) { return new() { Files = @params.Files }; } } - /// + /// [Parallel] [Method(WorkspaceNames.WillCreateFiles, Direction.ClientToServer)] [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageClient), typeof(ILanguageClient))] - [RegistrationOptions(typeof(WillCreateFileRegistrationOptions))] + [RegistrationOptions(typeof(WillCreateFilesRegistrationOptions))] [Capability(typeof(FileOperationsWorkspaceClientCapabilities))] - public partial record WillCreateFileParams : FileOperationParams, IRequest + public partial record WillCreateFilesParams : FileOperationsParams, IRequest { - public static implicit operator DidCreateFileParams(WillCreateFileParams @params) + public static implicit operator DidCreateFilesParams(WillCreateFilesParams @params) { return new() { Files = @params.Files }; } @@ -75,68 +75,96 @@ public static implicit operator DidCreateFileParams(WillCreateFileParams @params /// public partial record FileCreate : FileOperationItem; - /// + /// [Parallel] [Method(WorkspaceNames.DidRenameFiles, Direction.ClientToServer)] [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageClient), typeof(ILanguageClient))] - [RegistrationOptions(typeof(DidRenameFileRegistrationOptions))] + [RegistrationOptions(typeof(DidRenameFilesRegistrationOptions))] [Capability(typeof(FileOperationsWorkspaceClientCapabilities))] - public partial record DidRenameFileParams : FileOperationParams, IRequest + public partial record DidRenameFilesParams : RenameFilesOperationParams, IRequest { - public static implicit operator WillRenameFileParams(DidRenameFileParams @params) + public static implicit operator WillRenameFilesParams(DidRenameFilesParams @params) { return new() { Files = @params.Files }; } } - /// + /// [Parallel] [Method(WorkspaceNames.WillRenameFiles, Direction.ClientToServer)] [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageClient), typeof(ILanguageClient))] - [RegistrationOptions(typeof(WillRenameFileRegistrationOptions))] + [RegistrationOptions(typeof(WillRenameFilesRegistrationOptions))] [Capability(typeof(FileOperationsWorkspaceClientCapabilities))] - public partial record WillRenameFileParams : FileOperationParams, IRequest + public partial record WillRenameFilesParams : RenameFilesOperationParams, IRequest { - public static implicit operator DidRenameFileParams(WillRenameFileParams @params) + public static implicit operator DidRenameFilesParams(WillRenameFilesParams @params) { return new() { Files = @params.Files }; } } - /// - public partial record FileRename : FileOperationItem; + /// + /// The parameters sent in notifications/requests for user-initiated renames + /// of files. + /// + /// @since 3.16.0 + /// + public abstract record RenameFilesOperationParams + { + /// + /// An array of all files/folders renamed in this operation. + /// When a folder is renamed, only the folder will be included, and not its children. + /// + public Container Files { get; init; } = null!; + } + + /// + /// Represents information on a file/folder rename. + /// + public partial record FileRename + { + /// + /// A file:// URI for the original location of the file/folder being renamed. + /// + public Uri OldUri { get; init; } = null!; + + /// + /// A file:// URI for the new location of the file/folder being renamed. + /// + public Uri NewUri { get; init; } = null!; + } - /// + /// [Parallel] [Method(WorkspaceNames.DidDeleteFiles, Direction.ClientToServer)] [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageClient), typeof(ILanguageClient))] - [RegistrationOptions(typeof(DidDeleteFileRegistrationOptions))] + [RegistrationOptions(typeof(DidDeleteFilesRegistrationOptions))] [Capability(typeof(FileOperationsWorkspaceClientCapabilities))] - public partial record DidDeleteFileParams : FileOperationParams, IRequest + public partial record DidDeleteFilesParams : FileOperationsParams, IRequest { - public static implicit operator WillDeleteFileParams(DidDeleteFileParams @params) + public static implicit operator WillDeleteFilesParams(DidDeleteFilesParams @params) { return new() { Files = @params.Files }; } } - /// + /// [Parallel] [Method(WorkspaceNames.WillDeleteFiles, Direction.ClientToServer)] [GenerateHandler("OmniSharp.Extensions.LanguageServer.Protocol.Workspace")] [GenerateHandlerMethods] [GenerateRequestMethods(typeof(IWorkspaceLanguageClient), typeof(ILanguageClient))] - [RegistrationOptions(typeof(WillDeleteFileRegistrationOptions))] + [RegistrationOptions(typeof(WillDeleteFilesRegistrationOptions))] [Capability(typeof(FileOperationsWorkspaceClientCapabilities))] - public partial record WillDeleteFileParams : FileOperationParams, IRequest + public partial record WillDeleteFilesParams : FileOperationsParams, IRequest { - public static implicit operator DidDeleteFileParams(WillDeleteFileParams @params) + public static implicit operator DidDeleteFilesParams(WillDeleteFilesParams @params) { return new() { Files = @params.Files }; } @@ -151,7 +179,7 @@ public partial record FileDelete : FileOperationItem; nameof(FileOperationsWorkspaceServerCapabilities.WillCreate) )] [RegistrationName(WorkspaceNames.WillCreateFiles)] - public partial class WillCreateFileRegistrationOptions : IFileOperationRegistrationOptions + public partial class WillCreateFilesRegistrationOptions : IFileOperationRegistrationOptions { /// /// The actual filters. @@ -165,7 +193,7 @@ public partial class WillCreateFileRegistrationOptions : IFileOperationRegistrat nameof(FileOperationsWorkspaceServerCapabilities.DidCreate) )] [RegistrationName(WorkspaceNames.DidCreateFiles)] - public partial class DidCreateFileRegistrationOptions : IFileOperationRegistrationOptions + public partial class DidCreateFilesRegistrationOptions : IFileOperationRegistrationOptions { /// /// The actual filters. @@ -179,7 +207,7 @@ public partial class DidCreateFileRegistrationOptions : IFileOperationRegistrati nameof(FileOperationsWorkspaceServerCapabilities.WillRename) )] [RegistrationName(WorkspaceNames.WillRenameFiles)] - public partial class WillRenameFileRegistrationOptions : IFileOperationRegistrationOptions + public partial class WillRenameFilesRegistrationOptions : IFileOperationRegistrationOptions { /// /// The actual filters. @@ -193,7 +221,7 @@ public partial class WillRenameFileRegistrationOptions : IFileOperationRegistrat nameof(FileOperationsWorkspaceServerCapabilities.DidRename) )] [RegistrationName(WorkspaceNames.DidRenameFiles)] - public partial class DidRenameFileRegistrationOptions : IFileOperationRegistrationOptions + public partial class DidRenameFilesRegistrationOptions : IFileOperationRegistrationOptions { /// /// The actual filters. @@ -207,7 +235,7 @@ public partial class DidRenameFileRegistrationOptions : IFileOperationRegistrati nameof(FileOperationsWorkspaceServerCapabilities.WillDelete) )] [RegistrationName(WorkspaceNames.WillDeleteFiles)] - public partial class WillDeleteFileRegistrationOptions : IFileOperationRegistrationOptions + public partial class WillDeleteFilesRegistrationOptions : IFileOperationRegistrationOptions { /// /// The actual filters. @@ -221,7 +249,7 @@ public partial class WillDeleteFileRegistrationOptions : IFileOperationRegistrat nameof(FileOperationsWorkspaceServerCapabilities.DidDelete) )] [RegistrationName(WorkspaceNames.DidDeleteFiles)] - public partial class DidDeleteFileRegistrationOptions : IFileOperationRegistrationOptions + public partial class DidDeleteFilesRegistrationOptions : IFileOperationRegistrationOptions { /// /// The actual filters. @@ -335,37 +363,37 @@ public class FileOperationsWorkspaceServerCapabilities /// The client has support for sending didCreateFiles notifications. /// [Optional] - public DidCreateFileRegistrationOptions.StaticOptions? DidCreate { get; set; } + public DidCreateFilesRegistrationOptions.StaticOptions? DidCreate { get; set; } /// /// The client has support for sending willCreateFiles requests. /// [Optional] - public WillCreateFileRegistrationOptions.StaticOptions? WillCreate { get; set; } + public WillCreateFilesRegistrationOptions.StaticOptions? WillCreate { get; set; } /// /// The client has support for sending didRenameFiles notifications. /// [Optional] - public DidRenameFileRegistrationOptions.StaticOptions? DidRename { get; set; } + public DidRenameFilesRegistrationOptions.StaticOptions? DidRename { get; set; } /// /// The client has support for sending willRenameFiles requests. /// [Optional] - public WillRenameFileRegistrationOptions.StaticOptions? WillRename { get; set; } + public WillRenameFilesRegistrationOptions.StaticOptions? WillRename { get; set; } /// /// The client has support for sending didDeleteFiles notifications. /// [Optional] - public DidDeleteFileRegistrationOptions.StaticOptions? DidDelete { get; set; } + public DidDeleteFilesRegistrationOptions.StaticOptions? DidDelete { get; set; } /// /// The client has support for sending willDeleteFiles requests. /// [Optional] - public WillDeleteFileRegistrationOptions.StaticOptions? WillDelete { get; set; } + public WillDeleteFilesRegistrationOptions.StaticOptions? WillDelete { get; set; } } } diff --git a/test/Lsp.Integration.Tests/FileOperationTests.cs b/test/Lsp.Integration.Tests/FileOperationsTests.cs similarity index 74% rename from test/Lsp.Integration.Tests/FileOperationTests.cs rename to test/Lsp.Integration.Tests/FileOperationsTests.cs index 94f8851de..b86c2ba0a 100644 --- a/test/Lsp.Integration.Tests/FileOperationTests.cs +++ b/test/Lsp.Integration.Tests/FileOperationsTests.cs @@ -17,24 +17,24 @@ namespace Lsp.Integration.Tests { - public class FileOperationTests : LanguageProtocolTestBase + public class FileOperationsTests : LanguageProtocolTestBase { - private readonly Action _didCreateFileHandler = Substitute.For>(); + private readonly Action _didCreateFileHandler = Substitute.For>(); - private readonly Func> _willCreateFileHandler = - Substitute.For>>(); + private readonly Func> _willCreateFileHandler = + Substitute.For>>(); - private readonly Action _didRenameFileHandler = Substitute.For>(); + private readonly Action _didRenameFileHandler = Substitute.For>(); - private readonly Func> _willRenameFileHandler = - Substitute.For>>(); + private readonly Func> _willRenameFileHandler = + Substitute.For>>(); - private readonly Action _didDeleteFileHandler = Substitute.For>(); + private readonly Action _didDeleteFileHandler = Substitute.For>(); - private readonly Func> _willDeleteFileHandler = - Substitute.For>>(); + private readonly Func> _willDeleteFileHandler = + Substitute.For>>(); - public FileOperationTests(ITestOutputHelper outputHelper) : base(new JsonRpcTestOptions().ConfigureForXUnit(outputHelper, LogEventLevel.Verbose)) + public FileOperationsTests(ITestOutputHelper outputHelper) : base(new JsonRpcTestOptions().ConfigureForXUnit(outputHelper, LogEventLevel.Verbose)) { } @@ -43,14 +43,14 @@ public async Task Should_Handle_FileCreate() { var (client, server) = await Initialize(Configure, Configure); - await client.RequestWillCreateFile( - new WillCreateFileParams + await client.RequestWillCreateFiles( + new WillCreateFilesParams { Files = Container.From(new FileCreate { Uri = new Uri("file://asdf") }) } ); - client.DidCreateFile( - new DidCreateFileParams + client.DidCreateFiles( + new DidCreateFilesParams { Files = Container.From(new FileCreate { Uri = new Uri("file://asdf") }) } @@ -91,16 +91,22 @@ public async Task Should_Handle_FileRename() { var (client, server) = await Initialize(Configure, Configure); - await client.RequestWillRenameFile( - new WillRenameFileParams + await client.RequestWillRenameFiles( + new WillRenameFilesParams { - Files = Container.From(new FileRename { Uri = new Uri("file://asdf") }) + Files = Container.From(new FileRename { + OldUri = new Uri("file://asdf"), + NewUri = new Uri("file://zxcv"), + }) } ); - client.DidRenameFile( - new DidRenameFileParams + client.DidRenameFiles( + new DidRenameFilesParams { - Files = Container.From(new FileRename { Uri = new Uri("file://asdf") }) + Files = Container.From(new FileRename { + OldUri = new Uri("file://asdf"), + NewUri = new Uri("file://zxcv") + }) } ); @@ -139,14 +145,14 @@ public async Task Should_Handle_FileDelete() { var (client, server) = await Initialize(Configure, Configure); - await client.RequestWillDeleteFile( - new WillDeleteFileParams + await client.RequestWillDeleteFiles( + new WillDeleteFilesParams { Files = Container.From(new FileDelete { Uri = new Uri("file://asdf") }) } ); - client.DidDeleteFile( - new DidDeleteFileParams + client.DidDeleteFiles( + new DidDeleteFilesParams { Files = Container.From(new FileDelete { Uri = new Uri("file://asdf") }) } @@ -213,12 +219,12 @@ private void Configure(LanguageServerOptions options) } } ); - options.OnDidCreateFile(_didCreateFileHandler, (capability, capabilities) => new() { Filters = filters }); - options.OnWillCreateFile(_willCreateFileHandler, (capability, capabilities) => new() { Filters = filters }); - options.OnDidRenameFile(_didRenameFileHandler, (capability, capabilities) => new() { Filters = filters }); - options.OnWillRenameFile(_willRenameFileHandler, (capability, capabilities) => new() { Filters = filters }); - options.OnDidDeleteFile(_didDeleteFileHandler, (capability, capabilities) => new() { Filters = filters }); - options.OnWillDeleteFile(_willDeleteFileHandler, (capability, capabilities) => new() { Filters = filters }); + options.OnDidCreateFiles(_didCreateFileHandler, (capability, capabilities) => new() { Filters = filters }); + options.OnWillCreateFiles(_willCreateFileHandler, (capability, capabilities) => new() { Filters = filters }); + options.OnDidRenameFiles(_didRenameFileHandler, (capability, capabilities) => new() { Filters = filters }); + options.OnWillRenameFiles(_willRenameFileHandler, (capability, capabilities) => new() { Filters = filters }); + options.OnDidDeleteFiles(_didDeleteFileHandler, (capability, capabilities) => new() { Filters = filters }); + options.OnWillDeleteFiles(_willDeleteFileHandler, (capability, capabilities) => new() { Filters = filters }); } } }