Skip to content
This repository was archived by the owner on Feb 22, 2020. It is now read-only.

Commit cc4506a

Browse files
committed
feat: support custom initializationOptions
1 parent b2193f3 commit cc4506a

File tree

6 files changed

+33
-11
lines changed

6 files changed

+33
-11
lines changed

src/connection.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ export const webSocketTransport = ({
7171
map(({ params }) => params)
7272
),
7373
unsubscribe: () => {
74-
attempt(() => socket.close())
75-
attempt(() => connection.dispose())
74+
console.log(new Error('unsub'))
75+
console.log('attempt', attempt(() => socket.close()))
76+
console.log('attempt2', attempt(() => connection.dispose()))
7677
},
7778
}
7879
}

src/features/definition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const definitionFeature: Feature<typeof DefinitionRequest.type, 'definiti
1515
DefinitionRequest.type,
1616
convertProviderParams({ textDocument, position }, { clientToServerURI })
1717
)
18-
rewriteUris(result, serverToClientURI)
18+
rewriteUris(result, uri => serverToClientURI(uri, scopeRootUri))
1919
return convertLocations(sourcegraph, result as Location | Location[] | null)
2020
},
2121
}

src/features/feature.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface Feature<R extends RequestType<any, any, any, any>, C extends ke
1414
sourcegraph: typeof import('sourcegraph')
1515
scopeRootUri: URL | null
1616
clientToServerURI: (uri: URL) => URL
17-
serverToClientURI: (uri: URL) => URL
17+
serverToClientURI: (uri: URL, scopeRootUri: URL | null) => URL
1818
registerOptions: RegistrationOptions<R>
1919
}): Unsubscribable
2020
}

src/features/hover.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const hoverFeature: Feature<typeof HoverRequest.type, 'hoverProvider'> =
1515
HoverRequest.type,
1616
convertProviderParams({ textDocument, position }, { clientToServerURI })
1717
)
18-
rewriteUris(result, serverToClientURI)
18+
rewriteUris(result, uri => serverToClientURI(uri, scopeRootUri))
1919
return convertHover(sourcegraph, result)
2020
},
2121
}

src/features/references.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const referencesFeature: Feature<typeof ReferencesRequest.type, 'referenc
1515
...convertProviderParams({ textDocument, position }, { clientToServerURI }),
1616
context,
1717
})
18-
rewriteUris(result, serverToClientURI)
18+
rewriteUris(result, uri => serverToClientURI(uri, scopeRootUri))
1919
return convertLocations(sourcegraph, result)
2020
},
2121
}

src/index.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { differenceBy, identity } from 'lodash'
22
import * as path from 'path'
33
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'
55
import { DocumentSelector, ProgressReporter, WorkspaceRoot } from 'sourcegraph'
66
import * as uuid from 'uuid'
77
import {
@@ -71,11 +71,12 @@ export interface RegisterOptions {
7171
sourcegraph: SourcegraphAPI
7272
supportsWorkspaceFolders?: boolean
7373
clientToServerURI?: (uri: URL) => URL
74-
serverToClientURI?: (uri: URL) => URL
74+
serverToClientURI?: (uri: URL, scopeRootUri: URL | null) => URL
7575
afterInitialize?: (initializeResult: InitializeResult) => Promise<void> | void
7676
logger?: Logger
7777
transport: () => Promise<LSPConnection> | LSPConnection
7878
documentSelector: DocumentSelector
79+
additionalInitializationOptions?: (url: URL) => any
7980
}
8081
export async function register({
8182
sourcegraph,
@@ -87,6 +88,7 @@ export async function register({
8788
afterInitialize = noop,
8889
transport: createConnection,
8990
documentSelector,
91+
additionalInitializationOptions,
9092
}: RegisterOptions): Promise<LSPClient> {
9193
const subscriptions = new Subscription()
9294
// tslint:disable-next-line:no-object-literal-type-assertion
@@ -153,7 +155,10 @@ export async function register({
153155
}
154156
}
155157

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> {
157162
const subscriptions = new Subscription()
158163
const decorationType = sourcegraph.app.createDecorationType()
159164
const connection = await createConnection()
@@ -188,7 +193,7 @@ export async function register({
188193
subscriptions.add(
189194
connection.observeNotification(PublishDiagnosticsNotification.type).subscribe(params => {
190195
const uri = new URL(params.uri)
191-
const sourcegraphTextDocumentUri = serverToClientURI(uri)
196+
const sourcegraphTextDocumentUri = serverToClientURI(uri, clientRootUri)
192197
diagnosticsByUri.set(sourcegraphTextDocumentUri.href, params.diagnostics)
193198
for (const appWindow of sourcegraph.app.windows) {
194199
for (const viewComponent of appWindow.visibleViewComponents) {
@@ -256,6 +261,7 @@ export async function register({
256261
}
257262
})
258263
)
264+
connection.closeEvent.subscribe(() => console.log('closed'))
259265
await initializeConnection(connection, clientRootUri, initParams)
260266
return connection
261267
}
@@ -265,7 +271,13 @@ export async function register({
265271
clientRootUri: URL | null,
266272
initParams: InitializeParams
267273
): 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: '/' })
269281
// Tell language server about all currently open text documents under this root
270282
syncTextDocuments(connection)
271283

@@ -292,6 +304,8 @@ export async function register({
292304
rootUri: null,
293305
capabilities: clientCapabilities,
294306
workspaceFolders: sourcegraph.workspace.roots.map(toLSPWorkspaceFolder({ clientToServerURI })),
307+
originalRootUri: null,
308+
initializationOptions: additionalInitializationOptions,
295309
}
296310
)
297311
subscriptions.add(connection)
@@ -359,15 +373,18 @@ export async function register({
359373
{
360374
processId: null,
361375
rootUri: serverRootUri.href,
376+
originalRootUri: workspaceFolder.href,
362377
capabilities: clientCapabilities,
363378
workspaceFolders: null,
379+
initializationOptions: additionalInitializationOptions,
364380
}
365381
)
366382
subscriptions.add(connection)
367383
try {
368384
return await fn(connection)
369385
} finally {
370386
connectionsByRootUri.delete(workspaceFolder.href)
387+
console.log('unsub')
371388
connection.unsubscribe()
372389
}
373390
}
@@ -380,9 +397,11 @@ export async function register({
380397
new URL(root.uri.toString()),
381398
{
382399
processId: null,
400+
originalRootUri: root.uri.toString(),
383401
rootUri: serverRootUri.href,
384402
capabilities: clientCapabilities,
385403
workspaceFolders: null,
404+
initializationOptions: additionalInitializationOptions,
386405
}
387406
)
388407
subscriptions.add(connection)
@@ -399,6 +418,7 @@ export async function register({
399418
subscriptions.add(
400419
from(sourcegraph.workspace.rootChanges)
401420
.pipe(
421+
buffer(from(sourcegraph.workspace.rootChanges).pipe(debounceTime(1000))),
402422
startWith(null),
403423
map(() => [...sourcegraph.workspace.roots]),
404424
scan((before, after) => {
@@ -408,6 +428,7 @@ export async function register({
408428

409429
// Close connections for removed workspaces
410430
const removed = differenceBy(before, after, root => root.uri.toString())
431+
console.log(before, after, added, removed)
411432
// tslint:disable-next-line no-floating-promises
412433
Promise.all(
413434
removed.map(async root => {

0 commit comments

Comments
 (0)