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);