Skip to content

Commit a15ea78

Browse files
committed
Fix leading line separator calculation and JSX bug
1 parent a2e9e69 commit a15ea78

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

src/compiler/emitter.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2365,16 +2365,10 @@ namespace ts {
23652365

23662366
function emitParenthesizedExpression(node: ParenthesizedExpression) {
23672367
const openParenPos = emitTokenWithComment(SyntaxKind.OpenParenToken, node.pos, writePunctuation, node);
2368-
const leadingNewlines = preserveSourceNewlines && getLeadingLineTerminatorCount(node, [node.expression], ListFormat.None);
2369-
if (leadingNewlines) {
2370-
writeLinesAndIndent(leadingNewlines, /*writeLinesIfNotIndenting*/ false);
2371-
}
2368+
const indented = writeLineSeparatorsAndIndentBefore(node.expression, node);
23722369
emitExpression(node.expression);
2373-
const trailingNewlines = preserveSourceNewlines && getClosingLineTerminatorCount(node, [node.expression], ListFormat.None);
2374-
if (trailingNewlines) {
2375-
writeLine(trailingNewlines);
2376-
}
2377-
decreaseIndentIf(leadingNewlines);
2370+
writeLineSeparatorsAfter(node.expression, node);
2371+
decreaseIndentIf(indented);
23782372
emitTokenWithComment(SyntaxKind.CloseParenToken, node.expression ? node.expression.end : openParenPos, writePunctuation, node);
23792373
}
23802374

@@ -3292,12 +3286,15 @@ namespace ts {
32923286
writePunctuation("<");
32933287

32943288
if (isJsxOpeningElement(node)) {
3289+
const indented = writeLineSeparatorsAndIndentBefore(node.tagName, node);
32953290
emitJsxTagName(node.tagName);
32963291
emitTypeArguments(node, node.typeArguments);
32973292
if (node.attributes.properties && node.attributes.properties.length > 0) {
32983293
writeSpace();
32993294
}
33003295
emit(node.attributes);
3296+
writeLineSeparatorsAfter(node.attributes, node);
3297+
decreaseIndentIf(indented);
33013298
}
33023299

33033300
writePunctuation(">");
@@ -4399,6 +4396,21 @@ namespace ts {
43994396
return lines;
44004397
}
44014398

4399+
function writeLineSeparatorsAndIndentBefore(node: Node, parent: Node): boolean {
4400+
const leadingNewlines = preserveSourceNewlines && getLeadingLineTerminatorCount(parent, [node], ListFormat.None);
4401+
if (leadingNewlines) {
4402+
writeLinesAndIndent(leadingNewlines, /*writeLinesIfNotIndenting*/ false);
4403+
}
4404+
return !!leadingNewlines;
4405+
}
4406+
4407+
function writeLineSeparatorsAfter(node: Node, parent: Node) {
4408+
const trailingNewlines = preserveSourceNewlines && getClosingLineTerminatorCount(parent, [node], ListFormat.None);
4409+
if (trailingNewlines) {
4410+
writeLine(trailingNewlines);
4411+
}
4412+
}
4413+
44024414
function synthesizedNodeStartsOnNewLine(node: Node, format: ListFormat) {
44034415
if (nodeIsSynthesized(node)) {
44044416
const startsOnNewLine = getStartsOnNewLine(node);

src/compiler/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4779,7 +4779,7 @@ namespace ts {
47794779
export function getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter(pos: number, stopPos: number, sourceFile: SourceFile, includeComments?: boolean) {
47804780
const startPos = skipTrivia(sourceFile.text, pos, /*stopAfterLineBreak*/ false, includeComments);
47814781
const prevPos = getPreviousNonWhitespacePosition(startPos, stopPos, sourceFile);
4782-
return getLinesBetweenPositions(sourceFile, prevPos || 0, startPos);
4782+
return getLinesBetweenPositions(sourceFile, prevPos ?? stopPos, startPos);
47834783
}
47844784

47854785
export function getLinesBetweenPositionAndNextNonWhitespaceCharacter(pos: number, stopPos: number, sourceFile: SourceFile, includeComments?: boolean) {

0 commit comments

Comments
 (0)