Skip to content

Commit 06659f0

Browse files
authored
Add stubs for jsx linked editing (#176279)
* Add stubs jsx linked editing For microsoft/TypeScript#51832 * Update for new TS changes * Update to finalized protocol
1 parent 812f3f5 commit 06659f0

File tree

6 files changed

+62
-0
lines changed

6 files changed

+62
-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 { DocumentSelector } from '../configuration/documentSelector';
8+
import { API } from '../tsServer/api';
9+
import * as typeConverters from '../typeConverters';
10+
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
11+
import { conditionalRegistration, requireMinVersion, requireSomeCapability } from './util/dependentRegistration';
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('linkedEditingRange', 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

+9
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,14 @@ declare module 'typescript/lib/tsserverlibrary' {
5151
action: string;
5252
filepath: string;
5353
};
54+
55+
interface LinkedEditingRangesBody {
56+
ranges: TextSpan[];
57+
wordPattern?: string;
58+
}
59+
60+
interface LinkedEditingRangeResponse extends Response {
61+
readonly body: LinkedEditingRangesBody;
62+
}
5463
}
5564
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ export class SyntaxRoutingTsServer extends Disposable implements ITypeScriptServ
495495
'format',
496496
'formatonkey',
497497
'docCommentTemplate',
498+
'linkedEditingRange'
498499
]);
499500

500501
/**

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+
'linkedEditingRange': [Proto.FileLocationRequestArgs, Proto.LinkedEditingRangeResponse];
7980
}
8081

8182
interface NoResponseTsServerRequests {

0 commit comments

Comments
 (0)