Skip to content
This repository was archived by the owner on Nov 6, 2018. It is now read-only.

Commit 1e890c2

Browse files
committed
feat: remove ServerCapabilities and InitializeResult
These are no longer useful because extension code does not execute until *after* the initialize result is sent, so it would not differ per-extension.
1 parent 954d11f commit 1e890c2

26 files changed

+46
-427
lines changed

src/client/client.integration.test.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const createClientTransportsForTestServer = (
1818

1919
describe('Client', () => {
2020
it('registers features, activates, initializes, stops, and reactivates', async () => {
21-
const initResult: InitializeResult = { capabilities: { hoverProvider: true } }
21+
const initResult: InitializeResult = {}
2222
const testNotificationParams = { a: 1 }
2323
const testRequestParams = { b: 2 }
2424
const testRequestResult = { c: 3 }
@@ -92,7 +92,6 @@ describe('Client', () => {
9292
const client = new Client('', { createMessageTransports })
9393
client.registerFeature({
9494
fillClientCapabilities: (capabilities: ClientCapabilities) => (capabilities.experimental = 'test'),
95-
initialize: () => void 0,
9695
})
9796
assert.strictEqual(getClientState(client), ClientState.Initial)
9897

src/client/client.test.ts

-2
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,11 @@ describe('Client', () => {
3232

3333
const FIXTURE_STATIC_FEATURE: StaticFeature = {
3434
fillClientCapabilities: (capabilities: ClientCapabilities) => (capabilities.experimental = 'test'),
35-
initialize: () => void 0,
3635
}
3736

3837
const FIXTURE_DYNAMIC_FEATURE: DynamicFeature<any> = {
3938
messages: { method: 'm' },
4039
fillClientCapabilities: (capabilities: ClientCapabilities) => (capabilities.experimental = 'test'),
41-
initialize: () => void 0,
4240
register: () => void 0,
4341
unregister: () => void 0,
4442
unregisterAll: () => void 0,

src/client/client.ts

-5
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,6 @@ export class Client implements Unsubscribable {
227227

228228
connection.sendNotification(InitializedNotification.type, {})
229229

230-
// Initialize features.
231-
for (const feature of this.features) {
232-
feature.initialize(result.capabilities, this.options.documentSelector)
233-
}
234-
235230
this._state.next(ClientState.Active)
236231
})
237232
.then(null, err =>

src/client/errorHandler.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import { Message, ResponseError } from '../jsonrpc2/messages'
2-
import { InitializeError } from '../protocol'
1+
import { Message } from '../jsonrpc2/messages'
32

43
/**
54
* Called by the client when initialization fails to determine how to proceed.
65
*
76
* @returns true to attempt reinitialization, false otherwise
87
*/
9-
export type InitializationFailedHandler = (
10-
error: ResponseError<InitializeError> | Error | any
11-
) => boolean | Promise<boolean>
8+
export type InitializationFailedHandler = (error: Error) => boolean | Promise<boolean>
129

1310
/**
1411
* A pluggable error handler that is invoked when the connection encounters an error or is closed.

src/client/features/command.test.ts

-14
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,6 @@ describe('ExecuteCommandFeature', () => {
2424
} as ClientCapabilities)
2525
})
2626

27-
describe('upon initialization', () => {
28-
it('registers the provider if the server has executeCommandProvider', () => {
29-
const { registry, feature } = create()
30-
feature.initialize({ executeCommandProvider: { commands: ['c1', 'c2'] } })
31-
assert.strictEqual(registry.commandsSnapshot.length, 2)
32-
})
33-
34-
it('does not register the provider if the server lacks executeCommandProvider', () => {
35-
const { registry, feature } = create()
36-
feature.initialize({ executeCommandProvider: undefined })
37-
assert.strictEqual(registry.commandsSnapshot.length, 0)
38-
})
39-
})
40-
4127
describe('registration', () => {
4228
it('supports dynamic registration and unregistration', () => {
4329
const { registry, feature } = create()

src/client/features/command.ts

-13
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import { Subscription } from 'rxjs'
2-
import uuidv4 from 'uuid/v4'
32
import { CommandRegistry } from '../../environment/providers/command'
43
import { MessageType as RPCMessageType } from '../../jsonrpc2/messages'
54
import {
65
ClientCapabilities,
76
ExecuteCommandParams,
87
ExecuteCommandRegistrationOptions,
98
ExecuteCommandRequest,
10-
ServerCapabilities,
119
} from '../../protocol'
1210
import { Client } from '../client'
1311
import { DynamicFeature, ensure, RegistrationData } from './common'
@@ -27,17 +25,6 @@ export class ExecuteCommandFeature implements DynamicFeature<ExecuteCommandRegis
2725
public fillClientCapabilities(capabilities: ClientCapabilities): void {
2826
ensure(ensure(capabilities, 'workspace')!, 'executeCommand')!.dynamicRegistration = true
2927
}
30-
31-
public initialize(capabilities: ServerCapabilities): void {
32-
if (!capabilities.executeCommandProvider) {
33-
return
34-
}
35-
this.register(this.messages, {
36-
id: uuidv4(),
37-
registerOptions: { ...capabilities.executeCommandProvider },
38-
})
39-
}
40-
4128
public register(_message: RPCMessageType, data: RegistrationData<ExecuteCommandRegistrationOptions>): void {
4229
const existing = this.commands.has(data.id)
4330
if (existing) {

src/client/features/common.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import { Unsubscribable } from 'rxjs'
22
import { MessageType as RPCMessageType } from '../../jsonrpc2/messages'
3-
import { ClientCapabilities, InitializeParams, ServerCapabilities } from '../../protocol'
4-
import { DocumentSelector } from '../../types/document'
3+
import { ClientCapabilities, InitializeParams } from '../../protocol'
54
import { isFunction } from '../../util'
65
import { Client } from '../client'
76

87
/** A client feature that exposes functionality that is always enabled. */
98
export interface StaticFeature {
109
fillInitializeParams?: (params: InitializeParams) => void
1110
fillClientCapabilities?: (capabilities: ClientCapabilities) => void
12-
initialize(capabilities: ServerCapabilities, documentSelector: DocumentSelector | undefined): void
11+
12+
/**
13+
* Called when the client connection is initializing. The feature can add client request and notification
14+
* listeners in this method.
15+
*/
16+
initialize?: () => void
1317

1418
/** Free resources acquired in initialize. */
1519
deinitialize?: () => void
@@ -27,13 +31,11 @@ export interface DynamicFeature<T> {
2731
messages: RPCMessageType | RPCMessageType[]
2832
fillInitializeParams?: (params: InitializeParams) => void
2933
fillClientCapabilities(capabilities: ClientCapabilities): void
30-
initialize(capabilities: ServerCapabilities, documentSelector: DocumentSelector | undefined): void
3134
register(message: RPCMessageType, data: RegistrationData<T>): void
3235
unregister(id: string): void
3336

3437
/**
35-
* Unregisters all static and dynamic registrations and prepares the feature to be reused for a
36-
* new connection.
38+
* Unregisters all registrations and prepares the feature to be reused for a new connection.
3739
*/
3840
unregisterAll(): void
3941
}
@@ -81,13 +83,12 @@ export abstract class Feature<O> implements DynamicFeature<O> {
8183

8284
public abstract fillClientCapabilities(capabilities: ClientCapabilities): void
8385

84-
public abstract initialize(capabilities: ServerCapabilities, documentSelector: DocumentSelector): void
85-
8686
public unregister(id: string): void {
8787
const sub = this.subscriptionsByID.get(id)
8888
if (!sub) {
8989
throw new Error(`no registration with ID ${id}`)
9090
}
91+
sub.unsubscribe()
9192
this.subscriptionsByID.delete(id)
9293
}
9394

src/client/features/configuration.test.ts

-14
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,13 @@ describe('ConfigurationChangeNotificationFeature', () => {
2424
} as ClientCapabilities)
2525
})
2626

27-
describe('upon initialization', () => {
28-
it('registers the provider', () => {
29-
const { feature } = create()
30-
feature.initialize({})
31-
})
32-
})
33-
3427
describe('registration', () => {
3528
it('supports dynamic registration and unregistration', () => {
3629
const { feature } = create()
3730
feature.register(feature.messages, { id: 'a', registerOptions: undefined })
3831
feature.unregister('a')
3932
})
4033

41-
it('supports dynamic registration and unregistration after static registration also occurred', () => {
42-
const { feature } = create()
43-
feature.initialize({})
44-
feature.register(feature.messages, { id: 'a', registerOptions: undefined })
45-
feature.unregister('a')
46-
})
47-
4834
it('supports multiple dynamic registrations and unregistrations', () => {
4935
const { feature } = create()
5036
feature.register(feature.messages, { id: 'a', registerOptions: undefined })

src/client/features/configuration.ts

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Observable, Subscription } from 'rxjs'
22
import { first } from 'rxjs/operators'
3-
import uuidv4 from 'uuid/v4'
43
import { MessageType as RPCMessageType } from '../../jsonrpc2/messages'
54
import {
65
ClientCapabilities,
@@ -9,7 +8,6 @@ import {
98
ConfigurationUpdateRequest,
109
DidChangeConfigurationNotification,
1110
InitializeParams,
12-
ServerCapabilities,
1311
} from '../../protocol'
1412
import { Client } from '../client'
1513
import { DynamicFeature, ensure, RegistrationData, StaticFeature } from './common'
@@ -48,11 +46,7 @@ export class ConfigurationChangeNotificationFeature<C extends ConfigurationCasca
4846
ensure(ensure(capabilities, 'configuration')!, 'didChangeConfiguration')!.dynamicRegistration = true
4947
}
5048

51-
public initialize(capabilities: ServerCapabilities): void {
52-
this.register(this.messages, { id: uuidv4(), registerOptions: undefined })
53-
}
54-
55-
public register(message: RPCMessageType, data: RegistrationData<undefined>): void {
49+
public register(_message: RPCMessageType, data: RegistrationData<undefined>): void {
5650
if (this.subscriptionsByID.has(data.id)) {
5751
throw new Error(`registration already exists with ID ${data.id}`)
5852
}

src/client/features/contribution.test.ts

-14
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,6 @@ describe('ContributionFeature', () => {
2525
} as ClientCapabilities)
2626
})
2727

28-
describe('upon initialization', () => {
29-
it('registers contributions if the server reports any', () => {
30-
const { registry, feature } = create()
31-
feature.initialize({ contributions: {} })
32-
assert.strictEqual(registry.entries.value.length, 1)
33-
})
34-
35-
it('does not register contributions if the server lacks any', () => {
36-
const { registry, feature } = create()
37-
feature.initialize({ contributions: undefined })
38-
assert.strictEqual(registry.entries.value.length, 0)
39-
})
40-
})
41-
4228
describe('registration', () => {
4329
it('supports dynamic registration and unregistration', () => {
4430
const { registry, feature } = create()

src/client/features/contribution.ts

+1-12
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import uuidv4 from 'uuid/v4'
21
import {
32
ContributionRegistry,
43
ContributionsEntry,
54
ContributionUnsubscribable,
65
} from '../../environment/providers/contribution'
76
import { MessageType as RPCMessageType } from '../../jsonrpc2/messages'
8-
import { ClientCapabilities, Contributions, ServerCapabilities } from '../../protocol'
7+
import { ClientCapabilities, Contributions } from '../../protocol'
98
import { DynamicFeature, ensure, RegistrationData } from './common'
109

1110
/**
@@ -26,16 +25,6 @@ export class ContributionFeature implements DynamicFeature<Contributions> {
2625
ensure(ensure(capabilities, 'window')!, 'contribution')!.dynamicRegistration = true
2726
}
2827

29-
public initialize(capabilities: ServerCapabilities): void {
30-
if (!capabilities.contributions) {
31-
return
32-
}
33-
this.register(this.messages, {
34-
id: uuidv4(),
35-
registerOptions: capabilities.contributions,
36-
})
37-
}
38-
3928
public register(_message: RPCMessageType, data: RegistrationData<Contributions>): void {
4029
const existing = this.contributions.get(data.id)
4130
if (existing && !data.overwriteExisting) {

src/client/features/decoration.test.ts

+3-9
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('TextDocumentDecorationFeature', () => {
2929
})
3030

3131
describe('upon initialization', () => {
32-
it('registers the provider and listens for notifications if the server has a decorationProvider', done => {
32+
it('registers the provider and listens for notifications', done => {
3333
const { client, registry, feature } = create()
3434

3535
function mockOnNotification(method: string, handler: NotificationHandler<any>): void
@@ -39,7 +39,7 @@ describe('TextDocumentDecorationFeature', () => {
3939
): void
4040
function mockOnNotification(
4141
type: string | NotificationType<TextDocumentPublishDecorationsParams, void>,
42-
params: NotificationHandler<any>
42+
_params: NotificationHandler<any>
4343
): void {
4444
assert.strictEqual(
4545
typeof type === 'string' ? type : type.method,
@@ -49,14 +49,8 @@ describe('TextDocumentDecorationFeature', () => {
4949
}
5050
client.onNotification = mockOnNotification
5151

52-
feature.initialize({ decorationProvider: {} })
52+
feature.initialize()
5353
assert.strictEqual(registry.providersSnapshot.length, 1)
5454
})
55-
56-
it('does not register the provider if the server lacks a decorationProvider', () => {
57-
const { registry, feature } = create()
58-
feature.initialize({ decorationProvider: undefined })
59-
assert.strictEqual(registry.providersSnapshot.length, 0)
60-
})
6155
})
6256
})

src/client/features/decoration.ts

+3-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import uuidv4 from 'uuid/v4'
33
import { TextDocumentIdentifier } from 'vscode-languageserver-types'
44
import { ProvideTextDocumentDecorationSignature } from '../../environment/providers/decoration'
55
import { FeatureProviderRegistry } from '../../environment/providers/registry'
6-
import { ClientCapabilities, ServerCapabilities } from '../../protocol'
6+
import { ClientCapabilities } from '../../protocol'
77
import { TextDocumentDecoration, TextDocumentPublishDecorationsNotification } from '../../protocol/decoration'
88
import { Client } from '../client'
99
import { ensure, Feature } from './common'
@@ -21,6 +21,7 @@ export class TextDocumentDecorationFeature extends Feature<undefined> {
2121
private registry: FeatureProviderRegistry<undefined, ProvideTextDocumentDecorationSignature>
2222
) {
2323
super(client)
24+
this.register(this.messages, { id: uuidv4(), registerOptions: undefined })
2425
}
2526

2627
public readonly messages = TextDocumentPublishDecorationsNotification.type
@@ -29,12 +30,7 @@ export class TextDocumentDecorationFeature extends Feature<undefined> {
2930
ensure(capabilities, 'decoration')
3031
}
3132

32-
public initialize(capabilities: ServerCapabilities): void {
33-
if (!capabilities.decorationProvider) {
34-
return
35-
}
36-
this.register(this.messages, { id: uuidv4(), registerOptions: undefined })
37-
// TODO(sqs): no way to unregister this
33+
public initialize(): void {
3834
this.client.onNotification(TextDocumentPublishDecorationsNotification.type, params => {
3935
this.getDecorationsSubject(params.textDocument, params.decorations)
4036
})

src/client/features/hover.test.ts

+4-8
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,12 @@ describe('TextDocumentHoverFeature', () => {
2727
} as ClientCapabilities)
2828
})
2929

30-
describe('upon initialization', () => {
31-
it('registers the provider if the server has hoverProvider', () => {
30+
describe('registration', () => {
31+
it('supports dynamic registration and unregistration', () => {
3232
const { registry, feature } = create()
33-
feature.initialize({ hoverProvider: true }, ['*'])
33+
feature.register(feature.messages, { id: 'a', registerOptions: { documentSelector: ['*'] } })
3434
assert.strictEqual(registry.providersSnapshot.length, 1)
35-
})
36-
37-
it('does not register the provider if the server lacks hoverProvider', () => {
38-
const { registry, feature } = create()
39-
feature.initialize({ hoverProvider: false }, ['*'])
35+
feature.unregister('a')
4036
assert.strictEqual(registry.providersSnapshot.length, 0)
4137
})
4238
})

src/client/features/hover.ts

-13
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import { from, Observable, Unsubscribable } from 'rxjs'
2-
import uuidv4 from 'uuid/v4'
32
import { Hover, MarkupKind } from 'vscode-languageserver-types'
43
import { ProvideTextDocumentHoverSignature } from '../../environment/providers/hover'
54
import { FeatureProviderRegistry } from '../../environment/providers/registry'
65
import {
76
ClientCapabilities,
87
HoverRequest,
9-
ServerCapabilities,
108
TextDocumentPositionParams,
119
TextDocumentRegistrationOptions,
1210
} from '../../protocol'
13-
import { DocumentSelector } from '../../types/document'
1411
import { Client } from '../client'
1512
import { ensure, Feature } from './common'
1613

@@ -33,16 +30,6 @@ export class TextDocumentHoverFeature extends Feature<TextDocumentRegistrationOp
3330
hoverCapability.contentFormat = [MarkupKind.Markdown, MarkupKind.PlainText]
3431
}
3532

36-
public initialize(capabilities: ServerCapabilities, documentSelector: DocumentSelector): void {
37-
if (!capabilities.hoverProvider || !documentSelector) {
38-
return
39-
}
40-
this.register(this.messages, {
41-
id: uuidv4(),
42-
registerOptions: { documentSelector },
43-
})
44-
}
45-
4633
protected registerProvider(options: TextDocumentRegistrationOptions): Unsubscribable {
4734
return this.registry.registerProvider(
4835
options,

0 commit comments

Comments
 (0)