From 92661532c9d6ec8d5c274e69494e76d0355c278b Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Wed, 7 Aug 2019 13:19:27 -0600 Subject: [PATCH 01/11] Remove feedback button --- extension/src/extension.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 04359dfc4..66f6ffda4 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -6,7 +6,7 @@ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'whatwg-url' Object.assign(_URL, self.URL) Object.assign(self, { URL: _URL, URLSearchParams: _URLSearchParams }) -import { activateBasicCodeIntel, registerFeedbackButton } from '@sourcegraph/basic-code-intel' +import { activateBasicCodeIntel } from '@sourcegraph/basic-code-intel' import { Tracer as LightstepTracer } from '@sourcegraph/lightstep-tracer-webworker' import { createMessageConnection, @@ -118,14 +118,6 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise logger.warn('No typescript.serverUrl configured, falling back to basic code intelligence') // Fall back to basic-code-intel behavior - ctx.subscriptions.add( - registerFeedbackButton({ - languageID: 'typescript', - sourcegraph, - isPrecise: false, - }) - ) - return activateBasicCodeIntel({ sourcegraph, languageID: 'typescript', @@ -157,8 +149,6 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise })(ctx) } - ctx.subscriptions.add(registerFeedbackButton({ languageID: 'typescript', sourcegraph, isPrecise: true })) - const tracer: Tracer = config.value['lightstep.token'] ? new LightstepTracer({ access_token: config.value['lightstep.token'], component_name: 'ext-lang-typescript' }) : new Tracer() From 9b1acbe2a0e147b762fd4c36cd256f0323560ea2 Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Wed, 7 Aug 2019 13:47:46 -0600 Subject: [PATCH 02/11] Bump sourcegraph 23.0.1 --- extension/src/extension.ts | 11 ----------- yarn.lock | 8 ++++---- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 66f6ffda4..fcec13d5b 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -819,17 +819,6 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise rewriteUris(implementationResult, toSourcegraphTextDocumentUri) return convertLocations(implementationResult) }) - // Use both old registerImplementationProvider (pre-3.2) and registerLocationProvider (3.2+) - // for backcompat and forward-compat. This yields a deprecation console.warn on 3.2+. It is - // not possible to just use registerLocationProvider without breaking this functionality - // because of the bug fixed in 3.2 by https://github.com/sourcegraph/sourcegraph/pull/2733 - // affects pre-3.2 versions. The registerImplementationProvider call can be removed when - // supporting backcompat for pre-3.2 is no longer needed. - providers.add( - sourcegraph.languages.registerImplementationProvider(documentSelector, { - provideImplementation: provideImpls, - }) - ) providers.add( sourcegraph.languages.registerLocationProvider(IMPL_ID, documentSelector, { provideLocations: provideImpls, diff --git a/yarn.lock b/yarn.lock index 6c581c8a8..3407455e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6350,10 +6350,10 @@ source-map@^0.7.3: resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sourcegraph@^23.0.0: - version "23.0.0" - resolved "https://registry.npmjs.org/sourcegraph/-/sourcegraph-23.0.0.tgz#1fb96015af3e84cc9cc2944823f04a7e952ed565" - integrity sha512-hQALHrTt+AK5ZAqUAUNhxO7ClSv/xyTjMQPBb+hQykKJrMaHTk+CnJNHs7dRfXYKnbnZeisQRjaxKGX8UecU0Q== +sourcegraph@^23.0.0, sourcegraph@^23.0.1: + version "23.0.1" + resolved "https://registry.npmjs.org/sourcegraph/-/sourcegraph-23.0.1.tgz#715fcf4129a6d94bc3bfd2740d9c706ae6357ffe" + integrity sha512-4We7zqhOagOVxNFdS6/xT/Crhb0Arw/9ytGBu8JuHfjo5yjMtcUYt22kZyu2TaPHXwyPW9muUi1eKSFA6Qg4lw== spdx-correct@^3.0.0: version "3.1.0" From eba101cafcd9999cf1d13d0bad9738a2da6795bf Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Wed, 7 Aug 2019 13:48:01 -0600 Subject: [PATCH 03/11] Bump basic-code-intel 7.0.3 --- extension/src/extension.ts | 21 ++++++++++++++++++--- package.json | 2 +- yarn.lock | 13 +++++++------ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index fcec13d5b..c658cb726 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -6,7 +6,7 @@ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'whatwg-url' Object.assign(_URL, self.URL) Object.assign(self, { URL: _URL, URLSearchParams: _URLSearchParams }) -import { activateBasicCodeIntel } from '@sourcegraph/basic-code-intel' +import { Handler } from '@sourcegraph/basic-code-intel' import { Tracer as LightstepTracer } from '@sourcegraph/lightstep-tracer-webworker' import { createMessageConnection, @@ -118,7 +118,7 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise logger.warn('No typescript.serverUrl configured, falling back to basic code intelligence') // Fall back to basic-code-intel behavior - return activateBasicCodeIntel({ + const handler = new Handler({ sourcegraph, languageID: 'typescript', fileExts: ['ts', 'tsx', 'js', 'jsx'], @@ -146,7 +146,22 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise return filteredResults.length === 0 ? results : filteredResults }, - })(ctx) + }) + ctx.subscriptions.add( + sourcegraph.languages.registerHoverProvider(documentSelector, { + provideHover: handler.hover.bind(handler), + }) + ) + ctx.subscriptions.add( + sourcegraph.languages.registerDefinitionProvider(documentSelector, { + provideDefinition: handler.definition.bind(handler), + }) + ) + ctx.subscriptions.add( + sourcegraph.languages.registerReferenceProvider(documentSelector, { + provideReferences: handler.references.bind(handler), + }) + ) } const tracer: Tracer = config.value['lightstep.token'] diff --git a/package.json b/package.json index f9951da2f..89bd5deb9 100644 --- a/package.json +++ b/package.json @@ -212,7 +212,7 @@ "yarn-deduplicate": "^1.1.1" }, "dependencies": { - "@sourcegraph/basic-code-intel": "^6.0.18", + "@sourcegraph/basic-code-intel": "^7.0.3", "@sourcegraph/lightstep-tracer-webworker": "^0.20.14-fork.3", "@sourcegraph/typescript-language-server": "^0.3.7-fork", "@sourcegraph/vscode-ws-jsonrpc": "0.0.3-fork", diff --git a/yarn.lock b/yarn.lock index 3407455e3..0517d493b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -722,14 +722,15 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@sourcegraph/basic-code-intel@^6.0.18": - version "6.0.18" - resolved "https://registry.npmjs.org/@sourcegraph/basic-code-intel/-/basic-code-intel-6.0.18.tgz#ca8a658213bab7295b98619af5623c51d39b6ea8" - integrity sha512-PE9mWg/HNBesShKZrILVtxF2VQjtQ9nV9DHECvqqiJ70savcRphcpAmdpPICFvqh5GxYUIoRo3AkzdPGI0DUjw== +"@sourcegraph/basic-code-intel@^7.0.3": + version "7.0.3" + resolved "https://registry.npmjs.org/@sourcegraph/basic-code-intel/-/basic-code-intel-7.0.3.tgz#078c100d2a0a635cc6082091718dc689b8cc113b" + integrity sha512-BI5bTHUkNpIPIshBg/pxOuNVarO8Dt7TlF+8c1Zpz4uqdCzufxxtkY2OPVQ/KehlJepMJiuPFmrvHrUN19p51g== dependencies: lodash "^4.17.11" rxjs "^6.3.3" - sourcegraph "^23.0.0" + sourcegraph "^23.0.1" + vscode-languageserver-types "^3.14.0" "@sourcegraph/lightstep-tracer-webworker@^0.20.14-fork.3": version "0.20.14-fork.3" @@ -7181,7 +7182,7 @@ vscode-languageserver-protocol@^3.10.3, vscode-languageserver-protocol@^3.13.0: vscode-jsonrpc "^4.0.0" vscode-languageserver-types "3.14.0" -vscode-languageserver-types@3.14.0, vscode-languageserver-types@^3.13.0: +vscode-languageserver-types@3.14.0, vscode-languageserver-types@^3.13.0, vscode-languageserver-types@^3.14.0: version "3.14.0" resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== From 4b57e6cb67c9cf8b73b14185fe7af38e241a296c Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Wed, 7 Aug 2019 18:12:22 -0600 Subject: [PATCH 04/11] Add LSIF support --- extension/src/extension.ts | 107 +++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 34 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index c658cb726..0aee8411e 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -6,7 +6,7 @@ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'whatwg-url' Object.assign(_URL, self.URL) Object.assign(self, { URL: _URL, URLSearchParams: _URLSearchParams }) -import { Handler } from '@sourcegraph/basic-code-intel' +import { asyncFirst, Handler, initLSIF, wrapMaybe } from '@sourcegraph/basic-code-intel' import { Tracer as LightstepTracer } from '@sourcegraph/lightstep-tracer-webworker' import { createMessageConnection, @@ -91,7 +91,8 @@ import { const HOVER_DEF_POLL_INTERVAL = 2000 const EXTERNAL_REFS_CONCURRENCY = 7 -const getConfig = () => sourcegraph.configuration.get().value as LangTypescriptConfiguration +const getConfig = () => + sourcegraph.configuration.get().value as LangTypescriptConfiguration & { 'codeIntel.lsif': boolean } type NonDisposableMessageConnection = Omit @@ -103,6 +104,50 @@ const documentSelector: sourcegraph.DocumentSelector = [{ language: 'typescript' const logger: Logger = new RedactingLogger(console) +interface Providers { + hover: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise + definition: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise + references: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise +} + +function initBasicCodeIntel(): Providers { + const handler = new Handler({ + sourcegraph, + languageID: 'typescript', + fileExts: ['ts', 'tsx', 'js', 'jsx'], + commentStyle: { + lineRegex: /\/\/\s?/, + block: { + startRegex: /\/\*\*?/, + lineNoiseRegex: /(^\s*\*\s?)?/, + endRegex: /\*\//, + }, + }, + filterDefinitions: ({ filePath, fileContent, results }) => { + const imports = fileContent + .split('\n') + .map(line => { + // Matches the import at index 1 + const match = /\bfrom ['"](.*)['"];?$/.exec(line) || /\brequire\(['"](.*)['"]\)/.exec(line) + return match ? match[1] : undefined + }) + .filter((x): x is string => Boolean(x)) + + const filteredResults = results.filter(result => + imports.some(i => path.join(path.dirname(filePath), i) === result.file.replace(/\.[^/.]+$/, '')) + ) + + return filteredResults.length === 0 ? results : filteredResults + }, + }) + + return { + hover: handler.hover.bind(handler), + definition: handler.definition.bind(handler), + references: handler.references.bind(handler), + } +} + export async function activate(ctx: sourcegraph.ExtensionContext): Promise { logger.log('TypeScript extension activated') @@ -114,52 +159,46 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise const config = new BehaviorSubject(getConfig()) ctx.subscriptions.add(sourcegraph.configuration.subscribe(() => config.next(getConfig()))) + if (config.value['codeIntel.lsif']) { + const lsif = initLSIF() + const basicCodeIntel = initBasicCodeIntel() + + ctx.subscriptions.add( + sourcegraph.languages.registerHoverProvider(documentSelector, { + provideHover: asyncFirst([lsif.hover, wrapMaybe(basicCodeIntel.hover)], null), + }) + ) + ctx.subscriptions.add( + sourcegraph.languages.registerDefinitionProvider(documentSelector, { + provideDefinition: asyncFirst([lsif.definition, wrapMaybe(basicCodeIntel.definition)], null), + }) + ) + ctx.subscriptions.add( + sourcegraph.languages.registerReferenceProvider(documentSelector, { + provideReferences: asyncFirst([lsif.references, wrapMaybe(basicCodeIntel.references)], null), + }) + ) + return + } + if (!config.value['typescript.serverUrl']) { logger.warn('No typescript.serverUrl configured, falling back to basic code intelligence') // Fall back to basic-code-intel behavior + const basicCodeIntel = initBasicCodeIntel() - const handler = new Handler({ - sourcegraph, - languageID: 'typescript', - fileExts: ['ts', 'tsx', 'js', 'jsx'], - commentStyle: { - lineRegex: /\/\/\s?/, - block: { - startRegex: /\/\*\*?/, - lineNoiseRegex: /(^\s*\*\s?)?/, - endRegex: /\*\//, - }, - }, - filterDefinitions: ({ filePath, fileContent, results }) => { - const imports = fileContent - .split('\n') - .map(line => { - // Matches the import at index 1 - const match = /\bfrom ['"](.*)['"];?$/.exec(line) || /\brequire\(['"](.*)['"]\)/.exec(line) - return match ? match[1] : undefined - }) - .filter((x): x is string => Boolean(x)) - - const filteredResults = results.filter(result => - imports.some(i => path.join(path.dirname(filePath), i) === result.file.replace(/\.[^/.]+$/, '')) - ) - - return filteredResults.length === 0 ? results : filteredResults - }, - }) ctx.subscriptions.add( sourcegraph.languages.registerHoverProvider(documentSelector, { - provideHover: handler.hover.bind(handler), + provideHover: basicCodeIntel.hover.bind(basicCodeIntel), }) ) ctx.subscriptions.add( sourcegraph.languages.registerDefinitionProvider(documentSelector, { - provideDefinition: handler.definition.bind(handler), + provideDefinition: basicCodeIntel.definition.bind(basicCodeIntel), }) ) ctx.subscriptions.add( sourcegraph.languages.registerReferenceProvider(documentSelector, { - provideReferences: handler.references.bind(handler), + provideReferences: basicCodeIntel.references.bind(basicCodeIntel), }) ) } From 1e998aaa60dea0bfc558e3caa17aafd66215b2cf Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Thu, 8 Aug 2019 14:26:38 -0600 Subject: [PATCH 05/11] Use Felix's suggestion --- extension/src/extension.ts | 582 +++++++++++++++++++------------------ 1 file changed, 293 insertions(+), 289 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 0aee8411e..11d0c8a71 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -87,6 +87,7 @@ import { SourcegraphEndpoint, throwIfAbortError, } from './util' +import { mkIsLSIFAvailable } from '@sourcegraph/basic-code-intel/lib/lsif' const HOVER_DEF_POLL_INTERVAL = 2000 const EXTERNAL_REFS_CONCURRENCY = 7 @@ -159,49 +160,9 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise const config = new BehaviorSubject(getConfig()) ctx.subscriptions.add(sourcegraph.configuration.subscribe(() => config.next(getConfig()))) - if (config.value['codeIntel.lsif']) { - const lsif = initLSIF() - const basicCodeIntel = initBasicCodeIntel() - - ctx.subscriptions.add( - sourcegraph.languages.registerHoverProvider(documentSelector, { - provideHover: asyncFirst([lsif.hover, wrapMaybe(basicCodeIntel.hover)], null), - }) - ) - ctx.subscriptions.add( - sourcegraph.languages.registerDefinitionProvider(documentSelector, { - provideDefinition: asyncFirst([lsif.definition, wrapMaybe(basicCodeIntel.definition)], null), - }) - ) - ctx.subscriptions.add( - sourcegraph.languages.registerReferenceProvider(documentSelector, { - provideReferences: asyncFirst([lsif.references, wrapMaybe(basicCodeIntel.references)], null), - }) - ) - return - } - - if (!config.value['typescript.serverUrl']) { - logger.warn('No typescript.serverUrl configured, falling back to basic code intelligence') - // Fall back to basic-code-intel behavior - const basicCodeIntel = initBasicCodeIntel() - - ctx.subscriptions.add( - sourcegraph.languages.registerHoverProvider(documentSelector, { - provideHover: basicCodeIntel.hover.bind(basicCodeIntel), - }) - ) - ctx.subscriptions.add( - sourcegraph.languages.registerDefinitionProvider(documentSelector, { - provideDefinition: basicCodeIntel.definition.bind(basicCodeIntel), - }) - ) - ctx.subscriptions.add( - sourcegraph.languages.registerReferenceProvider(documentSelector, { - provideReferences: basicCodeIntel.references.bind(basicCodeIntel), - }) - ) - } + const isLSIFAvailable = mkIsLSIFAvailable() + const lsif = initLSIF() + const basicCodeIntel = initBasicCodeIntel() const tracer: Tracer = config.value['lightstep.token'] ? new LightstepTracer({ access_token: config.value['lightstep.token'], component_name: 'ext-lang-typescript' }) @@ -547,18 +508,24 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise return } - const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) - const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) - const connection = await getOrCreateConnection(serverRootUri, { token, span }) - const didOpenParams: DidOpenTextDocumentParams = { - textDocument: { - uri: serverTextDocumentUri.href, - languageId: textDocument.languageId, - text: textDocument.text || '', - version: 1, - }, + // This dummy arg will not be necessary once + // https://github.com/sourcegraph/sourcegraph-basic-code-intel/pull/132 + // is merged. + const dummyPosition = new sourcegraph.Position(0, 0) + if (!(await isLSIFAvailable(textDocument, dummyPosition)) && config.value['typescript.serverUrl']) { + const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) + const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) + const connection = await getOrCreateConnection(serverRootUri, { token, span }) + const didOpenParams: DidOpenTextDocumentParams = { + textDocument: { + uri: serverTextDocumentUri.href, + languageId: textDocument.languageId, + text: textDocument.text || '', + version: 1, + }, + } + connection.sendNotification(DidOpenTextDocumentNotification.type, didOpenParams) } - connection.sendNotification(DidOpenTextDocumentNotification.type, didOpenParams) }) } catch (err) { logger.error('Error handling didOpenTextDocument event', err) @@ -589,25 +556,33 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise if (canGenerateTraceUrl(span)) { logger.log('Hover trace', span.generateTraceURL()) } - const textDocumentUri = new URL(textDocument.uri) - const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) - const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) - - const connection = await getOrCreateConnection(serverRootUri, { span, token }) - // Poll server to get updated results when e.g. dependency installation finished - while (true) { - const hoverResult = await sendTracedRequest( - connection, - HoverRequest.type, - { - textDocument: { uri: serverTextDocumentUri.href }, - position, - }, - { span, tracer, token } - ) - rewriteUris(hoverResult, toSourcegraphTextDocumentUri) - yield convertHover(hoverResult) - await delayPromise(HOVER_DEF_POLL_INTERVAL) + + if (await isLSIFAvailable(textDocument, position)) { + const lsifResult = await lsif.hover(textDocument, position) + yield lsifResult && lsifResult.value + } else if (!config.value['typescript.serverUrl']) { + yield await basicCodeIntel.hover(textDocument, position) + } else { + const textDocumentUri = new URL(textDocument.uri) + const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) + const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) + + const connection = await getOrCreateConnection(serverRootUri, { span, token }) + // Poll server to get updated results when e.g. dependency installation finished + while (true) { + const hoverResult = await sendTracedRequest( + connection, + HoverRequest.type, + { + textDocument: { uri: serverTextDocumentUri.href }, + position, + }, + { span, tracer, token } + ) + rewriteUris(hoverResult, toSourcegraphTextDocumentUri) + yield convertHover(hoverResult) + await delayPromise(HOVER_DEF_POLL_INTERVAL) + } } }) ) @@ -626,24 +601,32 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise if (canGenerateTraceUrl(span)) { logger.log('Definition trace', span.generateTraceURL()) } - const textDocumentUri = new URL(textDocument.uri) - const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) - const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) - const connection = await getOrCreateConnection(serverRootUri, { span, token }) - // Poll server to get updated contents when e.g. dependency installation finished - while (true) { - const definitionResult = (await sendTracedRequest( - connection, - DefinitionRequest.type, - { - textDocument: { uri: serverTextDocumentUri.href }, - position, - }, - { span, tracer, token } - )) as Location[] | Location | null - rewriteUris(definitionResult, toSourcegraphTextDocumentUri) - yield convertLocations(definitionResult) - await delayPromise(HOVER_DEF_POLL_INTERVAL) + + if (await isLSIFAvailable(textDocument, position)) { + const lsifResult = await lsif.definition(textDocument, position) + yield lsifResult ? lsifResult.value : null + } else if (!config.value['typescript.serverUrl']) { + yield await basicCodeIntel.definition(textDocument, position) + } else { + const textDocumentUri = new URL(textDocument.uri) + const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) + const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) + const connection = await getOrCreateConnection(serverRootUri, { span, token }) + // Poll server to get updated contents when e.g. dependency installation finished + while (true) { + const definitionResult = (await sendTracedRequest( + connection, + DefinitionRequest.type, + { + textDocument: { uri: serverTextDocumentUri.href }, + position, + }, + { span, tracer, token } + )) as Location[] | Location | null + rewriteUris(definitionResult, toSourcegraphTextDocumentUri) + yield convertLocations(definitionResult) + await delayPromise(HOVER_DEF_POLL_INTERVAL) + } } }) ) @@ -665,180 +648,194 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise if (canGenerateTraceUrl(span)) { logger.log('References trace', span.generateTraceURL()) } - const textDocumentUri = new URL(textDocument.uri) - const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) - const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) - const connection = await getOrCreateConnection(serverRootUri, { span, token }) + if (await isLSIFAvailable(textDocument, position)) { + const lsifResult = await lsif.references(textDocument, position) + yield (lsifResult && lsifResult.value) || [] + } else if (!config.value['typescript.serverUrl']) { + yield (await basicCodeIntel.references(textDocument, position)) || [] + } else { + const textDocumentUri = new URL(textDocument.uri) + const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) + const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) - const findLocalReferences = () => - traceAsyncGenerator('Find local references', tracer, span, async function*(span) { - logger.log('Searching for same-repo references') - const localReferences = asArray( - await sendTracedRequest( - connection, - ReferencesRequest.type, - { - textDocument: { uri: serverTextDocumentUri.href }, - position, - context, - }, - { span, tracer, token } - ) - ) - logger.log(`Found ${localReferences.length} same-repo references`) - yield localReferences - }) + const connection = await getOrCreateConnection(serverRootUri, { span, token }) - const findExternalReferences = () => - traceAsyncGenerator('Find external references', tracer, span, async function*(span) { - try { - logger.log('Getting canonical definition for cross-repo references') - const definition: Location | undefined = asArray((await sendTracedRequest( - connection, - DefinitionRequest.type, - { - textDocument: { uri: serverTextDocumentUri.href }, - position, - }, - { span, tracer, token } - )) as Location[] | Location | null)[0] - if (!definition) { - return - } - span.setTag('uri', redact(definition.uri)) - span.setTag('line', definition.range.start.line) + const findLocalReferences = () => + traceAsyncGenerator('Find local references', tracer, span, async function*(span) { + logger.log('Searching for same-repo references') + const localReferences = asArray( + await sendTracedRequest( + connection, + ReferencesRequest.type, + { + textDocument: { uri: serverTextDocumentUri.href }, + position, + context, + }, + { span, tracer, token } + ) + ) + logger.log(`Found ${localReferences.length} same-repo references`) + yield localReferences + }) + + const findExternalReferences = () => + traceAsyncGenerator('Find external references', tracer, span, async function*(span) { + try { + logger.log('Getting canonical definition for cross-repo references') + const definition: Location | undefined = asArray((await sendTracedRequest( + connection, + DefinitionRequest.type, + { + textDocument: { uri: serverTextDocumentUri.href }, + position, + }, + { span, tracer, token } + )) as Location[] | Location | null)[0] + if (!definition) { + return + } + span.setTag('uri', redact(definition.uri)) + span.setTag('line', definition.range.start.line) - const findPackageDependents = - clientSgEndpoint.url.hostname === 'sourcegraph.com' - ? findPackageDependentsWithNpm - : findPackageDependentsWithSourcegraphSearch + const findPackageDependents = + clientSgEndpoint.url.hostname === 'sourcegraph.com' + ? findPackageDependentsWithNpm + : findPackageDependentsWithSourcegraphSearch - logger.log(`Getting external references for definition`, definition) + logger.log(`Getting external references for definition`, definition) - const definitionUri = new URL(definition.uri) + const definitionUri = new URL(definition.uri) - const referenceParams: ReferenceParams = { - textDocument: { uri: definitionUri.href }, - position: definition.range.start, - context: { includeDeclaration: false }, - } + const referenceParams: ReferenceParams = { + textDocument: { uri: definitionUri.href }, + position: definition.range.start, + context: { includeDeclaration: false }, + } - // The definition returned by the server points to the server endpoint, rewrite to the client endpoint - const clientDefinitionUrl = new URL(definitionUri.href) - clientDefinitionUrl.protocol = clientSgEndpoint.url.protocol - clientDefinitionUrl.host = clientSgEndpoint.url.host - const packageName = await findPackageName(clientDefinitionUrl, { logger, tracer, span }) - - // Find dependent packages on the package - const dependents = - packageName === 'sourcegraph' - ? // If the package name is "sourcegraph", we are looking for references to a symbol in the Sourcegraph extension API - // Extensions are not published to npm, so search the extension registry - findDependentsWithSourcegraphExtensionRegistry(clientSgEndpoint, { - logger, - tracer, - span, - }) - : findPackageDependents(packageName, clientSgEndpoint, { logger, tracer, span }) - - // Search for references in each dependent - const findExternalRefsInDependent = (repoName: string) => - traceAsyncGenerator( - 'Find external references in dependent', - tracer, - span, - async function*(span) { - try { - logger.log(`Looking for external references in dependent repo ${repoName}`) - span.setTag('repoName', repoName) - const commitID = await resolveRev(repoName, 'HEAD', clientSgEndpoint, { - span, - tracer, - }) - const rootUri = new URL( - `${repoName}@${commitID}/-/raw/`, - serverSgEndpoint.url - ) - if (serverSgEndpoint.accessToken) { - rootUri.username = serverSgEndpoint.accessToken - } + // The definition returned by the server points to the server endpoint, rewrite to the client endpoint + const clientDefinitionUrl = new URL(definitionUri.href) + clientDefinitionUrl.protocol = clientSgEndpoint.url.protocol + clientDefinitionUrl.host = clientSgEndpoint.url.host + const packageName = await findPackageName(clientDefinitionUrl, { logger, tracer, span }) + + // Find dependent packages on the package + const dependents = + packageName === 'sourcegraph' + ? // If the package name is "sourcegraph", we are looking for references to a symbol in the Sourcegraph extension API + // Extensions are not published to npm, so search the extension registry + findDependentsWithSourcegraphExtensionRegistry(clientSgEndpoint, { + logger, + tracer, + span, + }) + : findPackageDependents(packageName, clientSgEndpoint, { logger, tracer, span }) + + // Search for references in each dependent + const findExternalRefsInDependent = (repoName: string) => + traceAsyncGenerator( + 'Find external references in dependent', + tracer, + span, + async function*(span) { + try { + logger.log( + `Looking for external references in dependent repo ${repoName}` + ) + span.setTag('repoName', repoName) + const commitID = await resolveRev(repoName, 'HEAD', clientSgEndpoint, { + span, + tracer, + }) + const rootUri = new URL( + `${repoName}@${commitID}/-/raw/`, + serverSgEndpoint.url + ) + if (serverSgEndpoint.accessToken) { + rootUri.username = serverSgEndpoint.accessToken + } - yield await withTempConnection( - rootUri, - { span, token }, - async connection => { - const references = asArray( - await sendTracedRequest( - connection, - ReferencesRequest.type, - referenceParams, - { - span, - tracer, - token, - } + yield await withTempConnection( + rootUri, + { span, token }, + async connection => { + const references = asArray( + await sendTracedRequest( + connection, + ReferencesRequest.type, + referenceParams, + { + span, + tracer, + token, + } + ) ) - ) - logger.log( - `Found ${ - references.length - } references in dependent repo ${repoName}` - ) - // Only include references in the external repo, do not duplicate references in the same repo - return references.filter(location => - location.uri.startsWith(rootUri.href) - ) - } - ) - } catch (err) { - throwIfAbortError(err) - logErrorEvent(span, err) - logger.error( - `Error searching dependent repo ${repoName} for references`, - err - ) + logger.log( + `Found ${ + references.length + } references in dependent repo ${repoName}` + ) + // Only include references in the external repo, do not duplicate references in the same repo + return references.filter(location => + location.uri.startsWith(rootUri.href) + ) + } + ) + } catch (err) { + throwIfAbortError(err) + logErrorEvent(span, err) + logger.error( + `Error searching dependent repo ${repoName} for references`, + err + ) + } } - } + ) + yield* flatMapConcurrent( + dependents, + EXTERNAL_REFS_CONCURRENCY, + findExternalRefsInDependent ) - yield* flatMapConcurrent(dependents, EXTERNAL_REFS_CONCURRENCY, findExternalRefsInDependent) - logger.log('Done going through dependents') - } catch (err) { - logger.error('Could not find external references', err) - } - }) - - yield* merge(findLocalReferences(), findExternalReferences()).pipe( - // Same-repo references - // Cross-repo references - // Find canonical source location - filter(chunk => chunk.length > 0), - tap({ - next: chunk => { - span.log({ event: 'chunk', count: chunk.length }) - }, - }), - // Rewrite URIs and convert from LSP to Sourcegraph Location - map(chunk => - chunk - .map(location => { - try { - return convertLocation({ - ...location, - uri: toSourcegraphTextDocumentUri(new URL(location.uri)).href, - }) - } catch (err) { - return undefined - } - }) - .filter((location): location is Exclude => !!location) - ), - // Aggregate individual chunks into a growing array (which is what Sourcegraph expects) - scan( - (allReferences, chunk) => allReferences.concat(chunk), - [] + logger.log('Done going through dependents') + } catch (err) { + logger.error('Could not find external references', err) + } + }) + + yield* merge(findLocalReferences(), findExternalReferences()).pipe( + // Same-repo references + // Cross-repo references + // Find canonical source location + filter(chunk => chunk.length > 0), + tap({ + next: chunk => { + span.log({ event: 'chunk', count: chunk.length }) + }, + }), + // Rewrite URIs and convert from LSP to Sourcegraph Location + map(chunk => + chunk + .map(location => { + try { + return convertLocation({ + ...location, + uri: toSourcegraphTextDocumentUri(new URL(location.uri)).href, + }) + } catch (err) { + return undefined + } + }) + .filter((location): location is Exclude => !!location) + ), + // Aggregate individual chunks into a growing array (which is what Sourcegraph expects) + scan( + (allReferences, chunk) => allReferences.concat(chunk), + [] + ) ) - ) + } }) providers.add( sourcegraph.languages.registerReferenceProvider(documentSelector, { @@ -846,43 +843,50 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise }) ) - // Implementations - const IMPL_ID = 'ts.impl' // implementations panel and provider ID - const provideImpls = ( - textDocument: sourcegraph.TextDocument, - position: sourcegraph.Position - ): Promise => - tracePromise('Provide implementations', tracer, undefined, async span => { - if (canGenerateTraceUrl(span)) { - logger.log('Implementation trace', span.generateTraceURL()) - } - const textDocumentUri = new URL(textDocument.uri) - const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) - const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) - const connection = await getOrCreateConnection(serverRootUri, { span, token }) - const implementationParams: TextDocumentPositionParams = { - textDocument: { uri: serverTextDocumentUri.href }, - position, - } - const implementationResult = (await sendTracedRequest( - connection, - ImplementationRequest.type, - implementationParams, - { span, tracer, token } - )) as Location[] | Location | null - rewriteUris(implementationResult, toSourcegraphTextDocumentUri) - return convertLocations(implementationResult) - }) - providers.add( - sourcegraph.languages.registerLocationProvider(IMPL_ID, documentSelector, { - provideLocations: provideImpls, - }) - ) - const panelView = sourcegraph.app.createPanelView(IMPL_ID) - panelView.title = 'Implementations' - panelView.component = { locationProvider: IMPL_ID } - panelView.priority = 160 - providers.add(panelView) + if (config.value['typescript.serverUrl']) { + // Implementations + const IMPL_ID = 'ts.impl' // implementations panel and provider ID + const provideImpls = ( + textDocument: sourcegraph.TextDocument, + position: sourcegraph.Position + ): Promise => + tracePromise('Provide implementations', tracer, undefined, async span => { + if (canGenerateTraceUrl(span)) { + logger.log('Implementation trace', span.generateTraceURL()) + } + + if (await isLSIFAvailable(textDocument, position)) { + return null + } + + const textDocumentUri = new URL(textDocument.uri) + const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) + const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) + const connection = await getOrCreateConnection(serverRootUri, { span, token }) + const implementationParams: TextDocumentPositionParams = { + textDocument: { uri: serverTextDocumentUri.href }, + position, + } + const implementationResult = (await sendTracedRequest( + connection, + ImplementationRequest.type, + implementationParams, + { span, tracer, token } + )) as Location[] | Location | null + rewriteUris(implementationResult, toSourcegraphTextDocumentUri) + return convertLocations(implementationResult) + }) + providers.add( + sourcegraph.languages.registerLocationProvider(IMPL_ID, documentSelector, { + provideLocations: provideImpls, + }) + ) + const panelView = sourcegraph.app.createPanelView(IMPL_ID) + panelView.title = 'Implementations' + panelView.component = { locationProvider: IMPL_ID } + panelView.priority = 160 + providers.add(panelView) + } } } From 203f971bc1932908dba95ba3d19e780804f1ca70 Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Thu, 8 Aug 2019 14:29:05 -0600 Subject: [PATCH 06/11] reorganize --- extension/src/extension.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 11d0c8a71..33bc2127b 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -92,19 +92,6 @@ import { mkIsLSIFAvailable } from '@sourcegraph/basic-code-intel/lib/lsif' const HOVER_DEF_POLL_INTERVAL = 2000 const EXTERNAL_REFS_CONCURRENCY = 7 -const getConfig = () => - sourcegraph.configuration.get().value as LangTypescriptConfiguration & { 'codeIntel.lsif': boolean } - -type NonDisposableMessageConnection = Omit - -const connectionsByRootUri = new Map>() - -const isTypeScriptFile = (textDocumentUri: URL): boolean => /\.m?(?:t|j)sx?$/.test(textDocumentUri.hash) - -const documentSelector: sourcegraph.DocumentSelector = [{ language: 'typescript' }, { language: 'javascript' }] - -const logger: Logger = new RedactingLogger(console) - interface Providers { hover: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise definition: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise @@ -149,6 +136,19 @@ function initBasicCodeIntel(): Providers { } } +const getConfig = () => + sourcegraph.configuration.get().value as LangTypescriptConfiguration & { 'codeIntel.lsif': boolean } + +type NonDisposableMessageConnection = Omit + +const connectionsByRootUri = new Map>() + +const isTypeScriptFile = (textDocumentUri: URL): boolean => /\.m?(?:t|j)sx?$/.test(textDocumentUri.hash) + +const documentSelector: sourcegraph.DocumentSelector = [{ language: 'typescript' }, { language: 'javascript' }] + +const logger: Logger = new RedactingLogger(console) + export async function activate(ctx: sourcegraph.ExtensionContext): Promise { logger.log('TypeScript extension activated') From 1669c055b5bbffc241daa03f9cc50e29dbb673ee Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Thu, 8 Aug 2019 14:33:27 -0600 Subject: [PATCH 07/11] reorganize --- extension/src/extension.ts | 50 +++----------------------------------- 1 file changed, 3 insertions(+), 47 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 33bc2127b..8400daf6d 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -6,7 +6,8 @@ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'whatwg-url' Object.assign(_URL, self.URL) Object.assign(self, { URL: _URL, URLSearchParams: _URLSearchParams }) -import { asyncFirst, Handler, initLSIF, wrapMaybe } from '@sourcegraph/basic-code-intel' +import { initLSIF } from '@sourcegraph/basic-code-intel' +import { mkIsLSIFAvailable } from '@sourcegraph/basic-code-intel/lib/lsif' import { Tracer as LightstepTracer } from '@sourcegraph/lightstep-tracer-webworker' import { createMessageConnection, @@ -20,7 +21,6 @@ import { merge } from 'ix/asynciterable/index' import { filter, map, scan, tap } from 'ix/asynciterable/pipe/index' import { fromPairs, isEqual, uniqWith } from 'lodash' import { Span, Tracer } from 'opentracing' -import * as path from 'path' import { BehaviorSubject, from, fromEventPattern, Subscription } from 'rxjs' import * as rxop from 'rxjs/operators' import * as sourcegraph from 'sourcegraph' @@ -48,6 +48,7 @@ import { TextDocumentPositionParams, } from 'vscode-languageserver-protocol' import { getOrCreateAccessToken } from './auth' +import { initBasicCodeIntel } from './basic-code-intel'; import { LangTypescriptConfiguration } from './config' import { findPackageDependentsWithNpm, @@ -87,55 +88,10 @@ import { SourcegraphEndpoint, throwIfAbortError, } from './util' -import { mkIsLSIFAvailable } from '@sourcegraph/basic-code-intel/lib/lsif' const HOVER_DEF_POLL_INTERVAL = 2000 const EXTERNAL_REFS_CONCURRENCY = 7 -interface Providers { - hover: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise - definition: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise - references: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise -} - -function initBasicCodeIntel(): Providers { - const handler = new Handler({ - sourcegraph, - languageID: 'typescript', - fileExts: ['ts', 'tsx', 'js', 'jsx'], - commentStyle: { - lineRegex: /\/\/\s?/, - block: { - startRegex: /\/\*\*?/, - lineNoiseRegex: /(^\s*\*\s?)?/, - endRegex: /\*\//, - }, - }, - filterDefinitions: ({ filePath, fileContent, results }) => { - const imports = fileContent - .split('\n') - .map(line => { - // Matches the import at index 1 - const match = /\bfrom ['"](.*)['"];?$/.exec(line) || /\brequire\(['"](.*)['"]\)/.exec(line) - return match ? match[1] : undefined - }) - .filter((x): x is string => Boolean(x)) - - const filteredResults = results.filter(result => - imports.some(i => path.join(path.dirname(filePath), i) === result.file.replace(/\.[^/.]+$/, '')) - ) - - return filteredResults.length === 0 ? results : filteredResults - }, - }) - - return { - hover: handler.hover.bind(handler), - definition: handler.definition.bind(handler), - references: handler.references.bind(handler), - } -} - const getConfig = () => sourcegraph.configuration.get().value as LangTypescriptConfiguration & { 'codeIntel.lsif': boolean } From b141c308f5a678473036a25be249e1c5bdafd201 Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Thu, 8 Aug 2019 16:12:16 -0600 Subject: [PATCH 08/11] Bump basic-code-intel 7.0.4 --- extension/src/extension.ts | 14 +++++--------- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 8400daf6d..39a65a5d1 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -464,11 +464,7 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise return } - // This dummy arg will not be necessary once - // https://github.com/sourcegraph/sourcegraph-basic-code-intel/pull/132 - // is merged. - const dummyPosition = new sourcegraph.Position(0, 0) - if (!(await isLSIFAvailable(textDocument, dummyPosition)) && config.value['typescript.serverUrl']) { + if (!(await isLSIFAvailable(textDocument)) && config.value['typescript.serverUrl']) { const serverRootUri = resolveServerRootUri(textDocumentUri, serverSgEndpoint) const serverTextDocumentUri = toServerTextDocumentUri(textDocumentUri, serverSgEndpoint) const connection = await getOrCreateConnection(serverRootUri, { token, span }) @@ -513,7 +509,7 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise logger.log('Hover trace', span.generateTraceURL()) } - if (await isLSIFAvailable(textDocument, position)) { + if (await isLSIFAvailable(textDocument)) { const lsifResult = await lsif.hover(textDocument, position) yield lsifResult && lsifResult.value } else if (!config.value['typescript.serverUrl']) { @@ -558,7 +554,7 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise logger.log('Definition trace', span.generateTraceURL()) } - if (await isLSIFAvailable(textDocument, position)) { + if (await isLSIFAvailable(textDocument)) { const lsifResult = await lsif.definition(textDocument, position) yield lsifResult ? lsifResult.value : null } else if (!config.value['typescript.serverUrl']) { @@ -605,7 +601,7 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise logger.log('References trace', span.generateTraceURL()) } - if (await isLSIFAvailable(textDocument, position)) { + if (await isLSIFAvailable(textDocument)) { const lsifResult = await lsif.references(textDocument, position) yield (lsifResult && lsifResult.value) || [] } else if (!config.value['typescript.serverUrl']) { @@ -811,7 +807,7 @@ export async function activate(ctx: sourcegraph.ExtensionContext): Promise logger.log('Implementation trace', span.generateTraceURL()) } - if (await isLSIFAvailable(textDocument, position)) { + if (await isLSIFAvailable(textDocument)) { return null } diff --git a/package.json b/package.json index 89bd5deb9..f13cf2e28 100644 --- a/package.json +++ b/package.json @@ -212,7 +212,7 @@ "yarn-deduplicate": "^1.1.1" }, "dependencies": { - "@sourcegraph/basic-code-intel": "^7.0.3", + "@sourcegraph/basic-code-intel": "^7.0.4", "@sourcegraph/lightstep-tracer-webworker": "^0.20.14-fork.3", "@sourcegraph/typescript-language-server": "^0.3.7-fork", "@sourcegraph/vscode-ws-jsonrpc": "0.0.3-fork", diff --git a/yarn.lock b/yarn.lock index 0517d493b..7d0947464 100644 --- a/yarn.lock +++ b/yarn.lock @@ -722,10 +722,10 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@sourcegraph/basic-code-intel@^7.0.3": - version "7.0.3" - resolved "https://registry.npmjs.org/@sourcegraph/basic-code-intel/-/basic-code-intel-7.0.3.tgz#078c100d2a0a635cc6082091718dc689b8cc113b" - integrity sha512-BI5bTHUkNpIPIshBg/pxOuNVarO8Dt7TlF+8c1Zpz4uqdCzufxxtkY2OPVQ/KehlJepMJiuPFmrvHrUN19p51g== +"@sourcegraph/basic-code-intel@^7.0.4": + version "7.0.4" + resolved "https://registry.npmjs.org/@sourcegraph/basic-code-intel/-/basic-code-intel-7.0.4.tgz#1807edea0014404ea4d2d60bdd943505e167f1a4" + integrity sha512-+SpmHSg3eZAli91tpIGlLmdujYaYH0bvXzx71T+bQ+fFkuJibASm/725IwLUa5jG/AyuaT7K1zar51Fbdp976Q== dependencies: lodash "^4.17.11" rxjs "^6.3.3" From 08324dc2a8e8cdfd795c351afc78dcc4502f8624 Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Thu, 8 Aug 2019 16:25:08 -0600 Subject: [PATCH 09/11] prettier --- extension/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 39a65a5d1..54aa1bbd3 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -48,7 +48,7 @@ import { TextDocumentPositionParams, } from 'vscode-languageserver-protocol' import { getOrCreateAccessToken } from './auth' -import { initBasicCodeIntel } from './basic-code-intel'; +import { initBasicCodeIntel } from './basic-code-intel' import { LangTypescriptConfiguration } from './config' import { findPackageDependentsWithNpm, From c4476185d60538f89cea68348a5a7bbd9da5859c Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Thu, 8 Aug 2019 17:17:30 -0600 Subject: [PATCH 10/11] Forgot to add a file --- extension/src/basic-code-intel.ts | 47 +++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 extension/src/basic-code-intel.ts diff --git a/extension/src/basic-code-intel.ts b/extension/src/basic-code-intel.ts new file mode 100644 index 000000000..3cef0eb73 --- /dev/null +++ b/extension/src/basic-code-intel.ts @@ -0,0 +1,47 @@ +import { Handler } from '@sourcegraph/basic-code-intel' +import * as path from 'path' +import * as sourcegraph from 'sourcegraph' + +export interface Providers { + hover: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise + definition: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise + references: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise +} + +export function initBasicCodeIntel(): Providers { + const handler = new Handler({ + sourcegraph, + languageID: 'typescript', + fileExts: ['ts', 'tsx', 'js', 'jsx'], + commentStyle: { + lineRegex: /\/\/\s?/, + block: { + startRegex: /\/\*\*?/, + lineNoiseRegex: /(^\s*\*\s?)?/, + endRegex: /\*\//, + }, + }, + filterDefinitions: ({ filePath, fileContent, results }) => { + const imports = fileContent + .split('\n') + .map(line => { + // Matches the import at index 1 + const match = /\bfrom ['"](.*)['"];?$/.exec(line) || /\brequire\(['"](.*)['"]\)/.exec(line) + return match ? match[1] : undefined + }) + .filter((x): x is string => Boolean(x)) + + const filteredResults = results.filter(result => + imports.some(i => path.join(path.dirname(filePath), i) === result.file.replace(/\.[^/.]+$/, '')) + ) + + return filteredResults.length === 0 ? results : filteredResults + }, + }) + + return { + hover: handler.hover.bind(handler), + definition: handler.definition.bind(handler), + references: handler.references.bind(handler), + } +} From 22bf37d398fac641f4c456ac52a8a59af4794758 Mon Sep 17 00:00:00 2001 From: Chris Wendt Date: Fri, 9 Aug 2019 11:41:24 -0600 Subject: [PATCH 11/11] Bump basic-code-intel 7.0.5 --- extension/src/basic-code-intel.ts | 16 ++-------------- extension/src/extension.ts | 3 +-- package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/extension/src/basic-code-intel.ts b/extension/src/basic-code-intel.ts index 3cef0eb73..51952e69b 100644 --- a/extension/src/basic-code-intel.ts +++ b/extension/src/basic-code-intel.ts @@ -1,15 +1,9 @@ -import { Handler } from '@sourcegraph/basic-code-intel' +import { Handler, Providers } from '@sourcegraph/basic-code-intel' import * as path from 'path' import * as sourcegraph from 'sourcegraph' -export interface Providers { - hover: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise - definition: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise - references: (doc: sourcegraph.TextDocument, pos: sourcegraph.Position) => Promise -} - export function initBasicCodeIntel(): Providers { - const handler = new Handler({ + return new Handler({ sourcegraph, languageID: 'typescript', fileExts: ['ts', 'tsx', 'js', 'jsx'], @@ -38,10 +32,4 @@ export function initBasicCodeIntel(): Providers { return filteredResults.length === 0 ? results : filteredResults }, }) - - return { - hover: handler.hover.bind(handler), - definition: handler.definition.bind(handler), - references: handler.references.bind(handler), - } } diff --git a/extension/src/extension.ts b/extension/src/extension.ts index 54aa1bbd3..16bd2d644 100644 --- a/extension/src/extension.ts +++ b/extension/src/extension.ts @@ -6,8 +6,7 @@ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'whatwg-url' Object.assign(_URL, self.URL) Object.assign(self, { URL: _URL, URLSearchParams: _URLSearchParams }) -import { initLSIF } from '@sourcegraph/basic-code-intel' -import { mkIsLSIFAvailable } from '@sourcegraph/basic-code-intel/lib/lsif' +import { initLSIF, mkIsLSIFAvailable } from '@sourcegraph/basic-code-intel' import { Tracer as LightstepTracer } from '@sourcegraph/lightstep-tracer-webworker' import { createMessageConnection, diff --git a/package.json b/package.json index f13cf2e28..35f249901 100644 --- a/package.json +++ b/package.json @@ -212,7 +212,7 @@ "yarn-deduplicate": "^1.1.1" }, "dependencies": { - "@sourcegraph/basic-code-intel": "^7.0.4", + "@sourcegraph/basic-code-intel": "^7.0.5", "@sourcegraph/lightstep-tracer-webworker": "^0.20.14-fork.3", "@sourcegraph/typescript-language-server": "^0.3.7-fork", "@sourcegraph/vscode-ws-jsonrpc": "0.0.3-fork", diff --git a/yarn.lock b/yarn.lock index 7d0947464..f7466ac05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -722,10 +722,10 @@ resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== -"@sourcegraph/basic-code-intel@^7.0.4": - version "7.0.4" - resolved "https://registry.npmjs.org/@sourcegraph/basic-code-intel/-/basic-code-intel-7.0.4.tgz#1807edea0014404ea4d2d60bdd943505e167f1a4" - integrity sha512-+SpmHSg3eZAli91tpIGlLmdujYaYH0bvXzx71T+bQ+fFkuJibASm/725IwLUa5jG/AyuaT7K1zar51Fbdp976Q== +"@sourcegraph/basic-code-intel@^7.0.5": + version "7.0.5" + resolved "https://registry.npmjs.org/@sourcegraph/basic-code-intel/-/basic-code-intel-7.0.5.tgz#eb17ef2a29e4fe3a935a9cf8b385d3737fa64148" + integrity sha512-FmGIdATsr9hvIivvJ4yu216YiyPbQn4+lPTe0eKlbIXM5eTK5OUgVSIH57wAeAkCvscy/Jzg03d8rqmkAFtz8g== dependencies: lodash "^4.17.11" rxjs "^6.3.3"