From 6804f4d9cdb87acb62cf29f79476ffa8df26377e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 14 Mar 2018 15:53:14 +0100 Subject: [PATCH] [html] update dependencies, extract folding, folding tests --- extensions/html/package.json | 4 +- extensions/html/server/package.json | 12 +- extensions/html/server/src/htmlServerMain.ts | 22 ++- extensions/html/server/src/modes/cssMode.ts | 2 +- .../html/server/src/modes/htmlFolding.ts | 170 ++++++++++++++++++ extensions/html/server/src/modes/htmlMode.ts | 79 +------- .../html/server/src/modes/languageModes.ts | 8 +- .../html/server/src/modes/pathCompletion.ts | 8 +- .../html/server/src/test/completions.test.ts | 4 +- .../html/server/src/test/folding.test.ts | 140 +++++++++++++++ .../html/server/src/utils/documentContext.ts | 2 +- extensions/html/server/yarn.lock | 62 ++++--- extensions/html/yarn.lock | 36 ++-- 13 files changed, 397 insertions(+), 152 deletions(-) create mode 100644 extensions/html/server/src/modes/htmlFolding.ts create mode 100644 extensions/html/server/src/test/folding.test.ts diff --git a/extensions/html/package.json b/extensions/html/package.json index 3b8d0cb9e28..c5e5d53120d 100644 --- a/extensions/html/package.json +++ b/extensions/html/package.json @@ -235,8 +235,8 @@ }, "dependencies": { "vscode-extension-telemetry": "0.0.15", - "vscode-languageclient": "4.0.0-next.9", - "vscode-nls": "^3.2.1" + "vscode-languageclient": "^4.0.0", + "vscode-nls": "^3.2.2" }, "devDependencies": { "@types/node": "7.0.43" diff --git a/extensions/html/server/package.json b/extensions/html/server/package.json index 0fc64522691..ba166f4017c 100644 --- a/extensions/html/server/package.json +++ b/extensions/html/server/package.json @@ -8,13 +8,13 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^3.0.6", + "vscode-css-languageservice": "^3.0.8", "vscode-emmet-helper": "1.2.1", - "vscode-html-languageservice": "^2.0.17-next.3", - "vscode-languageserver": "4.0.0-next.4", - "vscode-languageserver-types": "^3.6.0-next.1", - "vscode-nls": "^3.2.1", - "vscode-uri": "^1.0.1" + "vscode-html-languageservice": "^2.1.1", + "vscode-languageserver": "^4.0.0", + "vscode-languageserver-types": "^3.6.1", + "vscode-nls": "^3.2.2", + "vscode-uri": "^1.0.3" }, "devDependencies": { "@types/mocha": "2.2.33", diff --git a/extensions/html/server/src/htmlServerMain.ts b/extensions/html/server/src/htmlServerMain.ts index b7e9e502420..c6c20bf78df 100644 --- a/extensions/html/server/src/htmlServerMain.ts +++ b/extensions/html/server/src/htmlServerMain.ts @@ -4,14 +4,15 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, RequestType, DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, Position, CompletionTriggerKind } from 'vscode-languageserver'; +import { + createConnection, IConnection, TextDocuments, InitializeParams, InitializeResult, RequestType, + DocumentRangeFormattingRequest, Disposable, DocumentSelector, TextDocumentPositionParams, ServerCapabilities, + Position, CompletionTriggerKind, ConfigurationRequest, ConfigurationParams, DidChangeWorkspaceFoldersNotification, + WorkspaceFolder, DocumentColorRequest, ColorInformation, ColorPresentationRequest +} from 'vscode-languageserver'; import { TextDocument, Diagnostic, DocumentLink, SymbolInformation, CompletionList } from 'vscode-languageserver-types'; import { getLanguageModes, LanguageModes, Settings } from './modes/languageModes'; -import { ConfigurationRequest, ConfigurationParams } from 'vscode-languageserver-protocol/lib/protocol.configuration.proposed'; -import { DocumentColorRequest, ServerCapabilities as CPServerCapabilities, ColorInformation, ColorPresentationRequest } from 'vscode-languageserver-protocol/lib/protocol.colorProvider.proposed'; -import { DidChangeWorkspaceFoldersNotification, WorkspaceFolder } from 'vscode-languageserver-protocol/lib/protocol.workspaceFolders.proposed'; - import { format } from './modes/formatting'; import { pushAll } from './utils/arrays'; import { getDocumentContext } from './utils/documentContext'; @@ -21,6 +22,7 @@ import { doComplete as emmetDoComplete, updateExtensionsPath as updateEmmetExten import { getPathCompletionParticipant } from './modes/pathCompletion'; import { FoldingRangesRequest, FoldingProviderServerCapabilities } from './protocol/foldingProvider.proposed'; +import { getFoldingRegions } from './modes/htmlFolding'; namespace TagCloseRequest { export const type: RequestType = new RequestType('html/tag'); @@ -113,7 +115,7 @@ connection.onInitialize((params: InitializeParams): InitializeResult => { clientDynamicRegisterSupport = hasClientCapability('workspace', 'symbol', 'dynamicRegistration'); scopedSettingsSupport = hasClientCapability('workspace', 'configuration'); workspaceFoldersSupport = hasClientCapability('workspace', 'workspaceFolders'); - let capabilities: ServerCapabilities & CPServerCapabilities & FoldingProviderServerCapabilities = { + let capabilities: ServerCapabilities & FoldingProviderServerCapabilities = { // Tell the client that the server works in FULL text document sync mode textDocumentSync: documents.syncKind, completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: [...emmetTriggerCharacters, '.', ':', '<', '"', '=', '/'] } : undefined, @@ -469,15 +471,11 @@ connection.onRequest(TagCloseRequest.type, params => { }, null, `Error while computing tag close actions for ${params.textDocument.uri}`); }); -connection.onRequest(FoldingRangesRequest.type, params => { +connection.onRequest(FoldingRangesRequest.type, (params, token) => { return runSafe(() => { let document = documents.get(params.textDocument.uri); if (document) { - let mode = languageModes.getMode('html'); - if (mode && mode.getFoldingRanges) { - return mode.getFoldingRanges(document); - } - return null; + return getFoldingRegions(languageModes, document, params.maxRanges, token); } return null; }, null, `Error while computing folding regions for ${params.textDocument.uri}`); diff --git a/extensions/html/server/src/modes/cssMode.ts b/extensions/html/server/src/modes/cssMode.ts index 13f41c01fdc..08f823233d3 100644 --- a/extensions/html/server/src/modes/cssMode.ts +++ b/extensions/html/server/src/modes/cssMode.ts @@ -9,7 +9,7 @@ import { TextDocument, Position, Range } from 'vscode-languageserver-types'; import { getCSSLanguageService, Stylesheet, ICompletionParticipant } from 'vscode-css-languageservice'; import { LanguageMode, Settings } from './languageModes'; import { HTMLDocumentRegions, CSS_STYLE_RULE } from './embeddedSupport'; -import { Color } from 'vscode-languageserver-protocol/lib/protocol.colorProvider.proposed'; +import { Color } from 'vscode-languageserver'; import { extractAbbreviation } from 'vscode-emmet-helper'; export function getCSSMode(documentRegions: LanguageModelCache): LanguageMode { diff --git a/extensions/html/server/src/modes/htmlFolding.ts b/extensions/html/server/src/modes/htmlFolding.ts new file mode 100644 index 00000000000..2a16b020b45 --- /dev/null +++ b/extensions/html/server/src/modes/htmlFolding.ts @@ -0,0 +1,170 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; +import { TextDocument, CancellationToken, Position } from 'vscode-languageserver'; +import { LanguageService as HTMLLanguageService, TokenType, Range } from 'vscode-html-languageservice'; + +import { FoldingRangeType, FoldingRange, FoldingRangeList } from '../protocol/foldingProvider.proposed'; +import { LanguageModes } from './languageModes'; + +export function getFoldingRegions(languageModes: LanguageModes, document: TextDocument, maxRanges: number | undefined, cancellationToken: CancellationToken | null): FoldingRangeList { + let htmlMode = languageModes.getMode('html'); + let range = Range.create(Position.create(0, 0), Position.create(document.lineCount, 0)); + let ranges: FoldingRange[] = []; + if (htmlMode && htmlMode.getFoldingRanges) { + ranges.push(...htmlMode.getFoldingRanges(document, range)); + } + let modeRanges = languageModes.getModesInRange(document, range); + for (let modeRange of modeRanges) { + let mode = modeRange.mode; + if (mode && mode !== htmlMode && mode.getFoldingRanges && !modeRange.attributeValue) { + ranges.push(...mode.getFoldingRanges(document, modeRange)); + } + } + if (maxRanges && ranges.length > maxRanges) { + ranges = limitRanges(ranges, maxRanges); + } + return { ranges }; +} + +function limitRanges(ranges: FoldingRange[], maxRanges: number) { + ranges = ranges.sort((r1, r2) => { + let diff = r1.startLine - r2.startLine; + if (diff === 0) { + diff = r1.endLine - r2.endLine; + } + return diff; + }); + + // compute each range's nesting level in 'nestingLevels'. + // count the number of ranges for each level in 'nestingLevelCounts' + let top: FoldingRange | null = null; + let previous: FoldingRange[] = []; + let nestingLevels: number[] = []; + let nestingLevelCounts: number[] = []; + + let setNestingLevel = (level: number) => { + nestingLevels.push(level); + if (level < 30) { + nestingLevelCounts[level] = (nestingLevelCounts[level] || 0) + 1; + } + }; + + for (let i = 0; i < ranges.length; i++) { + let entry = ranges[i]; + if (!top) { + top = entry; + setNestingLevel(0); + } else { + if (entry.startLine > top.startLine) { + if (entry.endLine <= top.endLine) { + previous.push(top); + top = entry; + setNestingLevel(previous.length); + } else if (entry.startLine > top.startLine) { + do { + top = previous.pop(); + } while (top && entry.startLine > top.endLine); + previous.push(top); + top = entry; + setNestingLevel(previous.length); + } + } + } + } + let entries = 0; + let maxLevel = 0; + for (let i = 0; i < nestingLevels.length; i++) { + let n = nestingLevels[i]; + if (n) { + if (n + entries > maxRanges) { + maxLevel = i; + break; + } + entries += n; + } + } + return ranges.filter((r, index) => (typeof nestingLevels[index] === 'number') && nestingLevels[index] < maxLevel); +} + + +export function getHTMLFoldingRegions(htmlLanguageService: HTMLLanguageService, document: TextDocument, range: Range): FoldingRange[] { + const scanner = htmlLanguageService.createScanner(document.getText()); + let token = scanner.scan(); + let ranges: FoldingRange[] = []; + let stack: FoldingRange[] = []; + let elementNames: string[] = []; + let lastTagName = null; + let prevStart = -1; + + function addRange(range: FoldingRange) { + ranges.push(range); + } + + while (token !== TokenType.EOS) { + switch (token) { + case TokenType.StartTagOpen: { + let startLine = document.positionAt(scanner.getTokenOffset()).line; + let range = { startLine, endLine: startLine }; + stack.push(range); + break; + } + case TokenType.StartTag: { + lastTagName = scanner.getTokenText(); + elementNames.push(lastTagName); + break; + } + case TokenType.EndTag: { + lastTagName = scanner.getTokenText(); + break; + } + case TokenType.EndTagClose: + case TokenType.StartTagSelfClose: { + let name = elementNames.pop(); + let range = stack.pop(); + while (name && name !== lastTagName) { + name = elementNames.pop(); + range = stack.pop(); + } + let line = document.positionAt(scanner.getTokenOffset()).line; + if (range && line > range.startLine + 1 && prevStart !== range.startLine) { + range.endLine = line - 1; + addRange(range); + prevStart = range.startLine; + } + break; + } + case TokenType.Comment: { + let text = scanner.getTokenText(); + let m = text.match(/^\s*#(region\b)|(endregion\b)/); + if (m) { + let line = document.positionAt(scanner.getTokenOffset()).line; + if (m[1]) { // start pattern match + let range = { startLine: line, endLine: line, type: FoldingRangeType.Region }; + stack.push(range); + elementNames.push(''); + } else { + let i = stack.length - 1; + while (i >= 0 && stack[i].type !== FoldingRangeType.Region) { + i--; + } + if (i >= 0) { + let range = stack[i]; + stack.length = i; + if (line > range.startLine && prevStart !== range.startLine) { + range.endLine = line; + addRange(range); + prevStart = range.startLine; + } + } + } + } + break; + } + } + token = scanner.scan(); + } + return ranges; +} \ No newline at end of file diff --git a/extensions/html/server/src/modes/htmlMode.ts b/extensions/html/server/src/modes/htmlMode.ts index aa3fceeeb2d..b09e0c2a17f 100644 --- a/extensions/html/server/src/modes/htmlMode.ts +++ b/extensions/html/server/src/modes/htmlMode.ts @@ -5,11 +5,12 @@ 'use strict'; import { getLanguageModelCache } from '../languageModelCache'; -import { LanguageService as HTMLLanguageService, HTMLDocument, DocumentContext, FormattingOptions, HTMLFormatConfiguration, TokenType } from 'vscode-html-languageservice'; +import { LanguageService as HTMLLanguageService, HTMLDocument, DocumentContext, FormattingOptions, HTMLFormatConfiguration } from 'vscode-html-languageservice'; import { TextDocument, Position, Range } from 'vscode-languageserver-types'; import { LanguageMode, Settings } from './languageModes'; -import { FoldingRangeType, FoldingRange, FoldingRangeList } from '../protocol/foldingProvider.proposed'; +import { FoldingRange } from '../protocol/foldingProvider.proposed'; +import { getHTMLFoldingRegions } from './htmlFolding'; export function getHTMLMode(htmlLanguageService: HTMLLanguageService): LanguageMode { let globalSettings: Settings = {}; @@ -67,78 +68,8 @@ export function getHTMLMode(htmlLanguageService: HTMLLanguageService): LanguageM formatSettings = merge(formatParams, formatSettings); return htmlLanguageService.format(document, range, formatSettings); }, - getFoldingRanges(document: TextDocument): FoldingRangeList { - const scanner = htmlLanguageService.createScanner(document.getText()); - let token = scanner.scan(); - let ranges: FoldingRange[] = []; - let stack: FoldingRange[] = []; - let elementNames: string[] = []; - let lastTagName = null; - let prevStart = -1; - while (token !== TokenType.EOS) { - switch (token) { - case TokenType.StartTagOpen: { - let startLine = document.positionAt(scanner.getTokenOffset()).line; - let range = { startLine, endLine: startLine }; - stack.push(range); - break; - } - case TokenType.StartTag: { - lastTagName = scanner.getTokenText(); - elementNames.push(lastTagName); - break; - } - case TokenType.EndTag: { - lastTagName = scanner.getTokenText(); - break; - } - case TokenType.EndTagClose: - case TokenType.StartTagSelfClose: { - let name = elementNames.pop(); - let range = stack.pop(); - while (name && name !== lastTagName) { - name = elementNames.pop(); - range = stack.pop(); - } - let line = document.positionAt(scanner.getTokenOffset()).line; - if (range && line > range.startLine + 1 && prevStart !== range.startLine) { - range.endLine = line - 1; - ranges.push(range); - prevStart = range.startLine; - } - break; - } - case TokenType.Comment: { - let text = scanner.getTokenText(); - let m = text.match(/^\s*#(region\b)|(endregion\b)/); - if (m) { - let line = document.positionAt(scanner.getTokenOffset()).line; - if (m[1]) { // start pattern match - let range = { startLine: line, endLine: line, type: FoldingRangeType.Region }; - stack.push(range); - elementNames.push(''); - } else { - let i = stack.length - 1; - while (i >= 0 && stack[i].type !== FoldingRangeType.Region) { - i--; - } - if (i >= 0) { - let range = stack[i]; - stack.length = i; - if (line > range.startLine && prevStart !== range.startLine) { - range.endLine = line; - ranges.push(range); - prevStart = range.startLine; - } - } - } - } - break; - } - } - token = scanner.scan(); - } - return { ranges }; + getFoldingRanges(document: TextDocument, range: Range): FoldingRange[] { + return getHTMLFoldingRegions(htmlLanguageService, document, range); }, doAutoClose(document: TextDocument, position: Position) { diff --git a/extensions/html/server/src/modes/languageModes.ts b/extensions/html/server/src/modes/languageModes.ts index 1f527b9b2fa..6378680dbb8 100644 --- a/extensions/html/server/src/modes/languageModes.ts +++ b/extensions/html/server/src/modes/languageModes.ts @@ -9,8 +9,8 @@ import { CompletionItem, Location, SignatureHelp, Definition, TextEdit, TextDocument, Diagnostic, DocumentLink, Range, Hover, DocumentHighlight, CompletionList, Position, FormattingOptions, SymbolInformation } from 'vscode-languageserver-types'; - -import { ColorInformation, ColorPresentation, Color } from 'vscode-languageserver-protocol/lib/protocol.colorProvider.proposed'; +import { ColorInformation, ColorPresentation, Color } from 'vscode-languageserver'; +import { FoldingRange } from '../protocol/foldingProvider.proposed'; import { getLanguageModelCache, LanguageModelCache } from '../languageModelCache'; import { getDocumentRegions, HTMLDocumentRegions } from './embeddedSupport'; @@ -20,8 +20,6 @@ import { getHTMLMode } from './htmlMode'; export { ColorInformation, ColorPresentation, Color }; -import { FoldingRangeList } from '../protocol/foldingProvider.proposed'; - export interface Settings { css?: any; html?: any; @@ -51,7 +49,7 @@ export interface LanguageMode { findDocumentColors?: (document: TextDocument) => ColorInformation[]; getColorPresentations?: (document: TextDocument, color: Color, range: Range) => ColorPresentation[]; doAutoClose?: (document: TextDocument, position: Position) => string | null; - getFoldingRanges?: (document: TextDocument) => FoldingRangeList | null; + getFoldingRanges?: (document: TextDocument, range: Range) => FoldingRange[]; onDocumentRemoved(document: TextDocument): void; dispose(): void; } diff --git a/extensions/html/server/src/modes/pathCompletion.ts b/extensions/html/server/src/modes/pathCompletion.ts index 46b5d34fd91..9b2ccbbd8ca 100644 --- a/extensions/html/server/src/modes/pathCompletion.ts +++ b/extensions/html/server/src/modes/pathCompletion.ts @@ -5,17 +5,17 @@ 'use strict'; import { TextDocument, CompletionList, CompletionItemKind, CompletionItem, TextEdit, Range, Position } from 'vscode-languageserver-types'; -import { Proposed } from 'vscode-languageserver-protocol'; +import { WorkspaceFolder } from 'vscode-languageserver'; import * as path from 'path'; import * as fs from 'fs'; import URI from 'vscode-uri'; -import { ICompletionParticipant } from 'vscode-html-languageservice/lib/htmlLanguageService'; +import { ICompletionParticipant } from 'vscode-html-languageservice'; import { startsWith } from '../utils/strings'; import { contains } from '../utils/arrays'; export function getPathCompletionParticipant( document: TextDocument, - workspaceFolders: Proposed.WorkspaceFolder[] | undefined, + workspaceFolders: WorkspaceFolder[] | undefined, result: CompletionList ): ICompletionParticipant { return { @@ -104,7 +104,7 @@ const isDir = (p: string) => { return fs.statSync(p).isDirectory(); }; -function resolveWorkspaceRoot(activeDoc: TextDocument, workspaceFolders: Proposed.WorkspaceFolder[]): string | undefined { +function resolveWorkspaceRoot(activeDoc: TextDocument, workspaceFolders: WorkspaceFolder[]): string | undefined { for (let i = 0; i < workspaceFolders.length; i++) { if (startsWith(activeDoc.uri, workspaceFolders[i].uri)) { return path.resolve(URI.parse(workspaceFolders[i].uri).fsPath); diff --git a/extensions/html/server/src/test/completions.test.ts b/extensions/html/server/src/test/completions.test.ts index 1777c039cd5..645727c8c6f 100644 --- a/extensions/html/server/src/test/completions.test.ts +++ b/extensions/html/server/src/test/completions.test.ts @@ -12,7 +12,7 @@ import { TextDocument, CompletionList, CompletionItemKind, } from 'vscode-langua import { getLanguageModes } from '../modes/languageModes'; import { applyEdits } from '../utils/edits'; import { getPathCompletionParticipant } from '../modes/pathCompletion'; -import { Proposed } from 'vscode-languageserver-protocol'; +import { WorkspaceFolder } from 'vscode-languageserver'; export interface ItemDescription { label: string; @@ -49,7 +49,7 @@ suite('Completions', () => { const testUri = 'test://test/test.html'; - function assertCompletions(value: string, expected: { count?: number, items?: ItemDescription[] }, uri = testUri, workspaceFolders?: Proposed.WorkspaceFolder[]): void { + function assertCompletions(value: string, expected: { count?: number, items?: ItemDescription[] }, uri = testUri, workspaceFolders?: WorkspaceFolder[]): void { let offset = value.indexOf('|'); value = value.substr(0, offset) + value.substr(offset + 1); diff --git a/extensions/html/server/src/test/folding.test.ts b/extensions/html/server/src/test/folding.test.ts new file mode 100644 index 00000000000..45407529efb --- /dev/null +++ b/extensions/html/server/src/test/folding.test.ts @@ -0,0 +1,140 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'mocha'; +import * as assert from 'assert'; +import { TextDocument } from 'vscode-languageserver'; +import { getFoldingRegions } from '../modes/htmlFolding'; +import { getLanguageModes } from '../modes/languageModes'; + +interface ExpectedIndentRange { + startLine: number; + endLine: number; + type?: string; +} + +function assertRanges(lines: string[], expected: ExpectedIndentRange[], nRanges?: number): void { + let document = TextDocument.create('test://foo/bar.json', 'json', 1, lines.join('\n')); + let languageModes = getLanguageModes({ css: true, javascript: true }); + let actual = getFoldingRegions(languageModes, document, nRanges, null)!.ranges; + + let actualRanges = []; + for (let i = 0; i < actual.length; i++) { + actualRanges[i] = r(actual[i].startLine, actual[i].endLine, actual[i].type); + } + actualRanges = actualRanges.sort((r1, r2) => r1.startLine - r2.startLine); + assert.deepEqual(actualRanges, expected); +} + +function r(startLine: number, endLine: number, type?: string): ExpectedIndentRange { + return { startLine, endLine, type }; +} + +suite('Object Folding', () => { + test('Fold one level', () => { + let input = [ + /*0*/'', + /*1*/'Hello', + /*2*/'' + ]; + assertRanges(input, [r(0, 1)]); + }); + + test('Fold two level', () => { + let input = [ + /*0*/'', + /*1*/'', + /*2*/'Hello', + /*3*/'', + /*4*/'' + ]; + assertRanges(input, [r(0, 3), r(1, 2)]); + }); + + test('Fold siblings', () => { + let input = [ + /*0*/'', + /*1*/'', + /*2*/'Head', + /*3*/'', + /*4*/'', + /*5*/'Body', + /*6*/'', + /*7*/'' + ]; + assertRanges(input, [r(0, 6), r(1, 2), r(4, 5)]); + }); + + // test('Fold self-closing tags', () => { + // let input = [ + // /*0*/'
', + // /*1*/'', + // /*2*/'', + // /*4*/'', + // /*5*/'Body', + // /*6*/'', + // /*7*/'' + // ]; + // assertRanges(input, [r(0, 6), r(1, 2), r(4, 5)]); + // }); + + // test('Fold commment', () => { + // let input = [ + // /*0*/'/*', + // /*1*/' multi line', + // /*2*/'*/', + // ]; + // assertRanges(input, [r(0, 2, 'comment')]); + // }); + + // test('Fold regions', () => { + // let input = [ + // /*0*/'// #region', + // /*1*/'{', + // /*2*/'}', + // /*3*/'// #endregion', + // ]; + // assertRanges(input, [r(0, 3, 'region')]); + // }); + + // test('Test limit', () => { + // let input = [ + // /* 0*/'[', + // /* 1*/' [', + // /* 2*/' [', + // /* 3*/' ', + // /* 4*/' ],', + // /* 5*/' [', + // /* 6*/' [', + // /* 7*/' ', + // /* 8*/' ],', + // /* 9*/' [', + // /*10*/' ', + // /*11*/' ],', + // /*12*/' ],', + // /*13*/' [', + // /*14*/' ', + // /*15*/' ],', + // /*16*/' [', + // /*17*/' ', + // /*18*/' ]', + // /*19*/' ]', + // /*20*/']', + // ]; + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array'), r(2, 3, 'array'), r(5, 11, 'array'), r(6, 7, 'array'), r(9, 10, 'array'), r(13, 14, 'array'), r(16, 17, 'array')], void 0); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array'), r(2, 3, 'array'), r(5, 11, 'array'), r(6, 7, 'array'), r(9, 10, 'array'), r(13, 14, 'array'), r(16, 17, 'array')], 8); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array'), r(2, 3, 'array'), r(5, 11, 'array'), r(13, 14, 'array'), r(16, 17, 'array')], 7); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array'), r(2, 3, 'array'), r(5, 11, 'array'), r(13, 14, 'array'), r(16, 17, 'array')], 6); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array')], 5); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array')], 4); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array')], 3); + // assertRanges(input, [r(0, 19, 'array'), r(1, 18, 'array')], 2); + // assertRanges(input, [r(0, 19, 'array')], 1); + // }); + +}); diff --git a/extensions/html/server/src/utils/documentContext.ts b/extensions/html/server/src/utils/documentContext.ts index fb56e1d882c..573e194dc1b 100644 --- a/extensions/html/server/src/utils/documentContext.ts +++ b/extensions/html/server/src/utils/documentContext.ts @@ -7,7 +7,7 @@ import { DocumentContext } from 'vscode-html-languageservice'; import { endsWith, startsWith } from '../utils/strings'; import * as url from 'url'; -import { WorkspaceFolder } from 'vscode-languageserver-protocol/lib/protocol.workspaceFolders.proposed'; +import { WorkspaceFolder } from 'vscode-languageserver'; export function getDocumentContext(documentUri: string, workspaceFolders: WorkspaceFolder[]): DocumentContext { function getRootFolder(): string | undefined { diff --git a/extensions/html/server/yarn.lock b/extensions/html/server/yarn.lock index c8579e8cc16..77fc6525c95 100644 --- a/extensions/html/server/yarn.lock +++ b/extensions/html/server/yarn.lock @@ -18,12 +18,12 @@ jsonc-parser@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-1.0.0.tgz#ddcc864ae708e60a7a6dd36daea00172fa8d9272" -vscode-css-languageservice@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.6.tgz#0e9230347040ba0161fba941885195215ec9be40" +vscode-css-languageservice@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-3.0.8.tgz#dc27a2f6eefd191bc603be6b9c0a59232a4c2b9f" dependencies: - vscode-languageserver-types "^3.6.0-next.1" - vscode-nls "^2.0.1" + vscode-languageserver-types "^3.6.1" + vscode-nls "^3.2.1" vscode-emmet-helper@1.2.1: version "1.2.1" @@ -33,44 +33,52 @@ vscode-emmet-helper@1.2.1: jsonc-parser "^1.0.0" vscode-languageserver-types "^3.6.0-next.1" -vscode-html-languageservice@^2.0.17-next.3: - version "2.0.17-next.3" - resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.0.17-next.3.tgz#dd5e90fac3073ffc2c624bd26daa9f27adfa50eb" +vscode-html-languageservice@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-2.1.1.tgz#11a4e307f3a983d566313039f99bb37656e86cce" dependencies: - vscode-languageserver-types "^3.6.0-next.1" - vscode-nls "^2.0.2" - vscode-uri "^1.0.1" + vscode-languageserver-types "^3.6.1" + vscode-nls "^3.2.1" + vscode-uri "^1.0.3" -vscode-jsonrpc@^3.6.0-next.1: - version "3.6.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0-next.1.tgz#3cb463dffe5842d6aec16718ca9252708cd6aabe" +vscode-jsonrpc@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageserver-protocol@^3.6.0-next.5: - version "3.6.0-next.5" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0-next.5.tgz#ed2ec2db759826f753c0a13977dfb2bedc4d31b3" +vscode-languageserver-protocol@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0.tgz#579642cdcccf74b0cd771c33daa3239acb40d040" dependencies: - vscode-jsonrpc "^3.6.0-next.1" - vscode-languageserver-types "^3.6.0-next.1" + vscode-jsonrpc "^3.6.0" + vscode-languageserver-types "^3.6.0" + +vscode-languageserver-types@^3.6.0, vscode-languageserver-types@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" vscode-languageserver-types@^3.6.0-next.1: version "3.6.0-next.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0-next.1.tgz#98e488d3f87b666b4ee1a3d89f0023e246d358f3" -vscode-languageserver@4.0.0-next.4: - version "4.0.0-next.4" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-4.0.0-next.4.tgz#162440b15bedaab07e1676f046e4d9b8578b3d92" +vscode-languageserver@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-4.0.0.tgz#8b792f0d6d10acfe363d02371ed4ce53d08af88a" dependencies: - vscode-languageserver-protocol "^3.6.0-next.5" + vscode-languageserver-protocol "^3.6.0" vscode-uri "^1.0.1" -vscode-nls@^2.0.1, vscode-nls@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-2.0.2.tgz#808522380844b8ad153499af5c3b03921aea02da" - vscode-nls@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.2.tgz#3817eca5b985c2393de325197cf4e15eb2aa5350" + vscode-uri@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.1.tgz#11a86befeac3c4aa3ec08623651a3c81a6d0bbc8" + +vscode-uri@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.3.tgz#631bdbf716dccab0e65291a8dc25c23232085a52" diff --git a/extensions/html/yarn.lock b/extensions/html/yarn.lock index 926601edb29..ee2790b3586 100644 --- a/extensions/html/yarn.lock +++ b/extensions/html/yarn.lock @@ -34,30 +34,30 @@ vscode-extension-telemetry@0.0.15: dependencies: applicationinsights "1.0.1" -vscode-jsonrpc@^3.6.0-next.1: - version "3.6.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0-next.1.tgz#3cb463dffe5842d6aec16718ca9252708cd6aabe" +vscode-jsonrpc@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageclient@4.0.0-next.9: - version "4.0.0-next.9" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-4.0.0-next.9.tgz#2a06568f46ee9de3490f85e227d3740a21a03d3a" +vscode-languageclient@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-4.0.0.tgz#635f5bfbcfa1385dae489b394857f1db8b459a7d" dependencies: - vscode-languageserver-protocol "^3.6.0-next.5" + vscode-languageserver-protocol "^3.6.0" -vscode-languageserver-protocol@^3.6.0-next.5: - version "3.6.0-next.5" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0-next.5.tgz#ed2ec2db759826f753c0a13977dfb2bedc4d31b3" +vscode-languageserver-protocol@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0.tgz#579642cdcccf74b0cd771c33daa3239acb40d040" dependencies: - vscode-jsonrpc "^3.6.0-next.1" - vscode-languageserver-types "^3.6.0-next.1" + vscode-jsonrpc "^3.6.0" + vscode-languageserver-types "^3.6.0" -vscode-languageserver-types@^3.6.0-next.1: - version "3.6.0-next.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.0-next.1.tgz#98e488d3f87b666b4ee1a3d89f0023e246d358f3" +vscode-languageserver-types@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" -vscode-nls@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.1.tgz#b1f3e04e8a94a715d5a7bcbc8339c51e6d74ca51" +vscode-nls@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-3.2.2.tgz#3817eca5b985c2393de325197cf4e15eb2aa5350" zone.js@0.7.6: version "0.7.6"