forked from DonJayamanne/pythonVSCode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmockLanguageServer.ts
More file actions
122 lines (110 loc) · 3.98 KB
/
mockLanguageServer.ts
File metadata and controls
122 lines (110 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
'use strict';
import {
CancellationToken,
CodeLens,
CompletionContext,
CompletionItem,
CompletionList,
DocumentSymbol,
Hover,
Location,
LocationLink,
Position,
ProviderResult,
ReferenceContext,
SignatureHelp,
SignatureHelpContext,
SymbolInformation,
TextDocument,
TextDocumentContentChangeEvent,
WorkspaceEdit
} from 'vscode';
import { ILanguageServer } from '../../client/activation/types';
import { createDeferred, Deferred } from '../../client/common/utils/async';
import { noop } from '../../client/common/utils/misc';
// tslint:disable:no-any unified-signatures
export class MockLanguageServer implements ILanguageServer {
private notificationPromise: Deferred<void> | undefined;
private contents = '';
private versionId: number = 0;
public waitForNotification(): Promise<void> {
this.notificationPromise = createDeferred();
return this.notificationPromise.promise;
}
public getDocumentContents(): string {
return this.contents;
}
public getVersionId(): number | null {
return this.versionId;
}
public handleChanges(document: TextDocument, changes: TextDocumentContentChangeEvent[]) {
this.versionId = document.version;
this.applyChanges(changes);
this.resolveNotificationPromise();
}
public handleOpen(_document: TextDocument) {
noop();
}
public provideRenameEdits(_document: TextDocument, _position: Position, _newName: string, _token: CancellationToken): ProviderResult<WorkspaceEdit> {
this.resolveNotificationPromise();
return null;
}
public provideDefinition(_document: TextDocument, _position: Position, _token: CancellationToken): ProviderResult<Location | Location[] | LocationLink[]> {
this.resolveNotificationPromise();
return null;
}
public provideHover(_document: TextDocument, _position: Position, _token: CancellationToken): ProviderResult<Hover> {
this.resolveNotificationPromise();
return null;
}
public provideReferences(_document: TextDocument, _position: Position, _context: ReferenceContext, _token: CancellationToken): ProviderResult<Location[]> {
this.resolveNotificationPromise();
return null;
}
public provideCompletionItems(
_document: TextDocument,
_position: Position,
_token: CancellationToken,
_context: CompletionContext
): ProviderResult<CompletionItem[] | CompletionList> {
this.resolveNotificationPromise();
return null;
}
public provideCodeLenses(_document: TextDocument, _token: CancellationToken): ProviderResult<CodeLens[]> {
this.resolveNotificationPromise();
return null;
}
public provideDocumentSymbols(_document: TextDocument, _token: CancellationToken): ProviderResult<SymbolInformation[] | DocumentSymbol[]> {
this.resolveNotificationPromise();
return null;
}
public provideSignatureHelp(_document: TextDocument, _position: Position, _token: CancellationToken, _context: SignatureHelpContext): ProviderResult<SignatureHelp> {
this.resolveNotificationPromise();
return null;
}
public dispose(): void {
noop();
}
public disconnect(): void {
noop();
}
public reconnect(): void {
noop();
}
private applyChanges(changes: TextDocumentContentChangeEvent[]) {
changes.forEach(c => {
const before = this.contents.substr(0, c.rangeOffset);
const after = this.contents.substr(c.rangeOffset + c.rangeLength);
this.contents = `${before}${c.text}${after}`;
});
this.versionId = this.versionId + 1;
}
private resolveNotificationPromise() {
if (this.notificationPromise) {
this.notificationPromise.resolve();
this.notificationPromise = undefined;
}
}
}