Skip to content

Commit 2d4395f

Browse files
committed
Add stubs jsx linked editing
For microsoft/TypeScript#51832
1 parent 8e89509 commit 2d4395f

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import * as vscode from 'vscode';
7+
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
8+
import { conditionalRegistration, requireMinVersion, requireSomeCapability } from '../utils/dependentRegistration';
9+
import { DocumentSelector } from '../utils/documentSelector';
10+
import * as typeConverters from '../utils/typeConverters';
11+
import API from '../utils/api';
12+
13+
class JsxLinkedEditingSupport implements vscode.LinkedEditingRangeProvider {
14+
15+
public static readonly minVersion = API.v510;
16+
17+
public constructor(
18+
private readonly client: ITypeScriptServiceClient
19+
) { }
20+
21+
async provideLinkedEditingRanges(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Promise<vscode.LinkedEditingRanges | undefined> {
22+
const filepath = this.client.toOpenTsFilePath(document);
23+
if (!filepath) {
24+
return undefined;
25+
}
26+
27+
const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position);
28+
const response = await this.client.execute('jsxLinkedEdit', args, token);
29+
if (response.type !== 'response' || !response.body) {
30+
return undefined;
31+
}
32+
33+
const wordPattern = response.body.wordPattern ? new RegExp(response.body.wordPattern) : undefined;
34+
return new vscode.LinkedEditingRanges(response.body.ranges.map(range => typeConverters.Range.fromTextSpan(range)), wordPattern);
35+
}
36+
}
37+
38+
export function register(
39+
selector: DocumentSelector,
40+
client: ITypeScriptServiceClient
41+
) {
42+
return conditionalRegistration([
43+
requireMinVersion(client, JsxLinkedEditingSupport.minVersion),
44+
requireSomeCapability(client, ClientCapability.Syntax),
45+
], () => {
46+
return vscode.languages.registerLinkedEditingRangeProvider(selector.semantic,
47+
new JsxLinkedEditingSupport(client));
48+
});
49+
}

extensions/typescript-language-features/src/languageProvider.ts

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export default class LanguageProvider extends Disposable {
7575
import('./languageFeatures/implementations').then(provider => this._register(provider.register(selector, this.client))),
7676
import('./languageFeatures/inlayHints').then(provider => this._register(provider.register(selector, this.description, this.client, this.fileConfigurationManager))),
7777
import('./languageFeatures/jsDocCompletions').then(provider => this._register(provider.register(selector, this.description, this.client, this.fileConfigurationManager))),
78+
import('./languageFeatures/jsxLinkedEditing').then(provider => this._register(provider.register(selector, this.client))),
7879
import('./languageFeatures/organizeImports').then(provider => this._register(provider.register(selector, this.client, this.commandManager, this.fileConfigurationManager, this.telemetryReporter))),
7980
import('./languageFeatures/quickFix').then(provider => this._register(provider.register(selector, this.client, this.fileConfigurationManager, this.commandManager, this.client.diagnosticsManager, this.telemetryReporter))),
8081
import('./languageFeatures/refactor').then(provider => this._register(provider.register(selector, this.client, this.fileConfigurationManager, this.commandManager, this.telemetryReporter))),

extensions/typescript-language-features/src/tsServer/api.ts

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export class API {
3434
public static readonly v470 = API.fromSimpleString('4.7.0');
3535
public static readonly v480 = API.fromSimpleString('4.8.0');
3636
public static readonly v490 = API.fromSimpleString('4.9.0');
37+
public static readonly v510 = API.fromSimpleString('5.1.0');
3738

3839
public static fromVersionString(versionString: string): API {
3940
let version = semver.valid(versionString);

extensions/typescript-language-features/src/tsServer/protocol/protocol.d.ts

+11
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,16 @@ declare module 'typescript/lib/tsserverlibrary' {
5151
action: string;
5252
filepath: string;
5353
};
54+
55+
interface LinkedEditingRanges {
56+
ranges: TextSpan[];
57+
wordPattern?: string;
58+
}
59+
60+
interface JsxLinkedEditRequest extends FileLocationRequest { }
61+
62+
interface JsxLinkedEditResponse extends Response {
63+
body?: LinkedEditingRanges;
64+
}
5465
}
5566
}

extensions/typescript-language-features/src/typescriptService.ts

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ interface StandardTsServerRequests {
7676
'findSourceDefinition': [Proto.FileLocationRequestArgs, Proto.DefinitionResponse];
7777
'getMoveToRefactoringFileSuggestions': [Proto.GetMoveToRefactoringFileSuggestionsRequestArgs, Proto.GetMoveToRefactoringFileSuggestionsResponse];
7878
'getEditsForMoveToFileRefactor': [Proto.GetEditsForMoveToFileRefactorRequestArgs, Proto.GetEditsForMoveToFileRefactorResponse];
79+
'jsxLinkedEdit': [Proto.FileLocationRequestArgs, Proto.JsxLinkedEditResponse];
7980
}
8081

8182
interface NoResponseTsServerRequests {

0 commit comments

Comments
 (0)