Skip to content

Commit 79105e5

Browse files
committed
Formatting valid json content is causing an invalid json. Fixes #33
1 parent c75fa3c commit 79105e5

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

src/impl/format.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55
'use strict';
66

7-
import { Range, FormattingOptions, Edit, SyntaxKind, ScanError} from '../main';
7+
import { Range, FormattingOptions, Edit, SyntaxKind, ScanError } from '../main';
88
import { createScanner } from './scanner';
99

1010
export function format(documentText: string, range: Range | undefined, options: FormattingOptions): Edit[] {
@@ -81,12 +81,14 @@ export function format(documentText: string, range: Range | undefined, options:
8181
let secondToken = scanNext();
8282

8383
let replaceContent = '';
84+
let needsLineBreak = false;
8485
while (!lineBreak && (secondToken === SyntaxKind.LineCommentTrivia || secondToken === SyntaxKind.BlockCommentTrivia)) {
8586
// comments on the same line: keep them on the same line, but ignore them otherwise
8687
let commentTokenStart = scanner.getTokenOffset() + formatTextStart;
8788
addEdit(' ', firstTokenEnd, commentTokenStart);
8889
firstTokenEnd = scanner.getTokenOffset() + scanner.getTokenLength() + formatTextStart;
89-
replaceContent = secondToken === SyntaxKind.LineCommentTrivia ? newLineAndIndent() : '';
90+
needsLineBreak = secondToken === SyntaxKind.LineCommentTrivia;
91+
replaceContent = needsLineBreak ? newLineAndIndent() : '';
9092
secondToken = scanNext();
9193
}
9294

@@ -114,17 +116,21 @@ export function format(documentText: string, range: Range | undefined, options:
114116
case SyntaxKind.BlockCommentTrivia:
115117
if (lineBreak) {
116118
replaceContent = newLineAndIndent();
117-
} else {
119+
} else if (!needsLineBreak) {
118120
// symbol following comment on the same line: keep on same line, separate with ' '
119121
replaceContent = ' ';
120122
}
121123
break;
122124
case SyntaxKind.ColonToken:
123-
replaceContent = ' ';
125+
if (!needsLineBreak) {
126+
replaceContent = ' ';
127+
}
124128
break;
125129
case SyntaxKind.StringLiteral:
126130
if (secondToken === SyntaxKind.ColonToken) {
127-
replaceContent = '';
131+
if (!needsLineBreak) {
132+
replaceContent = '';
133+
}
128134
break;
129135
}
130136
// fall through
@@ -135,7 +141,9 @@ export function format(documentText: string, range: Range | undefined, options:
135141
case SyntaxKind.CloseBraceToken:
136142
case SyntaxKind.CloseBracketToken:
137143
if (secondToken === SyntaxKind.LineCommentTrivia || secondToken === SyntaxKind.BlockCommentTrivia) {
138-
replaceContent = ' ';
144+
if (!needsLineBreak) {
145+
replaceContent = ' ';
146+
}
139147
} else if (secondToken !== SyntaxKind.CommaToken && secondToken !== SyntaxKind.EOF) {
140148
hasError = true;
141149
}

src/test/format.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,28 @@ suite('JSON - formatter', () => {
471471

472472
format(content, expected);
473473
});
474+
475+
test('line comment bug 33 ', () => {
476+
var content = [
477+
'{"settings": // This is some text',
478+
'{',
479+
'"foo": 1',
480+
'}',
481+
'}'
482+
].join('\n');
483+
484+
var expected = [
485+
'{',
486+
' "settings": // This is some text',
487+
' {',
488+
' "foo": 1',
489+
' }',
490+
'}'
491+
].join('\n');
492+
493+
format(content, expected);
494+
});
495+
474496
test('random content', () => {
475497
var content = [
476498
'a 1 b 1 3 true'

0 commit comments

Comments
 (0)