diff --git a/packages/language-server/package.json b/packages/language-server/package.json index 2e4817aba..0240d9e00 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -49,19 +49,18 @@ "cosmiconfig": "^6.0.0", "estree-walker": "^2.0.1", "lodash": "^4.17.19", - "magic-string": "^0.25.3", - "prettier": "2.0.5", - "prettier-plugin-svelte": "~1.1.1", + "prettier": "2.1.1", + "prettier-plugin-svelte": "~1.2.0", "source-map": "^0.7.3", - "svelte": "3.24.0", - "svelte-preprocess": "~3.9.11", + "svelte": "3.24.1", + "svelte-preprocess": "~4.2.0", "svelte2tsx": "*", "typescript": "*", - "vscode-css-languageservice": "4.1.0", + "vscode-css-languageservice": "4.2.0", "vscode-emmet-helper": "1.2.17", "vscode-html-languageservice": "3.0.4-next.15", "vscode-languageserver": "6.1.1", "vscode-languageserver-types": "3.15.1", - "vscode-uri": "2.1.1" + "vscode-uri": "2.1.2" } } diff --git a/packages/language-server/src/lib/documents/DocumentMapper.ts b/packages/language-server/src/lib/documents/DocumentMapper.ts index 84401dc20..4b949243a 100644 --- a/packages/language-server/src/lib/documents/DocumentMapper.ts +++ b/packages/language-server/src/lib/documents/DocumentMapper.ts @@ -1,12 +1,9 @@ import { Position, Range, - TextEdit, - Location, CompletionItem, Hover, Diagnostic, - ColorInformation, ColorPresentation, SymbolInformation, LocationLink, @@ -217,20 +214,6 @@ export function mapRangeToGenerated(fragment: DocumentMapper, range: Range): Ran ); } -export function mapTextEditToOriginal( - fragment: Pick, - edit: TextEdit, -): TextEdit { - return { ...edit, range: mapRangeToOriginal(fragment, edit.range) }; -} - -export function mapLocationToOriginal( - fragment: Pick, - loc: Location, -): Location { - return { ...loc, range: mapRangeToOriginal(fragment, loc.range) }; -} - export function mapCompletionItemToOriginal( fragment: Pick, item: CompletionItem, @@ -239,7 +222,7 @@ export function mapCompletionItemToOriginal( return item; } - return { ...item, textEdit: mapTextEditToOriginal(fragment, item.textEdit) }; + return { ...item, textEdit: mapObjWithRangeToOriginal(fragment, item.textEdit) }; } export function mapHoverToParent( @@ -253,11 +236,11 @@ export function mapHoverToParent( return { ...hover, range: mapRangeToOriginal(fragment, hover.range) }; } -export function mapDiagnosticToOriginal( +export function mapObjWithRangeToOriginal( fragment: Pick, - diagnostic: Diagnostic, -): Diagnostic { - return { ...diagnostic, range: mapRangeToOriginal(fragment, diagnostic.range) }; + objWithRange: T, +): T { + return { ...objWithRange, range: mapRangeToOriginal(fragment, objWithRange.range) }; } export function mapDiagnosticToGenerated( @@ -267,12 +250,6 @@ export function mapDiagnosticToGenerated( return { ...diagnostic, range: mapRangeToGenerated(fragment, diagnostic.range) }; } -export function mapColorInformationToOriginal( - fragment: Pick, - info: ColorInformation, -): ColorInformation { - return { ...info, range: mapRangeToOriginal(fragment, info.range) }; -} export function mapColorPresentationToOriginal( fragment: Pick, @@ -283,12 +260,12 @@ export function mapColorPresentationToOriginal( }; if (item.textEdit) { - item.textEdit = mapTextEditToOriginal(fragment, item.textEdit); + item.textEdit = mapObjWithRangeToOriginal(fragment, item.textEdit); } if (item.additionalTextEdits) { item.additionalTextEdits = item.additionalTextEdits.map((edit) => - mapTextEditToOriginal(fragment, edit), + mapObjWithRangeToOriginal(fragment, edit), ); } @@ -299,7 +276,7 @@ export function mapSymbolInformationToOriginal( fragment: Pick, info: SymbolInformation, ): SymbolInformation { - return { ...info, location: mapLocationToOriginal(fragment, info.location) }; + return { ...info, location: mapObjWithRangeToOriginal(fragment, info.location) }; } export function mapLocationLinkToOriginal( @@ -327,7 +304,7 @@ export function mapTextDocumentEditToOriginal(fragment: DocumentMapper, edit: Te return TextDocumentEdit.create( edit.textDocument, - edit.edits.map((textEdit) => mapTextEditToOriginal(fragment, textEdit)), + edit.edits.map((textEdit) => mapObjWithRangeToOriginal(fragment, textEdit)), ); } diff --git a/packages/language-server/src/lib/documents/configLoader.ts b/packages/language-server/src/lib/documents/configLoader.ts index 966241bbd..a7f1f7df1 100644 --- a/packages/language-server/src/lib/documents/configLoader.ts +++ b/packages/language-server/src/lib/documents/configLoader.ts @@ -74,7 +74,9 @@ function useFallbackPreprocessor(path: string, foundConfig: boolean): SvelteConf ); return { preprocess: importSveltePreprocess(path)({ - typescript: { transpileOnly: true, compilerOptions: { sourceMap: true } }, + // 4.x does not have transpileOnly anymore, but if the user has version 3.x + // in his repo, that one is loaded instead, for which we still need this. + typescript: { transpileOnly: true, compilerOptions: { sourceMap: true } }, }), }; } diff --git a/packages/language-server/src/plugins/css/CSSPlugin.ts b/packages/language-server/src/plugins/css/CSSPlugin.ts index 017fbea40..4fb0fb22d 100644 --- a/packages/language-server/src/plugins/css/CSSPlugin.ts +++ b/packages/language-server/src/plugins/css/CSSPlugin.ts @@ -15,13 +15,12 @@ import { import { Document, DocumentManager, - mapColorInformationToOriginal, mapColorPresentationToOriginal, mapCompletionItemToOriginal, - mapDiagnosticToOriginal, - mapHoverToParent, mapRangeToGenerated, mapSymbolInformationToOriginal, + mapObjWithRangeToOriginal, + mapHoverToParent, } from '../../lib/documents'; import { LSConfigManager, LSCSSConfig } from '../../ls-config'; import { @@ -76,7 +75,7 @@ export class CSSPlugin return getLanguageService(kind) .doValidation(cssDocument, cssDocument.stylesheet) .map((diagnostic) => ({ ...diagnostic, source: getLanguage(kind) })) - .map((diagnostic) => mapDiagnosticToOriginal(cssDocument, diagnostic)); + .map((diagnostic) => mapObjWithRangeToOriginal(cssDocument, diagnostic)); } doHover(document: Document, position: Position): Hover | null { @@ -171,7 +170,7 @@ export class CSSPlugin return getLanguageService(extractLanguage(cssDocument)) .findDocumentColors(cssDocument, cssDocument.stylesheet) - .map((colorInfo) => mapColorInformationToOriginal(cssDocument, colorInfo)); + .map((colorInfo) => mapObjWithRangeToOriginal(cssDocument, colorInfo)); } getColorPresentations(document: Document, range: Range, color: Color): ColorPresentation[] { diff --git a/packages/language-server/src/plugins/svelte/features/getCodeActions/getQuickfixes.ts b/packages/language-server/src/plugins/svelte/features/getCodeActions/getQuickfixes.ts index 5e7bf18b1..679bd7f63 100644 --- a/packages/language-server/src/plugins/svelte/features/getCodeActions/getQuickfixes.ts +++ b/packages/language-server/src/plugins/svelte/features/getCodeActions/getQuickfixes.ts @@ -11,7 +11,7 @@ import { TextEdit, VersionedTextDocumentIdentifier, } from 'vscode-languageserver'; -import { mapTextEditToOriginal, offsetAt, positionAt } from '../../../../lib/documents'; +import { mapObjWithRangeToOriginal, offsetAt, positionAt } from '../../../../lib/documents'; import { pathToUrl } from '../../../../utils'; import { SvelteDocument } from '../../SvelteDocument'; import ts from 'typescript'; @@ -119,7 +119,7 @@ async function getSvelteIgnoreEdit(svelteDoc: SvelteDocument, ast: Ast, diagnost const ignore = `${indent}${EOL}`; const position = Position.create(nodeStartPosition.line, 0); - return mapTextEditToOriginal(transpiled, TextEdit.insert(position, ignore)); + return mapObjWithRangeToOriginal(transpiled, TextEdit.insert(position, ignore)); } const elementOrComponent = ['Component', 'Element', 'InlineComponent']; diff --git a/packages/language-server/src/plugins/svelte/features/getDiagnostics.ts b/packages/language-server/src/plugins/svelte/features/getDiagnostics.ts index 8ce626424..fdcb00a94 100644 --- a/packages/language-server/src/plugins/svelte/features/getDiagnostics.ts +++ b/packages/language-server/src/plugins/svelte/features/getDiagnostics.ts @@ -1,6 +1,6 @@ import { Warning } from 'svelte/types/compiler/interfaces'; import { Diagnostic, DiagnosticSeverity, Position, Range } from 'vscode-languageserver'; -import { Document, isInTag, mapDiagnosticToOriginal } from '../../../lib/documents'; +import { Document, isInTag, mapObjWithRangeToOriginal } from '../../../lib/documents'; import { Logger } from '../../../logger'; import { SvelteDocument, TranspileErrorSource } from '../SvelteDocument'; import { CompilerWarningsSettings } from '../../../ls-config'; @@ -53,10 +53,10 @@ async function tryGetDiagnostics( code: warning.code, }; }) - .map((diag) => mapDiagnosticToOriginal(transpiled, diag)); + .map((diag) => mapObjWithRangeToOriginal(transpiled, diag)); } catch (err) { return (await createParserErrorDiagnostic(err, document)).map((diag) => - mapDiagnosticToOriginal(transpiled, diag), + mapObjWithRangeToOriginal(transpiled, diag), ); } } diff --git a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts index 47b059614..16056deab 100644 --- a/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/DiagnosticsProvider.ts @@ -1,6 +1,6 @@ import ts from 'typescript'; import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver'; -import { Document, mapDiagnosticToOriginal, getTextInRange } from '../../../lib/documents'; +import { Document, mapObjWithRangeToOriginal, getTextInRange } from '../../../lib/documents'; import { DiagnosticsProvider } from '../../interfaces'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; import { convertRange, mapSeverity } from '../utils'; @@ -42,7 +42,7 @@ export class DiagnosticsProviderImpl implements DiagnosticsProvider { message: ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'), code: diagnostic.code, })) - .map((diagnostic) => mapDiagnosticToOriginal(fragment, diagnostic)) + .map((diagnostic) => mapObjWithRangeToOriginal(fragment, diagnostic)) .filter(hasNoNegativeLines) .filter(isNoFalsePositive(document.getText(), tsDoc)); } diff --git a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts index 07a490c4b..a7ee2ab34 100644 --- a/packages/language-server/src/plugins/typescript/features/HoverProvider.ts +++ b/packages/language-server/src/plugins/typescript/features/HoverProvider.ts @@ -1,6 +1,6 @@ import ts from 'typescript'; import { Hover, Position } from 'vscode-languageserver'; -import { Document, getWordAt, mapHoverToParent } from '../../../lib/documents'; +import { Document, getWordAt, mapObjWithRangeToOriginal } from '../../../lib/documents'; import { HoverProvider } from '../../interfaces'; import { SvelteDocumentSnapshot, SvelteSnapshotFragment } from '../DocumentSnapshot'; import { LSAndTSDocResolver } from '../LSAndTSDocResolver'; @@ -38,7 +38,7 @@ export class HoverProviderImpl implements HoverProvider { .concat(documentation ? ['---', documentation] : []) .join('\n'); - return mapHoverToParent(fragment, { + return mapObjWithRangeToOriginal(fragment, { range: convertRange(fragment, info.textSpan), contents, }); diff --git a/packages/language-server/test/lib/documents/Document.test.ts b/packages/language-server/test/lib/documents/Document.test.ts index 8cb0f86b9..b4b83649a 100644 --- a/packages/language-server/test/lib/documents/Document.test.ts +++ b/packages/language-server/test/lib/documents/Document.test.ts @@ -28,7 +28,9 @@ describe('Document', () => { const document = new Document('file:///hello.svelte', ''); assert.deepEqual(document.scriptInfo, { content: 'a', - attributes: {}, + attributes: { + lang: 'javascript', + }, start: 8, end: 9, startPos: Position.create(0, 8), @@ -37,7 +39,9 @@ describe('Document', () => { }); assert.deepEqual(document.styleInfo, { content: 'b', - attributes: {}, + attributes: { + lang: 'css', + }, start: 25, end: 26, startPos: Position.create(0, 25), @@ -48,7 +52,9 @@ describe('Document', () => { document.setText(''); assert.deepEqual(document.scriptInfo, { content: 'b', - attributes: {}, + attributes: { + lang: 'javascript', + }, start: 8, end: 9, startPos: Position.create(0, 8), diff --git a/packages/language-server/test/plugins/css/CSSPlugin.test.ts b/packages/language-server/test/plugins/css/CSSPlugin.test.ts index 773b0b766..b6c01c4f8 100644 --- a/packages/language-server/test/plugins/css/CSSPlugin.test.ts +++ b/packages/language-server/test/plugins/css/CSSPlugin.test.ts @@ -56,8 +56,8 @@ describe('CSS Plugin', () => { value: 'Defines character set of the document.\n\n[MDN Reference](https://developer.mozilla.org/docs/Web/CSS/@charset)', }, + sortText: "d_0000", textEdit: TextEdit.insert(Position.create(0, 7), '@charset'), - sortText: 'd_0000', tags: [], }); }); diff --git a/packages/svelte-check/package.json b/packages/svelte-check/package.json index dd95204e2..3688c4736 100644 --- a/packages/svelte-check/package.json +++ b/packages/svelte-check/package.json @@ -27,7 +27,7 @@ "vscode-languageserver": "6.1.1", "vscode-languageserver-protocol": "3.15.3", "vscode-languageserver-types": "3.15.1", - "vscode-uri": "2.1.1" + "vscode-uri": "2.1.2" }, "scripts": { "build": "tsc", diff --git a/packages/svelte2tsx/package.json b/packages/svelte2tsx/package.json index 6ab3723a6..ea360c9c2 100644 --- a/packages/svelte2tsx/package.json +++ b/packages/svelte2tsx/package.json @@ -21,7 +21,7 @@ "@types/node": "^8.10.53", "@types/unist": "^2.0.3", "@types/vfile": "^3.0.2", - "magic-string": "^0.25.4", + "magic-string": "^0.25.7", "mocha": "^6.2.2", "periscopic": "^2.0.2", "rollup": "^1.12.0", @@ -32,7 +32,7 @@ "rollup-plugin-typescript": "^1.0.1", "source-map": "^0.6.1", "source-map-support": "^0.5.16", - "svelte": "3.24.0", + "svelte": "3.24.1", "tiny-glob": "^0.2.6", "tslib": "^1.10.0", "typescript": "^4.0.2" diff --git a/yarn.lock b/yarn.lock index 879ce9aa7..247cf28fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1275,7 +1275,7 @@ lower-case@^2.0.1: dependencies: tslib "^1.10.0" -magic-string@^0.25.2, magic-string@^0.25.3, magic-string@^0.25.4: +magic-string@^0.25.2, magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== @@ -1632,15 +1632,15 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier-plugin-svelte@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-1.1.1.tgz#610f5a0e2b59d1a9b7bbf7625560ed7609d078f9" - integrity sha512-Us0mEQh/Gl4FdHbdkBgY24a3zydQXzbRRdaiFTLzKR4bHmRDiqadoBFM+XJYVv1u5rySGtYQt0wU9ZxLh85c/Q== +prettier-plugin-svelte@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-1.2.0.tgz#64088163656470e7d5c83106aea804a1c2c71efb" + integrity sha512-D6Yh8WIk/8BDtJ6BN5vFMylCcdbiQbB2px5UPIiBCp1MbEqpEbVfWyOJPKnVc0xkvlr2CoCRXJcNbHtnh0JM9w== -prettier@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" - integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== +prettier@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.1.tgz#d9485dd5e499daa6cb547023b87a6cf51bee37d6" + integrity sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw== progress@^2.0.0: version "2.0.3" @@ -1954,20 +1954,20 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -svelte-preprocess@~3.9.11: - version "3.9.11" - resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-3.9.11.tgz#94f7abdfce79e828d350ae57be704d4293718b68" - integrity sha512-2LCIiNGSgxOwuQIw5J40cbisRQ3Acw3jPk6z4wbmSAQzc6NTpm7Ar/Awts3ekzadSFnkb2IG4yUprMT/Egjx6Q== +svelte-preprocess@~4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.2.0.tgz#72c5c232d42e49227e909f07985b67f9191bd3cf" + integrity sha512-UTDmvFiGhAL888TG+zyhcdN1Uy3kj++9Ue7MVJVBoNREHkecFZem7lsCARGIUgUZg7KfFqanD40Op3JAI7kFHA== dependencies: "@types/pug" "^2.0.4" "@types/sass" "^1.16.0" detect-indent "^6.0.0" strip-indent "^3.0.0" -svelte@3.24.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.24.0.tgz#6565a42c9705796fa66c6abb4fedc09f4323a4a8" - integrity sha512-VFXom6EP2DK83kxy4ZlBbaZklSbZIrpNH3oNXlPYHJUuW4q1OuAr3ZoYbfIVTVYPDgrI7Yq0gQcOhDlAtO4qfw== +svelte@3.24.1: + version "3.24.1" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.24.1.tgz#aca364937dd1df27fe131e2a4c234acb6061db4b" + integrity sha512-OX/IBVUJSFo1rnznXdwf9rv6LReJ3qQ0PwRjj76vfUWyTfbHbR9OXqJBnUrpjyis2dwYcbT2Zm1DFjOOF1ZbbQ== table@^5.2.3: version "5.4.6" @@ -2076,14 +2076,14 @@ vfile-message@*: "@types/unist" "^2.0.0" unist-util-stringify-position "^2.0.0" -vscode-css-languageservice@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.1.0.tgz#144c8274e0bf1719fa6f773ca684bd1c7ffd634f" - integrity sha512-iTX3dTp0Y0RFWhIux5jasI8r9swdiWVB1Z3OrZ10iDHxzkETjVPxAQ5BEQU4ag0Awc8TTg1C7sJriHQY2LO14g== +vscode-css-languageservice@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-4.2.0.tgz#56081374857ce8aa4dd4c98f97e4e10a30b7242f" + integrity sha512-HIjl5bofrrxMMF05K/nq83270EdvteuAIio44FWd6tDdfhgg4vbofiAuXRSpXFi335f5+ekKdrzvPZm9ahqzsg== dependencies: vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.15.1" - vscode-nls "^4.1.1" + vscode-nls "^4.1.2" vscode-uri "^2.1.1" vscode-emmet-helper@1.2.17: @@ -2148,7 +2148,17 @@ vscode-nls@^4.1.1: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.1.tgz#f9916b64e4947b20322defb1e676a495861f133c" integrity sha512-4R+2UoUUU/LdnMnFjePxfLqNhBS8lrAFyX7pjb2ud/lqDkrUavFUTcG7wR0HBZFakae0Q6KLBFjMS6W93F403A== -vscode-uri@2.1.1, vscode-uri@^2.1.1: +vscode-nls@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" + integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== + +vscode-uri@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" + integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== + +vscode-uri@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.1.tgz#5aa1803391b6ebdd17d047f51365cf62c38f6e90" integrity sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A==