Skip to content

Commit e41c195

Browse files
committed
Work towards allowing enhanced syntax server commands to be run against any file
We currently restrict the TS server to working with a small set of file schemes. This is done because the TS server itself cannot read files from on of VS Code's virtual file system providers (and will crash if it tries to do so) However we can enable single file commands for these other file schemes, so long as they are treated as in-memory files. This change works towards supporting that by changing when certain providers are enabled/disabled
1 parent 8bf2ae1 commit e41c195

34 files changed

Lines changed: 276 additions & 158 deletions

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import * as path from 'path';
77
import * as vscode from 'vscode';
88
import type * as Proto from '../protocol';
99
import * as PConst from '../protocol.const';
10-
import { ITypeScriptServiceClient } from '../typescriptService';
10+
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
1111
import API from '../utils/api';
12-
import { conditionalRegistration, requireMinVersion } from '../utils/dependentRegistration';
12+
import { conditionalRegistration, requireSomeCapability, requireMinVersion } from '../utils/dependentRegistration';
13+
import { DocumentSelector } from '../utils/documentSelector';
1314
import { parseKindModifier } from '../utils/modifiers';
1415
import * as typeConverters from '../utils/typeConverters';
1516

@@ -117,13 +118,14 @@ function fromProtocolCallHierchyOutgoingCall(item: Proto.CallHierarchyOutgoingCa
117118
}
118119

