1
1
import { differenceBy , identity } from 'lodash'
2
2
import * as path from 'path'
3
3
import { from , noop , Subscription , Unsubscribable } from 'rxjs'
4
- import { map , scan , startWith } from 'rxjs/operators'
4
+ import { map , scan , startWith , buffer , debounceTime } from 'rxjs/operators'
5
5
import { DocumentSelector , ProgressReporter , WorkspaceRoot } from 'sourcegraph'
6
6
import * as uuid from 'uuid'
7
7
import {
@@ -71,11 +71,12 @@ export interface RegisterOptions {
71
71
sourcegraph : SourcegraphAPI
72
72
supportsWorkspaceFolders ?: boolean
73
73
clientToServerURI ?: ( uri : URL ) => URL
74
- serverToClientURI ?: ( uri : URL ) => URL
74
+ serverToClientURI ?: ( uri : URL , scopeRootUri : URL | null ) => URL
75
75
afterInitialize ?: ( initializeResult : InitializeResult ) => Promise < void > | void
76
76
logger ?: Logger
77
77
transport : ( ) => Promise < LSPConnection > | LSPConnection
78
78
documentSelector : DocumentSelector
79
+ additionalInitializationOptions ?: ( url : URL ) => any
79
80
}
80
81
export async function register ( {
81
82
sourcegraph,
@@ -87,6 +88,7 @@ export async function register({
87
88
afterInitialize = noop ,
88
89
transport : createConnection ,
89
90
documentSelector,
91
+ additionalInitializationOptions,
90
92
} : RegisterOptions ) : Promise < LSPClient > {
91
93
const subscriptions = new Subscription ( )
92
94
// tslint:disable-next-line:no-object-literal-type-assertion
@@ -153,7 +155,10 @@ export async function register({
153
155
}
154
156
}
155
157
156
- async function connect ( clientRootUri : URL | null , initParams : InitializeParams ) : Promise < LSPConnection > {
158
+ async function connect (
159
+ clientRootUri : URL | null ,
160
+ initParams : InitializeParams & { originalRootUri ?: string | null }
161
+ ) : Promise < LSPConnection > {
157
162
const subscriptions = new Subscription ( )
158
163
const decorationType = sourcegraph . app . createDecorationType ( )
159
164
const connection = await createConnection ( )
@@ -188,7 +193,7 @@ export async function register({
188
193
subscriptions . add (
189
194
connection . observeNotification ( PublishDiagnosticsNotification . type ) . subscribe ( params => {
190
195
const uri = new URL ( params . uri )
191
- const sourcegraphTextDocumentUri = serverToClientURI ( uri )
196
+ const sourcegraphTextDocumentUri = serverToClientURI ( uri , clientRootUri )
192
197
diagnosticsByUri . set ( sourcegraphTextDocumentUri . href , params . diagnostics )
193
198
for ( const appWindow of sourcegraph . app . windows ) {
194
199
for ( const viewComponent of appWindow . visibleViewComponents ) {
@@ -256,6 +261,7 @@ export async function register({
256
261
}
257
262
} )
258
263
)
264
+ connection . closeEvent . subscribe ( ( ) => console . log ( 'closed' ) )
259
265
await initializeConnection ( connection , clientRootUri , initParams )
260
266
return connection
261
267
}
@@ -265,7 +271,13 @@ export async function register({
265
271
clientRootUri : URL | null ,
266
272
initParams : InitializeParams
267
273
) : Promise < void > {
268
- const initializeResult = await connection . sendRequest ( InitializeRequest . type , initParams )
274
+ // total hack
275
+ if ( initParams . initializationOptions && clientRootUri ) {
276
+ initParams . initializationOptions = initParams . initializationOptions ( clientRootUri )
277
+ } else {
278
+ console . log ( 'Garr, did not work' , initParams . initializationOptions , clientRootUri )
279
+ }
280
+ const initializeResult = await connection . sendRequest ( InitializeRequest . type , { ...initParams , rootPath : '/' } )
269
281
// Tell language server about all currently open text documents under this root
270
282
syncTextDocuments ( connection )
271
283
@@ -292,6 +304,8 @@ export async function register({
292
304
rootUri : null ,
293
305
capabilities : clientCapabilities ,
294
306
workspaceFolders : sourcegraph . workspace . roots . map ( toLSPWorkspaceFolder ( { clientToServerURI } ) ) ,
307
+ originalRootUri : null ,
308
+ initializationOptions : additionalInitializationOptions ,
295
309
}
296
310
)
297
311
subscriptions . add ( connection )
@@ -359,15 +373,18 @@ export async function register({
359
373
{
360
374
processId : null ,
361
375
rootUri : serverRootUri . href ,
376
+ originalRootUri : workspaceFolder . href ,
362
377
capabilities : clientCapabilities ,
363
378
workspaceFolders : null ,
379
+ initializationOptions : additionalInitializationOptions ,
364
380
}
365
381
)
366
382
subscriptions . add ( connection )
367
383
try {
368
384
return await fn ( connection )
369
385
} finally {
370
386
connectionsByRootUri . delete ( workspaceFolder . href )
387
+ console . log ( 'unsub' )
371
388
connection . unsubscribe ( )
372
389
}
373
390
}
@@ -380,9 +397,11 @@ export async function register({
380
397
new URL ( root . uri . toString ( ) ) ,
381
398
{
382
399
processId : null ,
400
+ originalRootUri : root . uri . toString ( ) ,
383
401
rootUri : serverRootUri . href ,
384
402
capabilities : clientCapabilities ,
385
403
workspaceFolders : null ,
404
+ initializationOptions : additionalInitializationOptions ,
386
405
}
387
406
)
388
407
subscriptions . add ( connection )
@@ -399,6 +418,7 @@ export async function register({
399
418
subscriptions . add (
400
419
from ( sourcegraph . workspace . rootChanges )
401
420
. pipe (
421
+ buffer ( from ( sourcegraph . workspace . rootChanges ) . pipe ( debounceTime ( 1000 ) ) ) ,
402
422
startWith ( null ) ,
403
423
map ( ( ) => [ ...sourcegraph . workspace . roots ] ) ,
404
424
scan ( ( before , after ) => {
@@ -408,6 +428,7 @@ export async function register({
408
428
409
429
// Close connections for removed workspaces
410
430
const removed = differenceBy ( before , after , root => root . uri . toString ( ) )
431
+ console . log ( before , after , added , removed )
411
432
// tslint:disable-next-line no-floating-promises
412
433
Promise . all (
413
434
removed . map ( async root => {
0 commit comments