diff --git a/extensions/html/server/src/htmlServerMain.ts b/extensions/html/server/src/htmlServerMain.ts index cedcf6fb288..4d66f8e4303 100644 --- a/extensions/html/server/src/htmlServerMain.ts +++ b/extensions/html/server/src/htmlServerMain.ts @@ -208,7 +208,6 @@ connection.onDocumentRangeFormatting(formatParams => { ranges.forEach(r => { let mode = r.mode; if (mode && mode.format && enabledModes[mode.getId()] && !r.attributeValue) { - console.log(mode.getId()); let edits = mode.format(document, r, formatParams.options); pushAll(result, edits); } diff --git a/extensions/html/server/src/modes/javascriptMode.ts b/extensions/html/server/src/modes/javascriptMode.ts index d7c73b07fa1..54811dddfe0 100644 --- a/extensions/html/server/src/modes/javascriptMode.ts +++ b/extensions/html/server/src/modes/javascriptMode.ts @@ -7,7 +7,7 @@ import { LanguageModelCache, getLanguageModelCache } from '../languageModelCache'; import { SymbolInformation, SymbolKind, CompletionItem, Location, SignatureHelp, SignatureInformation, ParameterInformation, Definition, TextEdit, TextDocument, Diagnostic, DiagnosticSeverity, Range, CompletionItemKind, Hover, MarkedString, DocumentHighlight, DocumentHighlightKind, CompletionList, Position, FormattingOptions } from 'vscode-languageserver-types'; import { LanguageMode } from './languageModes'; -import { getWordAtText, startsWith } from '../utils/strings'; +import { getWordAtText, startsWith, isWhitespaceOnly, repeat } from '../utils/strings'; import { HTMLDocumentRegions } from './embeddedSupport'; import * as ts from 'typescript'; @@ -235,10 +235,15 @@ export function getJavascriptMode(documentRegions: LanguageModelCache { test('HTML & Scripts', function (): any { assertFormat('', '\n\n\n \n\n\n'); assertFormat('', '\n\n\n \n\n\n'); - assertFormat('', '\n\n\n \n\n\n'); - assertFormat('\n ', '\n\n\n \n\n\n'); - assertFormat('\n ', '\n\n\n \n\n\n'); + assertFormat('', '\n\n\n \n\n\n'); + assertFormat('\n ', '\n\n\n \n\n\n'); + assertFormat('\n ', '\n\n\n \n\n\n'); - assertFormat('\n ||', '\n '); - assertFormat('\n ', '\n '); + assertFormat('\n ||', '\n '); + assertFormat('\n ', '\n '); + }); + + test('Script end tag', function (): any { + assertFormat('\n\n ', '\n\n\n \n\n\n'); }); test('HTML & Multiple Scripts', function (): any { @@ -94,7 +98,13 @@ function pushAll(to: T[], from: T[]) { function applyEdits(document: TextDocument, edits: TextEdit[]): string { let text = document.getText(); - let sortedEdits = edits.sort((a, b) => document.offsetAt(b.range.start) - document.offsetAt(a.range.start)); + let sortedEdits = edits.sort((a, b) => { + let startDiff = document.offsetAt(b.range.start) - document.offsetAt(a.range.start); + if (startDiff === 0) { + return document.offsetAt(b.range.end) - document.offsetAt(a.range.end); + } + return startDiff; + }); let lastOffset = text.length; sortedEdits.forEach(e => { let startOffset = document.offsetAt(e.range.start); diff --git a/extensions/html/server/src/utils/strings.ts b/extensions/html/server/src/utils/strings.ts index c4d9536c4db..f04a5744fab 100644 --- a/extensions/html/server/src/utils/strings.ts +++ b/extensions/html/server/src/utils/strings.ts @@ -41,6 +41,22 @@ export function startsWith(haystack: string, needle: string): boolean { return true; } +export function repeat(value: string, count: number) { + var s = ''; + while (count > 0) { + if ((count & 1) === 1) { + s += value; + } + value += value; + count = count >>> 1; + } + return s; +} + +export function isWhitespaceOnly(str: string) { + return /^\s*$/.test(str); +} + const CR = '\r'.charCodeAt(0); const NL = '\n'.charCodeAt(0);