-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathapi_impl.ts
116 lines (98 loc) · 3.25 KB
/
api_impl.ts
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
import { DScannerIniSection, ServeD } from "./extension";
import { CodedAPI, Snippet } from "code-d-api";
import * as vscode from "vscode";
/**
* Implementation of the code-d API using serve-d
*/
export class CodedAPIServedImpl implements CodedAPI {
protected served?: ServeD;
protected dependencySnippetsToRegister: [string[], Snippet][] = [];
registerDependencyBasedSnippet(requiredDependencies: string[], snippet: Snippet): void {
this.dependencySnippetsToRegister.push([requiredDependencies, snippet]);
this.served?.addDependencySnippet({
requiredDependencies: requiredDependencies,
snippet: snippet
});
}
registerDependencyBasedSnippets(requiredDependencies: string[], snippets: Snippet[]): void {
snippets.forEach(snippet => {
this.registerDependencyBasedSnippet(requiredDependencies, snippet);
});
}
refreshDependencies(): boolean {
if (this.served) {
this.served.refreshDependencies();
return true;
} else {
return false;
}
}
triggerDscanner(uri: string | vscode.Uri): boolean {
if (this.served) {
if (typeof uri == "string")
uri = vscode.Uri.parse(uri);
this.served.triggerDscanner(uri);
return true;
} else {
return false;
}
}
async listDscannerConfig(uri: string | vscode.Uri): Promise<DScannerIniSection[]> {
if (typeof uri == "string")
uri = vscode.Uri.parse(uri);
const served = await this.waitForInternalImplementation();
return await served.listDScannerConfig(uri);
}
async findFiles(query: string): Promise<string[]> {
const served = await this.waitForInternalImplementation();
return await served.findFiles(query);
}
async findFilesByModule(query: string): Promise<string[]> {
const served = await this.waitForInternalImplementation();
return await served.findFilesByModule(query);
}
async getActiveDubConfig(): Promise<{ packagePath: string, packageName: string, [unstableExtras: string]: any }> {
const served = await this.waitForInternalImplementation();
return await served.getActiveDubConfig();
}
get isActive(): boolean {
return !!this.served;
}
// ------------------------------------------------------------------------
// Implementation details starting here, no stable API
// ------------------------------------------------------------------------
private _onInternalImplementationReady: vscode.EventEmitter<ServeD> = new vscode.EventEmitter<ServeD>();
readonly onInternalImplementationReady: vscode.Event<ServeD> = this._onInternalImplementationReady.event;
started(served: ServeD) {
this.served = served;
let promises: Thenable<boolean>[] = [];
this.dependencySnippetsToRegister.forEach(snip => {
promises.push(served.addDependencySnippet({
requiredDependencies: snip[0],
snippet: snip[1]
}));
});
Promise.all(promises).then((all) => {
// done
});
}
waitForInternalImplementation(): Thenable<ServeD> {
if (this.served)
return Promise.resolve(this.served);
else
return new Promise((resolve) => {
if (this.served)
resolve(this.served);
else
this.onInternalImplementationReady(resolve);
});
}
// singleton
static instance?: CodedAPIServedImpl;
static getInstance(): CodedAPIServedImpl {
if (this.instance)
return this.instance;
else
return this.instance = new CodedAPIServedImpl();
}
}