Skip to content

Commit 1353b66

Browse files
committed
Fix LanguageClient.prepareRename() support for { defaultBehavior: true }
* /client behavior no longer converts `{ defaultBehavior: true }` to `null`, to now match >= 3.16.0 specification - converts `{ defaultBehavior: true }` into the editor's default word range, allowing `textDocument/rename` requests without widening the VS Code provider type - continues to reject `{ defaultBehavior: false }`, preventing `textDocument/rename` requests * /client-node-tests new related `prepareRename` tests - adds test server coverage for a controlled `{ defaultBehavior: true }` prepareRename response - adds a dedicated integration test asserting the client converts that server result into a vscode.Range while keeping the existing Rename test focused on the standard flow
1 parent 5b834e3 commit 1353b66

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

client-node-tests/src/integration.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,20 @@ suite('Client integration', () => {
714714
assert.strictEqual(middlewareCalled, 2);
715715
});
716716

717+
test('PrepareRename server defaultBehavior result', async () => {
718+
const provider = client.getFeature(lsclient.RenameRequest.method).getProvider(document);
719+
isDefined(provider);
720+
isDefined(provider.prepareRename);
721+
722+
const defaultBehaviorPosition = new vscode.Position(1, 5);
723+
const defaultBehaviorExpected = document.getWordRangeAtPosition(defaultBehaviorPosition);
724+
isDefined(defaultBehaviorExpected);
725+
const defaultBehaviorResult = await provider.prepareRename(document, defaultBehaviorPosition, tokenSource.token) as vscode.Range;
726+
727+
isInstanceOf(defaultBehaviorResult, vscode.Range);
728+
assert.deepStrictEqual(defaultBehaviorResult, defaultBehaviorExpected);
729+
});
730+
717731
test('Document Link', async () => {
718732
const provider = client.getFeature(lsclient.DocumentLinkRequest.method).getProvider(document);
719733
isDefined(provider);

client-node-tests/src/servers/testServer.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,10 @@ connection.onDocumentOnTypeFormatting((_params) => {
283283
];
284284
});
285285

286-
connection.onPrepareRename((_params) => {
286+
connection.onPrepareRename((params) => {
287+
if (params.position.line === 1 && params.position.character === 5) {
288+
return { defaultBehavior: true };
289+
}
287290
return Range.create(1, 1, 1, 2);
288291
});
289292

client/src/common/rename.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export class RenameFeature extends TextDocumentLanguageFeature<boolean | RenameO
9898
return client.protocol2CodeConverter.asRange(result);
9999
} else if (this.isDefaultBehavior(result)) {
100100
return result.defaultBehavior === true
101-
? null
101+
? document.getWordRangeAtPosition(position)
102102
: Promise.reject(new Error(`The element can't be renamed.`));
103103
} else if (result && Range.is(result.range)) {
104104
return {
@@ -134,4 +134,4 @@ export class RenameFeature extends TextDocumentLanguageFeature<boolean | RenameO
134134
const candidate: DefaultBehavior = value;
135135
return candidate && Is.boolean(candidate.defaultBehavior);
136136
}
137-
}
137+
}

0 commit comments

Comments
 (0)