119120
export function register(
120-
selector: vscode.DocumentSelector,
121+
selector: DocumentSelector,
121122
client: ITypeScriptServiceClient
122123
) {
123124
return conditionalRegistration([
124125
requireMinVersion(client, TypeScriptCallHierarchySupport.minVersion),
126+
requireSomeCapability(client, ClientCapability.EnhancedSyntax, ClientCapability.Semantic),
125127
], () => {
126-
return vscode.languages.registerCallHierarchyProvider(selector,
128+
return vscode.languages.registerCallHierarchyProvider(selector.syntax,
127129
new TypeScriptCallHierarchySupport(client));
128130
});
129131
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ import * as vscode from 'vscode';
77
import * as nls from 'vscode-nls';
88
import type * as Proto from '../protocol';
99
import * as PConst from '../protocol.const';
10-
import { ITypeScriptServiceClient, ServerResponse } from '../typescriptService';
10+
import { ClientCapability, ITypeScriptServiceClient, ServerResponse } from '../typescriptService';
1111
import API from '../utils/api';
1212
import { nulToken } from '../utils/cancellation';
1313
import { applyCodeAction } from '../utils/codeAction';
1414
import { Command, CommandManager } from '../utils/commandManager';
15-
import { conditionalRegistration, requireConfiguration } from '../utils/dependentRegistration';
15+
import { conditionalRegistration, requireSomeCapability, requireConfiguration } from '../utils/dependentRegistration';
16+
import { DocumentSelector } from '../utils/documentSelector';
1617
import { parseKindModifier } from '../utils/modifiers';
1718
import * as Previewer from '../utils/previewer';
1819
import { snippetForFunctionCall } from '../utils/snippetForFunctionCall';
@@ -795,7 +796,7 @@ function shouldExcludeCompletionEntry(
795796
}
796797

797798
export function register(
798-
selector: vscode.DocumentSelector,
799+
selector: DocumentSelector,
799800
modeId: string,
800801
client: ITypeScriptServiceClient,
801802
typingsStatus: TypingsStatus,
@@ -806,8 +807,9 @@ export function register(
806807
) {
807808
return conditionalRegistration([
808809
requireConfiguration(modeId, 'suggest.enabled'),
810+
requireSomeCapability(client, ClientCapability.EnhancedSyntax, ClientCapability.Semantic),
809811
], () => {
810-
return vscode.languages.registerCompletionItemProvider(selector,
812+
return vscode.languages.registerCompletionItemProvider(selector.syntax,
811813
new TypeScriptCompletionItemProvider(client, modeId, typingsStatus, fileConfigurationManager, commandManager, telemetryReporter, onCompletionAccepted),
812814
...TypeScriptCompletionItemProvider.triggerCharacters);
813815
});

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import { ITypeScriptServiceClient } from '../typescriptService';
7+
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
88
import API from '../utils/api';
9+
import { conditionalRegistration, requireSomeCapability } from '../utils/dependentRegistration';
10+
import { DocumentSelector } from '../utils/documentSelector';
911
import * as typeConverters from '../utils/typeConverters';
1012
import DefinitionProviderBase from './definitionProviderBase';
1113

@@ -58,9 +60,13 @@ export default class TypeScriptDefinitionProvider extends DefinitionProviderBase
5860
}
5961

6062
export function register(
61-
selector: vscode.DocumentSelector,
63+
selector: DocumentSelector,
6264
client: ITypeScriptServiceClient,
6365
) {
64-
return vscode.languages.registerDefinitionProvider(selector,
65-
new TypeScriptDefinitionProvider(client));
66+
return conditionalRegistration([
67+
requireSomeCapability(client, ClientCapability.EnhancedSyntax, ClientCapability.Semantic),
68+
], () => {
69+
return vscode.languages.registerDefinitionProvider(selector.syntax,
70+
new TypeScriptDefinitionProvider(client));
71+
});
6672
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as vscode from 'vscode';
77
import * as nls from 'vscode-nls';
88
import { ITypeScriptServiceClient } from '../typescriptService';
99
import API from '../utils/api';
10+
import { DocumentSelector } from '../utils/documentSelector';
1011

1112
const localize = nls.loadMessageBundle();
1213

@@ -80,10 +81,10 @@ class DirectiveCommentCompletionProvider implements vscode.CompletionItemProvide
8081
}
8182

8283
export function register(
83-
selector: vscode.DocumentSelector,
84+
selector: DocumentSelector,
8485
client: ITypeScriptServiceClient,
8586
) {
86-
return vscode.languages.registerCompletionItemProvider(selector,
87+
return vscode.languages.registerCompletionItemProvider(selector.syntax,
8788
new DirectiveCommentCompletionProvider(client),
8889
'@');
8990
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as vscode from 'vscode';
77
import type * as Proto from '../protocol';
88
import { ITypeScriptServiceClient } from '../typescriptService';
99
import { flatten } from '../utils/arrays';
10+
import { DocumentSelector } from '../utils/documentSelector';
1011
import * as typeConverters from '../utils/typeConverters';
1112

1213
class TypeScriptDocumentHighlightProvider implements vscode.DocumentHighlightProvider {
@@ -48,9 +49,9 @@ function convertDocumentHighlight(highlight: Proto.DocumentHighlightsItem): Read
4849
}
4950

5051
export function register(
51-
selector: vscode.DocumentSelector,
52+
selector: DocumentSelector,
5253
client: ITypeScriptServiceClient,
5354
) {
54-
return vscode.languages.registerDocumentHighlightProvider(selector,
55+
return vscode.languages.registerDocumentHighlightProvider(selector.syntax,
5556
new TypeScriptDocumentHighlightProvider(client));
5657
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import * as vscode from 'vscode';
77
import type * as Proto from '../protocol';
88
import * as PConst from '../protocol.const';
9-
import { ITypeScriptServiceClient } from '../typescriptService';
10-
import * as typeConverters from '../utils/typeConverters';
119
import { CachedResponse } from '../tsServer/cachedResponse';
10+
import { ITypeScriptServiceClient } from '../typescriptService';
11+
import { DocumentSelector } from '../utils/documentSelector';
1212
import { parseKindModifier } from '../utils/modifiers';
13+
import * as typeConverters from '../utils/typeConverters';
1314

1415
const getSymbolKind = (kind: string): vscode.SymbolKind => {
1516
switch (kind) {
@@ -111,10 +112,10 @@ class TypeScriptDocumentSymbolProvider implements vscode.DocumentSymbolProvider
111112
}
112113

113114
export function register(
114-
selector: vscode.DocumentSelector,
115+
selector: DocumentSelector,
115116
client: ITypeScriptServiceClient,
116117
cachedResponse: CachedResponse<Proto.NavTreeResponse>,
117118
) {
118-
return vscode.languages.registerDocumentSymbolProvider(selector,
119+
return vscode.languages.registerDocumentSymbolProvider(selector.syntax,
119120
new TypeScriptDocumentSymbolProvider(client, cachedResponse), { label: 'TypeScript' });
120121
}

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
import * as vscode from 'vscode';
77
import * as nls from 'vscode-nls';
88
import type * as Proto from '../protocol';
9-
import { ITypeScriptServiceClient } from '../typescriptService';
9+
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
1010
import API from '../utils/api';
11-
import { conditionalRegistration, requireMinVersion } from '../utils/dependentRegistration';
11+
import { conditionalRegistration, requireSomeCapability, requireMinVersion } from '../utils/dependentRegistration';
12+
import { DocumentSelector } from '../utils/documentSelector';
1213
import * as errorCodes from '../utils/errorCodes';
1314
import * as fixNames from '../utils/fixNames';
1415
import * as typeConverters from '../utils/typeConverters';
@@ -249,15 +250,16 @@ class TypeScriptAutoFixProvider implements vscode.CodeActionProvider {
249250
}
250251

251252
export function register(
252-
selector: vscode.DocumentSelector,
253+
selector: DocumentSelector,
253254
client: ITypeScriptServiceClient,
254255
fileConfigurationManager: FileConfigurationManager,
255256
diagnosticsManager: DiagnosticsManager,
256257
) {
257258
return conditionalRegistration([
258-
requireMinVersion(client, API.v300)
259+
requireMinVersion(client, API.v300),
260+
requireSomeCapability(client, ClientCapability.Semantic),
259261
], () => {
260262
const provider = new TypeScriptAutoFixProvider(client, fileConfigurationManager, diagnosticsManager);
261-
return vscode.languages.registerCodeActionsProvider(selector, provider, provider.metadata);
263+
return vscode.languages.registerCodeActionsProvider(selector.semantic, provider, provider.metadata);
262264
});
263265
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ITypeScriptServiceClient } from '../typescriptService';
99
import API from '../utils/api';
1010
import { coalesce } from '../utils/arrays';
1111
import { conditionalRegistration, requireMinVersion } from '../utils/dependentRegistration';
12+
import { DocumentSelector } from '../utils/documentSelector';
1213
import * as typeConverters from '../utils/typeConverters';
1314

1415
class TypeScriptFoldingProvider implements vscode.FoldingRangeProvider {
@@ -73,13 +74,13 @@ class TypeScriptFoldingProvider implements vscode.FoldingRangeProvider {
7374
}
7475

7576
export function register(
76-
selector: vscode.DocumentSelector,
77+
selector: DocumentSelector,
7778
client: ITypeScriptServiceClient,
7879
): vscode.Disposable {
7980
return conditionalRegistration([
8081
requireMinVersion(client, TypeScriptFoldingProvider.minVersion),
8182
], () => {
82-
return vscode.languages.registerFoldingRangeProvider(selector,
83+
return vscode.languages.registerFoldingRangeProvider(selector.syntax,
8384
new TypeScriptFoldingProvider(client));
8485
});
8586
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as vscode from 'vscode';
77
import type * as Proto from '../protocol';
88
import { ITypeScriptServiceClient } from '../typescriptService';
99
import { conditionalRegistration, requireConfiguration } from '../utils/dependentRegistration';
10+
import { DocumentSelector } from '../utils/documentSelector';
1011
import * as typeConverters from '../utils/typeConverters';
1112
import FileConfigurationManager from './fileConfigurationManager';
1213

@@ -84,7 +85,7 @@ class TypeScriptFormattingProvider implements vscode.DocumentRangeFormattingEdit
8485
}
8586

8687
export function register(
87-
selector: vscode.DocumentSelector,
88+
selector: DocumentSelector,
8889
modeId: string,
8990
client: ITypeScriptServiceClient,
9091
fileConfigurationManager: FileConfigurationManager
@@ -94,8 +95,8 @@ export function register(
9495
], () => {
9596
const formattingProvider = new TypeScriptFormattingProvider(client, fileConfigurationManager);
9697
return vscode.Disposable.from(
97-
vscode.languages.registerOnTypeFormattingEditProvider(selector, formattingProvider, ';', '}', '\n'),
98-
vscode.languages.registerDocumentRangeFormattingEditProvider(selector, formattingProvider),
98+
vscode.languages.registerOnTypeFormattingEditProvider(selector.syntax, formattingProvider, ';', '}', '\n'),
99+
vscode.languages.registerDocumentRangeFormattingEditProvider(selector.syntax, formattingProvider),
99100
);
100101
});
101102
}

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
import * as vscode from 'vscode';
77
import type * as Proto from '../protocol';
8-
import { ITypeScriptServiceClient } from '../typescriptService';
8+
import { ClientCapability, ITypeScriptServiceClient } from '../typescriptService';
9+
import { conditionalRegistration, requireSomeCapability } from '../utils/dependentRegistration';
10+
import { DocumentSelector } from '../utils/documentSelector';
911
import { markdownDocumentation } from '../utils/previewer';
1012
import * as typeConverters from '../utils/typeConverters';
1113

@@ -51,9 +53,13 @@ class TypeScriptHoverProvider implements vscode.HoverProvider {
5153
}
5254

5355
export function register(
54-
selector: vscode.DocumentSelector,
56+
selector: DocumentSelector,
5557
client: ITypeScriptServiceClient
5658
): vscode.Disposable {
57-
return vscode.languages.registerHoverProvider(selector,
58-
new TypeScriptHoverProvider(client));
59+
return conditionalRegistration([
60+
requireSomeCapability(client, ClientCapability.EnhancedSyntax, ClientCapability.Semantic),
61+
], () => {
62+
return vscode.languages.registerHoverProvider(selector.syntax,
63+
new TypeScriptHoverProvider(client));
64+
});
5965
}

0 commit comments

Comments
 (0)