Skip to content

Commit 972a828

Browse files
committed
Refactor RenameHandler to support nullable capabilities and enhance tests for registration options
1 parent e28d386 commit 972a828

2 files changed

Lines changed: 27 additions & 36 deletions

File tree

src/PowerShellEditorServices/Services/TextDocument/Handlers/RenameHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal class PrepareRenameHandler
2020
RenameService renameService
2121
) : IPrepareRenameHandler
2222
{
23-
public RenameRegistrationOptions GetRegistrationOptions(RenameCapability capability, ClientCapabilities clientCapabilities) => capability?.PrepareSupport == true ? new() { PrepareProvider = true } : new();
23+
public RenameRegistrationOptions GetRegistrationOptions(RenameCapability? capability, ClientCapabilities clientCapabilities) => capability?.PrepareSupport == true ? new() { PrepareProvider = true } : new();
2424

2525
public async Task<RangeOrPlaceholderRange?> Handle(PrepareRenameParams request, CancellationToken cancellationToken)
2626
=> await renameService.PrepareRenameSymbol(request, cancellationToken).ConfigureAwait(false);
@@ -36,7 +36,7 @@ RenameService renameService
3636
// RenameOptions may only be specified if the client states that it supports prepareSupport in its initial initialize request.
3737
// Passes a null capability when the client omits textDocument.rename from its advertised capabilities (e.g. a completion-only client).
3838
// Use the null-conditional operator so we don't throw NullReferenceException during initialize.
39-
public RenameRegistrationOptions GetRegistrationOptions(RenameCapability capability, ClientCapabilities clientCapabilities) => capability?.PrepareSupport == true ? new() { PrepareProvider = true } : new();
39+
public RenameRegistrationOptions GetRegistrationOptions(RenameCapability? capability, ClientCapabilities clientCapabilities) => capability?.PrepareSupport == true ? new() { PrepareProvider = true } : new();
4040

4141
public async Task<WorkspaceEdit?> Handle(RenameParams request, CancellationToken cancellationToken)
4242
=> await renameService.RenameSymbol(request, cancellationToken).ConfigureAwait(false);

test/PowerShellEditorServices.Test/Refactoring/RenameHandlerTests.cs

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT License.
33

4+
using System;
45
using Microsoft.Extensions.Logging.Abstractions;
56
using Microsoft.PowerShell.EditorServices.Handlers;
67
using Microsoft.PowerShell.EditorServices.Services;
@@ -127,49 +128,39 @@ public async Task RenamedVariable(RenameTestTarget s)
127128
Assert.Equal(expected, actual);
128129
}
129130

130-
[Fact]
131-
public void GetRegistrationOptionsDoesNotThrowWhenCapabilityIsNull()
131+
public enum RegistrationHandlerKind
132132
{
133-
// Acts: framework hands us null when client omits the capability.
134-
RenameRegistrationOptions opts = testHandler.GetRegistrationOptions(
135-
capability: null,
136-
clientCapabilities: new ClientCapabilities());
137-
138-
Assert.NotNull(opts);
139-
// Without PrepareSupport advertised, PrepareProvider should be false.
140-
Assert.False(opts.PrepareProvider);
133+
Rename,
134+
PrepareRename
141135
}
142136

143-
[Fact]
144-
public void GetRegistrationOptionsHonorsPrepareSupportWhenCapabilityProvided()
137+
// A null prepareSupport represents the client omitting the capability entirely (framework hands us null).
138+
public static TheoryData<RegistrationHandlerKind, bool?, bool> RegistrationOptionsTestCases() => new()
145139
{
146-
RenameRegistrationOptions opts = testHandler.GetRegistrationOptions(
147-
capability: new RenameCapability { PrepareSupport = true },
148-
clientCapabilities: new ClientCapabilities());
149-
150-
Assert.NotNull(opts);
151-
Assert.True(opts.PrepareProvider);
152-
}
140+
{ RegistrationHandlerKind.Rename, null, false },
141+
{ RegistrationHandlerKind.Rename, true, true },
142+
{ RegistrationHandlerKind.PrepareRename, null, false },
143+
{ RegistrationHandlerKind.PrepareRename, true, true }
144+
};
153145

154-
[Fact]
155-
public void PrepareGetRegistrationOptionsDoesNotThrowWhenCapabilityIsNull()
146+
[Theory]
147+
[MemberData(nameof(RegistrationOptionsTestCases))]
148+
public void GetRegistrationOptionsReflectsPrepareSupport(RegistrationHandlerKind handlerKind, bool? prepareSupport, bool expectedPrepareProvider)
156149
{
157-
RenameRegistrationOptions opts = testPrepareHandler.GetRegistrationOptions(
158-
capability: null,
159-
clientCapabilities: new ClientCapabilities());
150+
RenameCapability capability = prepareSupport is bool ps
151+
? new RenameCapability { PrepareSupport = ps }
152+
: null;
160153

161-
Assert.NotNull(opts);
162-
Assert.False(opts.PrepareProvider);
163-
}
154+
Func<RenameCapability, ClientCapabilities, RenameRegistrationOptions> getRegistrationOptions = handlerKind switch
155+
{
156+
RegistrationHandlerKind.Rename => testHandler.GetRegistrationOptions,
157+
RegistrationHandlerKind.PrepareRename => testPrepareHandler.GetRegistrationOptions,
158+
_ => throw new ArgumentOutOfRangeException(nameof(handlerKind))
159+
};
164160

165-
[Fact]
166-
public void PrepareGetRegistrationOptionsHonorsPrepareSupportWhenCapabilityProvided()
167-
{
168-
RenameRegistrationOptions opts = testPrepareHandler.GetRegistrationOptions(
169-
capability: new RenameCapability { PrepareSupport = true },
170-
clientCapabilities: new ClientCapabilities());
161+
RenameRegistrationOptions opts = getRegistrationOptions(capability, new ClientCapabilities());
171162

172163
Assert.NotNull(opts);
173-
Assert.True(opts.PrepareProvider);
164+
Assert.Equal(expectedPrepareProvider, opts.PrepareProvider);
174165
}
175166
}

0 commit comments

Comments
 (0)