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

feat: add support for custom initializationOptions and originalRootUri #11

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/features/definition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const definitionFeature: Feature<typeof DefinitionRequest.type, 'definiti
DefinitionRequest.type,
convertProviderParams({ textDocument, position }, { clientToServerURI })
)
rewriteUris(result, serverToClientURI)
rewriteUris(result, uri => serverToClientURI(uri, scopeRootUri))
return convertLocations(sourcegraph, result as Location | Location[] | null)
},
}
Expand Down
2 changes: 1 addition & 1 deletion src/features/feature.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export interface Feature<R extends RequestType<any, any, any, any>, C extends ke
sourcegraph: typeof import('sourcegraph')
scopeRootUri: URL | null
clientToServerURI: (uri: URL) => URL
serverToClientURI: (uri: URL) => URL
serverToClientURI: (uri: URL, scopeRootUri: URL | null) => URL
registerOptions: RegistrationOptions<R>
}): Unsubscribable
}
Expand Down
2 changes: 1 addition & 1 deletion src/features/hover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const hoverFeature: Feature<typeof HoverRequest.type, 'hoverProvider'> =
HoverRequest.type,
convertProviderParams({ textDocument, position }, { clientToServerURI })
)
rewriteUris(result, serverToClientURI)
rewriteUris(result, uri => serverToClientURI(uri, scopeRootUri))
return convertHover(sourcegraph, result)
},
}
Expand Down
2 changes: 1 addition & 1 deletion src/features/references.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const referencesFeature: Feature<typeof ReferencesRequest.type, 'referenc
...convertProviderParams({ textDocument, position }, { clientToServerURI }),
context,
})
rewriteUris(result, serverToClientURI)
rewriteUris(result, uri => serverToClientURI(uri, scopeRootUri))
return convertLocations(sourcegraph, result)
},
}
Expand Down
27 changes: 22 additions & 5 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { differenceBy, identity } from 'lodash'
import * as path from 'path'
import { from, noop, Subscription, Unsubscribable } from 'rxjs'
import { map, scan, startWith } from 'rxjs/operators'
import { map, scan, startWith, buffer, debounceTime } from 'rxjs/operators'
import { DocumentSelector, ProgressReporter, WorkspaceRoot } from 'sourcegraph'
import * as uuid from 'uuid'
import {
Expand Down Expand Up @@ -71,11 +71,12 @@ export interface RegisterOptions {
sourcegraph: SourcegraphAPI
supportsWorkspaceFolders?: boolean
clientToServerURI?: (uri: URL) => URL
serverToClientURI?: (uri: URL) => URL
serverToClientURI?: (uri: URL, scopeRootUri: URL | null) => URL
afterInitialize?: (initializeResult: InitializeResult) => Promise<void> | void
logger?: Logger
transport: () => Promise<LSPConnection> | LSPConnection
documentSelector: DocumentSelector
additionalInitializationOptions?: (url: URL) => any
}
export async function register({
sourcegraph,
Expand All @@ -87,6 +88,7 @@ export async function register({
afterInitialize = noop,
transport: createConnection,
documentSelector,
additionalInitializationOptions,
}: RegisterOptions): Promise<LSPClient> {
const subscriptions = new Subscription()
// tslint:disable-next-line:no-object-literal-type-assertion
Expand Down Expand Up @@ -153,7 +155,10 @@ export async function register({
}
}

async function connect(clientRootUri: URL | null, initParams: InitializeParams): Promise<LSPConnection> {
async function connect(
clientRootUri: URL | null,
initParams: InitializeParams
): Promise<LSPConnection> {
const subscriptions = new Subscription()
const decorationType = sourcegraph.app.createDecorationType()
const connection = await createConnection()
Expand Down Expand Up @@ -188,7 +193,7 @@ export async function register({
subscriptions.add(
connection.observeNotification(PublishDiagnosticsNotification.type).subscribe(params => {
const uri = new URL(params.uri)
const sourcegraphTextDocumentUri = serverToClientURI(uri)
const sourcegraphTextDocumentUri = serverToClientURI(uri, clientRootUri)
diagnosticsByUri.set(sourcegraphTextDocumentUri.href, params.diagnostics)
for (const appWindow of sourcegraph.app.windows) {
for (const viewComponent of appWindow.visibleViewComponents) {
Expand Down Expand Up @@ -265,7 +270,12 @@ export async function register({
clientRootUri: URL | null,
initParams: InitializeParams
): Promise<void> {
const initializeResult = await connection.sendRequest(InitializeRequest.type, initParams)
// TODO passing a function around in initializationOptions is hacky,
// consider moving it to a separate parameter
if (initParams.initializationOptions && clientRootUri) {
initParams.initializationOptions = initParams.initializationOptions(clientRootUri)
}
const initializeResult = await connection.sendRequest(InitializeRequest.type, { ...initParams, rootPath: '/' })
// Tell language server about all currently open text documents under this root
syncTextDocuments(connection)

Expand All @@ -292,6 +302,7 @@ export async function register({
rootUri: null,
capabilities: clientCapabilities,
workspaceFolders: sourcegraph.workspace.roots.map(toLSPWorkspaceFolder({ clientToServerURI })),
initializationOptions: additionalInitializationOptions,
}
)
subscriptions.add(connection)
Expand Down Expand Up @@ -361,6 +372,7 @@ export async function register({
rootUri: serverRootUri.href,
capabilities: clientCapabilities,
workspaceFolders: null,
initializationOptions: additionalInitializationOptions,
}
)
subscriptions.add(connection)
Expand All @@ -383,6 +395,7 @@ export async function register({
rootUri: serverRootUri.href,
capabilities: clientCapabilities,
workspaceFolders: null,
initializationOptions: additionalInitializationOptions,
}
)
subscriptions.add(connection)
Expand All @@ -399,6 +412,10 @@ export async function register({
subscriptions.add(
from(sourcegraph.workspace.rootChanges)
.pipe(
// TODO try to fix sourcegraph/sourcegraph so that it
// doesn't emit empty workspace roots between page
// navigations
buffer(from(sourcegraph.workspace.rootChanges).pipe(debounceTime(1000))),
startWith(null),
map(() => [...sourcegraph.workspace.roots]),
scan((before, after) => {
Expand Down