From fc59387aba1560fb83af51086fcda37156b7564e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 22 Apr 2016 15:57:04 +0200 Subject: [PATCH] fixes #5269: [json] "Format Code" folds braces into preceding comments. --- extensions/json/server/src/jsonFormatter.ts | 4 ++- .../json/server/src/test/formatter.test.ts | 27 +++++++++++++++++++ .../json/common/features/jsonFormatter.ts | 3 ++- .../json/test/common/formatter.test.ts | 26 ++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/extensions/json/server/src/jsonFormatter.ts b/extensions/json/server/src/jsonFormatter.ts index b5228dd2890..f64f79c7b51 100644 --- a/extensions/json/server/src/jsonFormatter.ts +++ b/extensions/json/server/src/jsonFormatter.ts @@ -74,14 +74,16 @@ export function format(document: ITextDocument, range: Range, options: Formattin let firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + rangeOffset; let secondToken = scanNext(); + let replaceContent = ''; while (!lineBreak && (secondToken === Json.SyntaxKind.LineCommentTrivia || secondToken === Json.SyntaxKind.BlockCommentTrivia)) { // comments on the same line: keep them on the same line, but ignore them otherwise let commentTokenStart = scanner.getTokenOffset() + rangeOffset; addEdit(' ', firstTokenEnd, commentTokenStart); firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + rangeOffset; + replaceContent = secondToken === Json.SyntaxKind.LineCommentTrivia ? newLineAndIndent() : ''; secondToken = scanNext(); } - let replaceContent = ''; + if (secondToken === Json.SyntaxKind.CloseBraceToken) { if (firstToken !== Json.SyntaxKind.OpenBraceToken) { indentLevel--; diff --git a/extensions/json/server/src/test/formatter.test.ts b/extensions/json/server/src/test/formatter.test.ts index 710089115b3..5254ee88b57 100644 --- a/extensions/json/server/src/test/formatter.test.ts +++ b/extensions/json/server/src/test/formatter.test.ts @@ -240,6 +240,19 @@ suite('JSON Formatter', () => { format(content, expected); }); + test('single line comment on same line 2', () => { + var content = [ + '{ //comment', + '}' + ].join('\n'); + + var expected = [ + '{ //comment', + '}' + ].join('\n'); + + format(content, expected); + }); test('block comment on same line', () => { var content = [ '{ "a": {}, /*comment*/ ', @@ -295,6 +308,20 @@ suite('JSON Formatter', () => { format(content, expected); }); + + test('multiple mixed comments on same line', () => { + var content = [ + '[ /*comment*/ /*comment*/ // comment ', + ']' + ].join('\n'); + + var expected = [ + '[ /*comment*/ /*comment*/ // comment ', + ']' + ].join('\n'); + + format(content, expected); + }); test('range', () => { var content = [ diff --git a/src/vs/languages/json/common/features/jsonFormatter.ts b/src/vs/languages/json/common/features/jsonFormatter.ts index f7c5a44b640..22afdd07983 100644 --- a/src/vs/languages/json/common/features/jsonFormatter.ts +++ b/src/vs/languages/json/common/features/jsonFormatter.ts @@ -66,14 +66,15 @@ export function format(model: EditorCommon.IMirrorModel, range: EditorCommon.IRa var firstTokenEnd = model.getPositionFromOffset(scanner.getTokenOffset() + scanner.getTokenLength() + rangeOffset); var secondToken = scanNext(); + let replaceContent = ''; while (!lineBreak && (secondToken === Json.SyntaxKind.LineCommentTrivia || secondToken === Json.SyntaxKind.BlockCommentTrivia)) { // comments on the same line: keep them on the same line, but ignore them otherwise var commentTokenStart = model.getPositionFromOffset(scanner.getTokenOffset() + rangeOffset); addEdit(' ', { startLineNumber: firstTokenEnd.lineNumber, startColumn: firstTokenEnd.column, endLineNumber: commentTokenStart.lineNumber, endColumn: commentTokenStart.column }); firstTokenEnd = model.getPositionFromOffset(scanner.getTokenOffset() + scanner.getTokenLength() + rangeOffset); + replaceContent = secondToken === Json.SyntaxKind.LineCommentTrivia ? newLineAndIndent() : ''; secondToken = scanNext(); } - var replaceContent = ''; if (secondToken === Json.SyntaxKind.CloseBraceToken) { if (firstToken !== Json.SyntaxKind.OpenBraceToken) { indentLevel--; diff --git a/src/vs/languages/json/test/common/formatter.test.ts b/src/vs/languages/json/test/common/formatter.test.ts index 507946e4b4b..af2fae7f8a5 100644 --- a/src/vs/languages/json/test/common/formatter.test.ts +++ b/src/vs/languages/json/test/common/formatter.test.ts @@ -253,6 +253,19 @@ suite('JSON - formatter', () => { format(content, expected); }); + test('single line comment on same line 2', () => { + var content = [ + '{ //comment', + '}' + ].join('\n'); + + var expected = [ + '{ //comment', + '}' + ].join('\n'); + + format(content, expected); + }); test('block comment on same line', () => { var content = [ '{ "a": {}, /*comment*/ ', @@ -308,6 +321,19 @@ suite('JSON - formatter', () => { format(content, expected); }); + test('multiple mixed comments on same line', () => { + var content = [ + '[ /*comment*/ /*comment*/ // comment ', + ']' + ].join('\n'); + + var expected = [ + '[ /*comment*/ /*comment*/ // comment ', + ']' + ].join('\n'); + + format(content, expected); + }); test('range', () => { var content = [