From 23412ae2ae2c2c6ff5fdc9042976a38668e4f32a Mon Sep 17 00:00:00 2001 From: Grzegorz Kazana Date: Thu, 1 Oct 2020 22:14:47 +0200 Subject: [PATCH] fix: diagnostic mapping for context="module" --- .../plugins/typescript/DocumentSnapshot.ts | 9 ++++--- .../features/DiagnosticsProvider.test.ts | 25 +++++++++++++++++++ .../testfiles/diagnostics-module.svelte | 1 + 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 packages/language-server/test/plugins/typescript/testfiles/diagnostics-module.svelte diff --git a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts index 398730c21..c34cfde8b 100644 --- a/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts +++ b/packages/language-server/src/plugins/typescript/DocumentSnapshot.ts @@ -254,11 +254,13 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { } private async getMapper(uri: string) { - if (!this.parent.scriptInfo) { + const scriptInfo = this.parent.scriptInfo || this.parent.moduleScriptInfo; + + if (!scriptInfo) { return new IdentityMapper(uri); } if (!this.tsxMap) { - return new FragmentMapper(this.parent.getText(), this.parent.scriptInfo, uri); + return new FragmentMapper(this.parent.getText(), scriptInfo, uri); } return new ConsumerDocumentMapper( await new SourceMapConsumer(this.tsxMap), @@ -272,7 +274,8 @@ export class SvelteDocumentSnapshot implements DocumentSnapshot { * A js/ts document snapshot suitable for the ts language service and the plugin. * Since no mapping has to be done here, it also implements the mapper interface. */ -export class JSOrTSDocumentSnapshot extends IdentityMapper +export class JSOrTSDocumentSnapshot + extends IdentityMapper implements DocumentSnapshot, SnapshotFragment { scriptKind = getScriptKindFromFileName(this.filePath); scriptInfo = null; diff --git a/packages/language-server/test/plugins/typescript/features/DiagnosticsProvider.test.ts b/packages/language-server/test/plugins/typescript/features/DiagnosticsProvider.test.ts index 9fe19bdb1..17365cfc2 100644 --- a/packages/language-server/test/plugins/typescript/features/DiagnosticsProvider.test.ts +++ b/packages/language-server/test/plugins/typescript/features/DiagnosticsProvider.test.ts @@ -43,6 +43,31 @@ describe('DiagnosticsProvider', () => { ]); }); + it('provides diagnostics for context="module"', async () => { + const { plugin, document } = setup('diagnostics-module.svelte'); + const diagnostics = await plugin.getDiagnostics(document); + + assert.deepStrictEqual(diagnostics, [ + { + code: 2322, + message: "Type 'boolean' is not assignable to type 'string'.", + range: { + start: { + character: 49, + line: 0, + }, + end: { + character: 52, + line: 0, + }, + }, + severity: 1, + source: 'ts', + tags: [], + }, + ]); + }); + it('provides typecheck diagnostics for js file when //@ts-check at top of script', async () => { const { plugin, document } = setup('diagnostics-js-typecheck.svelte'); const diagnostics = await plugin.getDiagnostics(document); diff --git a/packages/language-server/test/plugins/typescript/testfiles/diagnostics-module.svelte b/packages/language-server/test/plugins/typescript/testfiles/diagnostics-module.svelte new file mode 100644 index 000000000..6993404db --- /dev/null +++ b/packages/language-server/test/plugins/typescript/testfiles/diagnostics-module.svelte @@ -0,0 +1 @@ + \ No newline at end of file