From a002fb8217c82a698fde2aaeac34b10e2ab8c7da Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 28 Apr 2022 19:23:54 +0200 Subject: [PATCH 1/3] (feat) replace source-map library With new, maintained, no-WASM, sync library which is just better all around #1141 #1455 --- packages/language-server/package.json | 3 +- .../src/lib/documents/DocumentMapper.ts | 25 ++--------- .../src/plugins/svelte/SvelteDocument.ts | 38 ++-------------- .../src/plugins/svelte/SveltePlugin.ts | 1 - .../src/plugins/typescript/DocumentMapper.ts | 4 +- .../plugins/typescript/DocumentSnapshot.ts | 45 +++---------------- .../src/plugins/typescript/SnapshotManager.ts | 5 --- packages/svelte-check/package.json | 2 +- packages/svelte-check/rollup.config.js | 2 +- packages/svelte2tsx/package.json | 2 +- yarn.lock | 32 +++++++------ 11 files changed, 38 insertions(+), 121 deletions(-) diff --git a/packages/language-server/package.json b/packages/language-server/package.json index fef2200dd..9a14ee8e6 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -41,20 +41,19 @@ "@types/node": "^13.9.0", "@types/prettier": "^2.2.3", "@types/sinon": "^7.5.2", - "@types/source-map": "^0.5.7", "cross-env": "^7.0.2", "mocha": "^9.2.0", "sinon": "^11.0.0", "ts-node": "^10.0.0" }, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", "chokidar": "^3.4.1", "estree-walker": "^2.0.1", "fast-glob": "^3.2.7", "lodash": "^4.17.21", "prettier": "2.5.1", "prettier-plugin-svelte": "~2.7.0", - "source-map": "^0.7.3", "svelte": "^3.47.0", "svelte-preprocess": "~4.10.1", "svelte2tsx": "~0.5.0", diff --git a/packages/language-server/src/lib/documents/DocumentMapper.ts b/packages/language-server/src/lib/documents/DocumentMapper.ts index 894b29b09..c7482ae23 100644 --- a/packages/language-server/src/lib/documents/DocumentMapper.ts +++ b/packages/language-server/src/lib/documents/DocumentMapper.ts @@ -14,8 +14,8 @@ import { InsertReplaceEdit } from 'vscode-languageserver'; import { TagInformation, offsetAt, positionAt, getLineOffsets } from './utils'; -import { SourceMapConsumer } from 'source-map'; import { Logger } from '../../logger'; +import { generatedPositionFor, originalPositionFor, TraceMap } from '@jridgewell/trace-mapping'; export interface DocumentMapper { /** @@ -40,11 +40,6 @@ export interface DocumentMapper { * Get document URL */ getURL(): string; - - /** - * Implement this if you need teardown logic before this mapper gets cleaned up. - */ - destroy?(): void; } /** @@ -80,10 +75,6 @@ export class IdentityMapper implements DocumentMapper { getURL(): string { return this.url; } - - destroy() { - this.parent?.destroy?.(); - } } /** @@ -129,7 +120,7 @@ export class FragmentMapper implements DocumentMapper { export class SourceMapDocumentMapper implements DocumentMapper { constructor( - protected consumer: SourceMapConsumer, + protected consumer: TraceMap, protected sourceUri: string, private parent?: DocumentMapper ) {} @@ -143,7 +134,7 @@ export class SourceMapDocumentMapper implements DocumentMapper { return { line: -1, character: -1 }; } - const mapped = this.consumer.originalPositionFor({ + const mapped = originalPositionFor(this.consumer, { line: generatedPosition.line + 1, column: generatedPosition.character }); @@ -167,7 +158,7 @@ export class SourceMapDocumentMapper implements DocumentMapper { originalPosition = this.parent.getGeneratedPosition(originalPosition); } - const mapped = this.consumer.generatedPositionFor({ + const mapped = generatedPositionFor(this.consumer, { line: originalPosition.line + 1, column: originalPosition.character, source: this.sourceUri @@ -201,14 +192,6 @@ export class SourceMapDocumentMapper implements DocumentMapper { getURL(): string { return this.sourceUri; } - - /** - * Needs to be called when source mapper is no longer needed in order to prevent memory leaks. - */ - destroy() { - this.parent?.destroy?.(); - this.consumer.destroy(); - } } export function mapRangeToOriginal( diff --git a/packages/language-server/src/plugins/svelte/SvelteDocument.ts b/packages/language-server/src/plugins/svelte/SvelteDocument.ts index a5ceaa98f..6bd50db9c 100644 --- a/packages/language-server/src/plugins/svelte/SvelteDocument.ts +++ b/packages/language-server/src/plugins/svelte/SvelteDocument.ts @@ -1,4 +1,4 @@ -import { SourceMapConsumer } from 'source-map'; +import { TraceMap } from '@jridgewell/trace-mapping'; import type { compile } from 'svelte/compiler'; import { CompileOptions } from 'svelte/types/compiler/interfaces'; import { PreprocessorGroup, Processed } from 'svelte/types/compiler/preprocess/types'; @@ -100,21 +100,10 @@ export class SvelteDocument { const svelte = importSvelte(this.getFilePath()); return svelte.compile((await this.getTranspiled()).getText(), options); } - - /** - * Needs to be called before cleanup to prevent source map memory leaks. - */ - destroyTranspiled() { - if (this.transpiledDoc) { - this.transpiledDoc.destroy(); - this.transpiledDoc = undefined; - } - } } export interface ITranspiledSvelteDocument extends PositionMapper { getText(): string; - destroy(): void; } export class TranspiledSvelteDocument implements ITranspiledSvelteDocument { @@ -164,10 +153,6 @@ export class TranspiledSvelteDocument implements ITranspiledSvelteDocument { getGeneratedPosition(originalPosition: Position): Position { return this.mapper?.getGeneratedPosition(originalPosition) || originalPosition; } - - destroy() { - this.mapper?.destroy(); - } } /** @@ -262,14 +247,6 @@ export class FallbackTranspiledSvelteDocument implements ITranspiledSvelteDocume return positionAt(offset, this.getText()); } - - /** - * Needs to be called before cleanup to prevent source map memory leaks. - */ - destroy() { - this.scriptMapper?.destroy(); - this.styleMapper?.destroy(); - } } export class SvelteFragmentMapper implements PositionMapper { @@ -387,15 +364,6 @@ export class SvelteFragmentMapper implements PositionMapper { ); return this.transpiledFragmentMapper.getOriginalPosition(positionInTranspiledFragment); } - - /** - * Needs to be called before cleanup to prevent source map memory leaks. - */ - destroy() { - if (this.sourceMapper.destroy) { - this.sourceMapper.destroy(); - } - } } /** @@ -485,8 +453,8 @@ async function transpile( return { transpiled, processedScripts, processedStyles }; } -async function createSourceMapConsumer(map: any): Promise { - return new SourceMapConsumer(normalizeMap(map)); +async function createSourceMapConsumer(map: any): Promise { + return new TraceMap(normalizeMap(map)); function normalizeMap(map: any) { // We don't know what we get, could be a stringified sourcemap, diff --git a/packages/language-server/src/plugins/svelte/SveltePlugin.ts b/packages/language-server/src/plugins/svelte/SveltePlugin.ts index dae093f85..98630750d 100644 --- a/packages/language-server/src/plugins/svelte/SveltePlugin.ts +++ b/packages/language-server/src/plugins/svelte/SveltePlugin.ts @@ -223,7 +223,6 @@ export class SveltePlugin private async getSvelteDoc(document: Document) { let svelteDoc = this.docManager.get(document); if (!svelteDoc || svelteDoc.version !== document.version) { - svelteDoc?.destroyTranspiled(); svelteDoc = new SvelteDocument(document); this.docManager.set(document, svelteDoc); } diff --git a/packages/language-server/src/plugins/typescript/DocumentMapper.ts b/packages/language-server/src/plugins/typescript/DocumentMapper.ts index 6f15c0299..cc41cfbba 100644 --- a/packages/language-server/src/plugins/typescript/DocumentMapper.ts +++ b/packages/language-server/src/plugins/typescript/DocumentMapper.ts @@ -1,9 +1,9 @@ +import { TraceMap } from '@jridgewell/trace-mapping'; import { Position } from 'vscode-languageserver'; -import { SourceMapConsumer } from 'source-map'; import { SourceMapDocumentMapper } from '../../lib/documents'; export class ConsumerDocumentMapper extends SourceMapDocumentMapper { - constructor(consumer: SourceMapConsumer, sourceUri: string, private nrPrependesLines: number) { + constructor(consumer: TraceMap, sourceUri: string, private nrPrependesLines: number) { super(consumer, sourceUri); } diff --git a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts index e91b9f45b..55dda6b93 100644 --- a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts +++ b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts @@ -1,4 +1,4 @@ -import { RawSourceMap, SourceMapConsumer } from 'source-map'; +import { DecodedSourceMap, EncodedSourceMap, TraceMap } from '@jridgewell/trace-mapping'; import { walk } from 'svelte/compiler'; import { TemplateNode } from 'svelte/types/compiler/interfaces'; import { svelte2tsx, IExportedNames } from 'svelte2tsx'; @@ -49,18 +49,9 @@ export interface DocumentSnapshot extends ts.IScriptSnapshot { scriptKind: ts.ScriptKind; positionAt(offset: number): Position; /** - * Instantiates a source mapper. - * `destroyFragment` needs to be called when - * it's no longer needed / the class should be cleaned up - * in order to prevent memory leaks. + * Instantiates a source mapper */ getFragment(): Promise; - /** - * Needs to be called when source mapper - * is no longer needed / the class should be cleaned up - * in order to prevent memory leaks. - */ - destroyFragment(): void; /** * Convenience function for getText(0, getLength()) */ @@ -155,7 +146,7 @@ export namespace DocumentSnapshot { * Tries to preprocess the svelte document and convert the contents into better analyzable js/ts(x) content. */ function preprocessSvelteFile(document: Document, options: SvelteSnapshotOptions) { - let tsxMap: RawSourceMap | undefined; + let tsxMap: EncodedSourceMap | undefined; let parserError: ParserError | null = null; let nrPrependedLines = 0; let text = document.getText(); @@ -188,7 +179,7 @@ function preprocessSvelteFile(document: Document, options: SvelteSnapshotOptions document.config?.compilerOptions?.customElement }); text = tsx.code; - tsxMap = tsx.map; + tsxMap = tsx.map as EncodedSourceMap; exportedNames = tsx.exportedNames; // We know it's there, it's not part of the public API so people don't start using it htmlAst = (tsx as any).htmlAst; @@ -248,7 +239,7 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { private readonly text: string, private readonly nrPrependedLines: number, private readonly exportedNames: IExportedNames, - private readonly tsxMap?: RawSourceMap, + private readonly tsxMap?: DecodedSourceMap | EncodedSourceMap, private readonly htmlAst?: TemplateNode ) {} @@ -330,13 +321,6 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { return this.fragment; } - destroyFragment() { - if (this.fragment) { - this.fragment.destroy(); - this.fragment = undefined; - } - } - private async getMapper(uri: string) { const scriptInfo = this.parent.scriptInfo || this.parent.moduleScriptInfo; @@ -348,11 +332,7 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { return new FragmentMapper(this.parent.getText(), scriptInfo, uri); } - return new ConsumerDocumentMapper( - await new SourceMapConsumer(this.tsxMap), - uri, - this.nrPrependedLines - ); + return new ConsumerDocumentMapper(new TraceMap(this.tsxMap), uri, this.nrPrependedLines); } } @@ -400,10 +380,6 @@ export class JSOrTSDocumentSnapshot return this; } - destroyFragment() { - // nothing to clean up - } - update(changes: TextDocumentContentChangeEvent[]): void { for (const change of changes) { let start = 0; @@ -479,13 +455,4 @@ export class SvelteSnapshotFragment implements SnapshotFragment { offsetAt(position: Position) { return offsetAt(position, this.text, this.lineOffsets); } - - /** - * Needs to be called when source mapper is no longer needed in order to prevent memory leaks. - */ - destroy() { - if (this.mapper.destroy) { - this.mapper.destroy(); - } - } } diff --git a/packages/language-server/src/plugins/typescript/SnapshotManager.ts b/packages/language-server/src/plugins/typescript/SnapshotManager.ts index d7b19c0ce..4b69643bc 100644 --- a/packages/language-server/src/plugins/typescript/SnapshotManager.ts +++ b/packages/language-server/src/plugins/typescript/SnapshotManager.ts @@ -21,11 +21,6 @@ export class GlobalSnapshotsManager { set(fileName: string, document: DocumentSnapshot) { fileName = normalizePath(fileName); - const prev = this.get(fileName); - if (prev) { - prev.destroyFragment(); - } - this.documents.set(fileName, document); this.emitter.emit('change', fileName, document); } diff --git a/packages/svelte-check/package.json b/packages/svelte-check/package.json index caacad302..167ab252c 100644 --- a/packages/svelte-check/package.json +++ b/packages/svelte-check/package.json @@ -19,12 +19,12 @@ }, "homepage": "https://github.com/sveltejs/language-tools#readme", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.9", "picocolors": "^1.0.0", "chokidar": "^3.4.1", "fast-glob": "^3.2.7", "import-fresh": "^3.2.1", "sade": "^1.7.4", - "source-map": "^0.7.3", "svelte-preprocess": "^4.0.0", "typescript": "*" }, diff --git a/packages/svelte-check/rollup.config.js b/packages/svelte-check/rollup.config.js index b6894df92..c59ae6b2a 100644 --- a/packages/svelte-check/rollup.config.js +++ b/packages/svelte-check/rollup.config.js @@ -67,7 +67,7 @@ export default [ 'svelte/compiler', 'svelte-preprocess', 'import-fresh', // because of https://github.com/sindresorhus/import-fresh/issues/18 - 'source-map' + '@jridgewell/trace-mapping' ] } ]; diff --git a/packages/svelte2tsx/package.json b/packages/svelte2tsx/package.json index b539b8e8d..e976a57eb 100644 --- a/packages/svelte2tsx/package.json +++ b/packages/svelte2tsx/package.json @@ -18,6 +18,7 @@ "module": "index.mjs", "types": "index.d.ts", "devDependencies": { + "@jridgewell/trace-mapping": "^0.3.9", "@rollup/plugin-commonjs": "^15.0.0", "@rollup/plugin-json": "^4.0.0", "@rollup/plugin-node-resolve": "^9.0.0", @@ -31,7 +32,6 @@ "periscopic": "^2.0.2", "rollup": "2.52.7", "rollup-plugin-delete": "^2.0.0", - "source-map": "^0.6.1", "source-map-support": "^0.5.16", "sourcemap-codec": "^1.4.8", "svelte": "~3.47.0", diff --git a/yarn.lock b/yarn.lock index ba1ba014d..363f8d603 100644 --- a/yarn.lock +++ b/yarn.lock @@ -37,6 +37,24 @@ resolved "https://registry.yarnpkg.com/@emmetio/scanner/-/scanner-1.0.0.tgz#065b2af6233fe7474d44823e3deb89724af42b5f" integrity sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA== +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" + integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@nodelib/fs.scandir@2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" @@ -301,13 +319,6 @@ resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.5.2.tgz#5e2f1d120f07b9cda07e5dedd4f3bf8888fccdb9" integrity sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg== -"@types/source-map@^0.5.7": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@types/source-map/-/source-map-0.5.7.tgz#165eeb583c1ef00196fe4ef4da5d7832b03b275b" - integrity sha512-LrnsgZIfJaysFkv9rRJp4/uAyqw87oVed3s1hhF83nwbo9c7MG9g5DqR0seHP+lkX4ldmMrVolPjQSe2ZfD0yA== - dependencies: - source-map "*" - "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" @@ -2356,12 +2367,7 @@ source-map-support@^0.5.16, source-map-support@^0.5.17: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@*, source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== From 6275a7e88503c3c82a46255809ce57c53a189b9e Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 29 Apr 2022 13:35:24 +0200 Subject: [PATCH 2/3] more cleanup --- .../src/lib/documents/DocumentMapper.ts | 6 ++-- .../src/plugins/svelte/SvelteDocument.ts | 32 ++++++++----------- .../src/plugins/typescript/DocumentMapper.ts | 4 +-- .../plugins/typescript/DocumentSnapshot.ts | 10 +++--- .../plugins/typescript/TypeScriptPlugin.ts | 4 +-- .../features/CodeActionsProvider.ts | 8 ++--- .../typescript/features/CompletionProvider.ts | 12 +++---- .../features/DiagnosticsProvider.ts | 2 +- .../features/FindReferencesProvider.ts | 2 +- .../typescript/features/HoverProvider.ts | 10 +++--- .../features/ImplementationProvider.ts | 2 +- .../typescript/features/RenameProvider.ts | 4 +-- .../features/SelectionRangeProvider.ts | 2 +- .../features/SemanticTokensProvider.ts | 2 +- .../features/SignatureHelpProvider.ts | 2 +- .../features/TypeDefinitionProvider.ts | 2 +- .../src/plugins/typescript/features/utils.ts | 6 ++-- 17 files changed, 53 insertions(+), 57 deletions(-) diff --git a/packages/language-server/src/lib/documents/DocumentMapper.ts b/packages/language-server/src/lib/documents/DocumentMapper.ts index c7482ae23..11faab49b 100644 --- a/packages/language-server/src/lib/documents/DocumentMapper.ts +++ b/packages/language-server/src/lib/documents/DocumentMapper.ts @@ -120,7 +120,7 @@ export class FragmentMapper implements DocumentMapper { export class SourceMapDocumentMapper implements DocumentMapper { constructor( - protected consumer: TraceMap, + protected traceMap: TraceMap, protected sourceUri: string, private parent?: DocumentMapper ) {} @@ -134,7 +134,7 @@ export class SourceMapDocumentMapper implements DocumentMapper { return { line: -1, character: -1 }; } - const mapped = originalPositionFor(this.consumer, { + const mapped = originalPositionFor(this.traceMap, { line: generatedPosition.line + 1, column: generatedPosition.character }); @@ -158,7 +158,7 @@ export class SourceMapDocumentMapper implements DocumentMapper { originalPosition = this.parent.getGeneratedPosition(originalPosition); } - const mapped = generatedPositionFor(this.consumer, { + const mapped = generatedPositionFor(this.traceMap, { line: originalPosition.line + 1, column: originalPosition.character, source: this.sourceUri diff --git a/packages/language-server/src/plugins/svelte/SvelteDocument.ts b/packages/language-server/src/plugins/svelte/SvelteDocument.ts index 6bd50db9c..596ca15b8 100644 --- a/packages/language-server/src/plugins/svelte/SvelteDocument.ts +++ b/packages/language-server/src/plugins/svelte/SvelteDocument.ts @@ -130,7 +130,7 @@ export class TranspiledSvelteDocument implements ITranspiledSvelteDocument { preprocessed.code, preprocessed.map ? new SourceMapDocumentMapper( - await createSourceMapConsumer(preprocessed.map), + createTraceMap(preprocessed.map), // The "sources" array only contains the Svelte filename, not its path. // For getting generated positions, the sourcemap consumer wants an exact match // of the source filepath. Therefore only pass in the filename here. @@ -170,16 +170,12 @@ export class FallbackTranspiledSvelteDocument implements ITranspiledSvelteDocume document, preprocessors ); - const scriptMapper = await SvelteFragmentMapper.createScript( + const scriptMapper = SvelteFragmentMapper.createScript( document, transpiled, processedScripts ); - const styleMapper = await SvelteFragmentMapper.createStyle( - document, - transpiled, - processedStyles - ); + const styleMapper = SvelteFragmentMapper.createStyle(document, transpiled, processedStyles); return new FallbackTranspiledSvelteDocument( document, @@ -250,7 +246,7 @@ export class FallbackTranspiledSvelteDocument implements ITranspiledSvelteDocume } export class SvelteFragmentMapper implements PositionMapper { - static async createStyle(originalDoc: Document, transpiled: string, processed: Processed[]) { + static createStyle(originalDoc: Document, transpiled: string, processed: Processed[]) { return SvelteFragmentMapper.create( originalDoc, transpiled, @@ -260,7 +256,7 @@ export class SvelteFragmentMapper implements PositionMapper { ); } - static async createScript(originalDoc: Document, transpiled: string, processed: Processed[]) { + static createScript(originalDoc: Document, transpiled: string, processed: Processed[]) { const scriptInfo = originalDoc.scriptInfo || originalDoc.moduleScriptInfo; const maybeScriptTag = extractScriptTags(transpiled); const maybeScriptTagInfo = @@ -275,7 +271,7 @@ export class SvelteFragmentMapper implements PositionMapper { ); } - private static async create( + private static create( originalDoc: Document, transpiled: string, originalTagInfo: TagInformation | null, @@ -284,7 +280,7 @@ export class SvelteFragmentMapper implements PositionMapper { ) { const sourceMapper = processed.length > 0 - ? await SvelteFragmentMapper.createSourceMapper(processed, originalDoc) + ? SvelteFragmentMapper.createSourceMapper(processed, originalDoc) : new IdentityMapper(originalDoc.uri); if (originalTagInfo && transpiledTagInfo) { @@ -304,17 +300,17 @@ export class SvelteFragmentMapper implements PositionMapper { return null; } - private static async createSourceMapper(processed: Processed[], originalDoc: Document) { + private static createSourceMapper(processed: Processed[], originalDoc: Document) { return processed.reduce( - async (parent, processedSingle) => + (parent, processedSingle) => processedSingle?.map ? new SourceMapDocumentMapper( - await createSourceMapConsumer(processedSingle.map), + createTraceMap(processedSingle.map), originalDoc.uri, - await parent + parent ) - : new IdentityMapper(originalDoc.uri, await parent), - Promise.resolve(undefined) + : new IdentityMapper(originalDoc.uri, parent), + (undefined) ); } @@ -453,7 +449,7 @@ async function transpile( return { transpiled, processedScripts, processedStyles }; } -async function createSourceMapConsumer(map: any): Promise { +function createTraceMap(map: any): TraceMap { return new TraceMap(normalizeMap(map)); function normalizeMap(map: any) { diff --git a/packages/language-server/src/plugins/typescript/DocumentMapper.ts b/packages/language-server/src/plugins/typescript/DocumentMapper.ts index cc41cfbba..b7a96a612 100644 --- a/packages/language-server/src/plugins/typescript/DocumentMapper.ts +++ b/packages/language-server/src/plugins/typescript/DocumentMapper.ts @@ -3,8 +3,8 @@ import { Position } from 'vscode-languageserver'; import { SourceMapDocumentMapper } from '../../lib/documents'; export class ConsumerDocumentMapper extends SourceMapDocumentMapper { - constructor(consumer: TraceMap, sourceUri: string, private nrPrependesLines: number) { - super(consumer, sourceUri); + constructor(traceMap: TraceMap, sourceUri: string, private nrPrependesLines: number) { + super(traceMap, sourceUri); } getOriginalPosition(generatedPosition: Position): Position { diff --git a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts index 55dda6b93..1c6e6e676 100644 --- a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts +++ b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts @@ -51,7 +51,7 @@ export interface DocumentSnapshot extends ts.IScriptSnapshot { /** * Instantiates a source mapper */ - getFragment(): Promise; + getFragment(): SnapshotFragment; /** * Convenience function for getText(0, getLength()) */ @@ -308,11 +308,11 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { return foundNode; } - async getFragment() { + getFragment() { if (!this.fragment) { const uri = pathToUrl(this.filePath); this.fragment = new SvelteSnapshotFragment( - await this.getMapper(uri), + this.getMapper(uri), this.text, this.parent, uri @@ -321,7 +321,7 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { return this.fragment; } - private async getMapper(uri: string) { + private getMapper(uri: string) { const scriptInfo = this.parent.scriptInfo || this.parent.moduleScriptInfo; if (!this.tsxMap) { @@ -376,7 +376,7 @@ export class JSOrTSDocumentSnapshot return offsetAt(position, this.text, this.getLineOffsets()); } - async getFragment() { + getFragment() { return this; } diff --git a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts index 3fa5b3140..f228a060b 100644 --- a/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts +++ b/packages/language-server/src/plugins/typescript/TypeScriptPlugin.ts @@ -165,7 +165,7 @@ export class TypeScriptPlugin } const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); if (cancellationToken?.isCancellationRequested) { return []; @@ -319,7 +319,7 @@ export class TypeScriptPlugin } const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const mainFragment = await tsDoc.getFragment(); + const mainFragment = tsDoc.getFragment(); const defs = lang.getDefinitionAndBoundSpan( tsDoc.filePath, diff --git a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts index a3e1b5e1d..756d0bb06 100644 --- a/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CodeActionsProvider.ts @@ -101,7 +101,7 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { } const { lang, tsDoc, userPreferences } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); if (cancellationToken?.isCancellationRequested) { return []; @@ -215,7 +215,7 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { cancellationToken: CancellationToken | undefined ) { const { lang, tsDoc, userPreferences } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); if (cancellationToken?.isCancellationRequested) { return []; @@ -430,7 +430,7 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { } const { lang, tsDoc, userPreferences } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); if (cancellationToken?.isCancellationRequested) { return []; @@ -527,7 +527,7 @@ export class CodeActionsProviderImpl implements CodeActionsProvider { } const { lang, tsDoc, userPreferences } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); const path = document.getFilePath() || ''; const { refactorName, originalRange, textRange } = args[1]; diff --git a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts index 4c05638ed..33818635f 100644 --- a/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts @@ -129,7 +129,7 @@ export class CompletionsProviderImpl implements CompletionsProvider>> { - const componentInfo = await getComponentAtPosition(lang, doc, tsDoc, originalPosition); + ): Array> { + const componentInfo = getComponentAtPosition(lang, doc, tsDoc, originalPosition); if (!componentInfo) { return []; } @@ -449,7 +449,7 @@ export class CompletionsProviderImpl implements CompletionsProvider { const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); const references = lang.getReferencesAtPosition( tsDoc.filePath, diff --git a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts index cae5834a9..7a31b3fc3 100644 --- a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts @@ -13,9 +13,9 @@ export class HoverProviderImpl implements HoverProvider { async doHover(document: Document, position: Position): Promise { const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); - const eventHoverInfo = await this.getEventHoverInfo(lang, document, tsDoc, position); + const eventHoverInfo = this.getEventHoverInfo(lang, document, tsDoc, position); if (eventHoverInfo) { return eventHoverInfo; } @@ -56,12 +56,12 @@ export class HoverProviderImpl implements HoverProvider { }); } - private async getEventHoverInfo( + private getEventHoverInfo( lang: ts.LanguageService, doc: Document, tsDoc: SvelteDocumentSnapshot, originalPosition: Position - ): Promise { + ): Hover | null { const possibleEventName = getWordAt(doc.getText(), doc.offsetAt(originalPosition), { left: /\S+$/, right: /[\s=]/ @@ -70,7 +70,7 @@ export class HoverProviderImpl implements HoverProvider { return null; } - const component = await getComponentAtPosition(lang, doc, tsDoc, originalPosition); + const component = getComponentAtPosition(lang, doc, tsDoc, originalPosition); if (!component) { return null; } diff --git a/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts b/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts index fc330db0d..0a9857513 100644 --- a/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/ImplementationProvider.ts @@ -12,7 +12,7 @@ export class ImplementationProviderImpl implements ImplementationProvider { async getImplementation(document: Document, position: Position): Promise { const { tsDoc, lang } = await this.lsAndTsDocResolver.getLSAndTSDoc(document); - const mainFragment = await tsDoc.getFragment(); + const mainFragment = tsDoc.getFragment(); const offset = mainFragment.offsetAt(mainFragment.getGeneratedPosition(position)); const implementations = lang.getImplementationAtPosition(tsDoc.filePath, offset); diff --git a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts index c81ae64bc..0c400e770 100644 --- a/packages/language-server/src/plugins/typescript/features/RenameProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/RenameProvider.ts @@ -38,7 +38,7 @@ export class RenameProviderImpl implements RenameProvider { async prepareRename(document: Document, position: Position): Promise { const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); const offset = fragment.offsetAt(fragment.getGeneratedPosition(position)); const renameInfo = this.getRenameInfo(lang, tsDoc, document, position, offset); @@ -55,7 +55,7 @@ export class RenameProviderImpl implements RenameProvider { newName: string ): Promise { const { lang, tsDoc } = await this.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); const offset = fragment.offsetAt(fragment.getGeneratedPosition(position)); diff --git a/packages/language-server/src/plugins/typescript/features/SelectionRangeProvider.ts b/packages/language-server/src/plugins/typescript/features/SelectionRangeProvider.ts index 355abc4a6..8b1589cc1 100644 --- a/packages/language-server/src/plugins/typescript/features/SelectionRangeProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/SelectionRangeProvider.ts @@ -14,7 +14,7 @@ export class SelectionRangeProviderImpl implements SelectionRangeProvider { position: Position ): Promise { const { tsDoc, lang } = await this.lsAndTsDocResolver.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); const tsSelectionRange = lang.getSmartSelectionRange( tsDoc.filePath, diff --git a/packages/language-server/src/plugins/typescript/features/SemanticTokensProvider.ts b/packages/language-server/src/plugins/typescript/features/SemanticTokensProvider.ts index b0f172f49..97513fb8a 100644 --- a/packages/language-server/src/plugins/typescript/features/SemanticTokensProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/SemanticTokensProvider.ts @@ -23,7 +23,7 @@ export class SemanticTokensProviderImpl implements SemanticTokensProvider { cancellationToken?: CancellationToken ): Promise { const { lang, tsDoc } = await this.lsAndTsDocResolver.getLSAndTSDoc(textDocument); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); // for better performance, don't do full-file semantic tokens when the file is too big if ( diff --git a/packages/language-server/src/plugins/typescript/features/SignatureHelpProvider.ts b/packages/language-server/src/plugins/typescript/features/SignatureHelpProvider.ts index 194997713..0b8457cd2 100644 --- a/packages/language-server/src/plugins/typescript/features/SignatureHelpProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/SignatureHelpProvider.ts @@ -27,7 +27,7 @@ export class SignatureHelpProviderImpl implements SignatureHelpProvider { cancellationToken?: CancellationToken ): Promise { const { lang, tsDoc } = await this.lsAndTsDocResolver.getLSAndTSDoc(document); - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); if (cancellationToken?.isCancellationRequested) { return null; diff --git a/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts b/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts index fad6fde4e..259d9f1ef 100644 --- a/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/TypeDefinitionProvider.ts @@ -12,7 +12,7 @@ export class TypeDefinitionProviderImpl implements TypeDefinitionProvider { async getTypeDefinition(document: Document, position: Position): Promise { const { tsDoc, lang } = await this.lsAndTsDocResolver.getLSAndTSDoc(document); - const mainFragment = await tsDoc.getFragment(); + const mainFragment = tsDoc.getFragment(); const offset = mainFragment.offsetAt(mainFragment.getGeneratedPosition(position)); const typeDefs = lang.getTypeDefinitionAtPosition(tsDoc.filePath, offset); diff --git a/packages/language-server/src/plugins/typescript/features/utils.ts b/packages/language-server/src/plugins/typescript/features/utils.ts index 6ea0228f0..068993055 100644 --- a/packages/language-server/src/plugins/typescript/features/utils.ts +++ b/packages/language-server/src/plugins/typescript/features/utils.ts @@ -19,12 +19,12 @@ type NodeTypePredicate = (node: ts.Node) => node is T; * If the given original position is within a Svelte starting tag, * return the snapshot of that component. */ -export async function getComponentAtPosition( +export function getComponentAtPosition( lang: ts.LanguageService, doc: Document, tsDoc: SvelteDocumentSnapshot, originalPosition: Position -): Promise { +): ComponentInfoProvider | null { if (tsDoc.parserError) { return null; } @@ -42,7 +42,7 @@ export async function getComponentAtPosition( return null; } - const fragment = await tsDoc.getFragment(); + const fragment = tsDoc.getFragment(); const generatedPosition = fragment.getGeneratedPosition(doc.positionAt(node.start + 1)); const def = lang.getDefinitionAtPosition( tsDoc.filePath, From 0406b2c5584adb19d1b89c672bc4c9cc1c79d894 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 29 Apr 2022 13:50:13 +0200 Subject: [PATCH 3/3] cleanup --- .../src/plugins/typescript/DocumentSnapshot.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts index 1c6e6e676..6e7dc7be4 100644 --- a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts +++ b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts @@ -1,4 +1,4 @@ -import { DecodedSourceMap, EncodedSourceMap, TraceMap } from '@jridgewell/trace-mapping'; +import { EncodedSourceMap, TraceMap } from '@jridgewell/trace-mapping'; import { walk } from 'svelte/compiler'; import { TemplateNode } from 'svelte/types/compiler/interfaces'; import { svelte2tsx, IExportedNames } from 'svelte2tsx'; @@ -239,7 +239,7 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { private readonly text: string, private readonly nrPrependedLines: number, private readonly exportedNames: IExportedNames, - private readonly tsxMap?: DecodedSourceMap | EncodedSourceMap, + private readonly tsxMap?: EncodedSourceMap, private readonly htmlAst?: TemplateNode ) {}