Skip to content

Commit 4d74f67

Browse files
Merge pull request microsoft#28888 from Microsoft/numericPropertyAccess
Avoid adding a dot when comment a property acccess's expression has trailing comments
2 parents 22d47d4 + caa7441 commit 4d74f67

11 files changed

+671
-28
lines changed

src/compiler/emitter.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,11 +1651,17 @@ namespace ts {
16511651
function emitPropertyAccessExpression(node: PropertyAccessExpression) {
16521652
let indentBeforeDot = false;
16531653
let indentAfterDot = false;
1654+
const dotRangeFirstCommentStart = skipTrivia(
1655+
currentSourceFile!.text,
1656+
node.expression.end,
1657+
/*stopAfterLineBreak*/ false,
1658+
/*stopAtComments*/ true
1659+
);
1660+
const dotRangeStart = skipTrivia(currentSourceFile!.text, dotRangeFirstCommentStart);
1661+
const dotRangeEnd = dotRangeStart + 1;
16541662
if (!(getEmitFlags(node) & EmitFlags.NoIndentation)) {
1655-
const dotRangeStart = node.expression.end;
1656-
const dotRangeEnd = skipTrivia(currentSourceFile!.text, node.expression.end) + 1;
16571663
const dotToken = createToken(SyntaxKind.DotToken);
1658-
dotToken.pos = dotRangeStart;
1664+
dotToken.pos = node.expression.end;
16591665
dotToken.end = dotRangeEnd;
16601666
indentBeforeDot = needsIndentation(node, node.expression, dotToken);
16611667
indentAfterDot = needsIndentation(node, dotToken, node.name);
@@ -1664,7 +1670,8 @@ namespace ts {
16641670
emitExpression(node.expression);
16651671
increaseIndentIf(indentBeforeDot, /*writeSpaceIfNotIndenting*/ false);
16661672

1667-
const shouldEmitDotDot = !indentBeforeDot && needsDotDotForPropertyAccess(node.expression);
1673+
const dotHasCommentTrivia = dotRangeFirstCommentStart !== dotRangeStart;
1674+
const shouldEmitDotDot = !indentBeforeDot && needsDotDotForPropertyAccess(node.expression, dotHasCommentTrivia);
16681675
if (shouldEmitDotDot) {
16691676
writePunctuation(".");
16701677
}
@@ -1677,13 +1684,15 @@ namespace ts {
16771684

16781685
// 1..toString is a valid property access, emit a dot after the literal
16791686
// Also emit a dot if expression is a integer const enum value - it will appear in generated code as numeric literal
1680-
function needsDotDotForPropertyAccess(expression: Expression) {
1687+
function needsDotDotForPropertyAccess(expression: Expression, dotHasTrivia: boolean) {
16811688
expression = skipPartiallyEmittedExpressions(expression);
16821689
if (isNumericLiteral(expression)) {
16831690
// check if numeric literal is a decimal literal that was originally written with a dot
16841691
const text = getLiteralTextOfNode(<LiteralExpression>expression, /*neverAsciiEscape*/ true);
1685-
return !expression.numericLiteralFlags
1686-
&& !stringContains(text, tokenToString(SyntaxKind.DotToken)!);
1692+
// If he number will be printed verbatim and it doesn't already contain a dot, add one
1693+
// if the expression doesn't have any comments that will be emitted.
1694+
return !expression.numericLiteralFlags && !stringContains(text, tokenToString(SyntaxKind.DotToken)!) &&
1695+
(!dotHasTrivia || printerOptions.removeComments);
16871696
}
16881697
else if (isPropertyAccessExpression(expression) || isElementAccessExpression(expression)) {
16891698
// check if constant enum value is integer

tests/baselines/reference/numericLiteralsWithTrailingDecimalPoints01.errors.txt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ tests/cases/compiler/numericLiteralsWithTrailingDecimalPoints01.ts(9,24): error
1212
!!! error TS1351: An identifier or keyword cannot immediately follow a numeric literal.
1313
1.+2.0 + 3. ;
1414

15-
// Preserve whitespace where important for JS compatibility
15+
// Preserve whitespace and comments where important for JS compatibility
1616
var i: number = 1;
17-
var test1 = i.toString();
17+
var test1 = i.toString();
1818
var test2 = 2.toString();
1919
~~~~~~~~
2020
!!! error TS1351: An identifier or keyword cannot immediately follow a numeric literal.
@@ -24,10 +24,27 @@ tests/cases/compiler/numericLiteralsWithTrailingDecimalPoints01.ts(9,24): error
2424
!!! error TS1109: Expression expected.
2525
var test3 = 3 .toString();
2626
var test4 = 3 .toString();
27-
var test5 = 3 .toString();
27+
var test5 = 3 .toString();
2828
var test6 = 3.['toString']();
2929
var test7 = 3
3030
.toString();
3131
var test8 = new Number(4).toString();
32-
var test9 = 3. + 3.
32+
var test9 = 3. + 3.;
33+
var test10 = 0 /* comment */.toString();
34+
var test11 = 3. /* comment */ .toString();
35+
var test12 = 3
36+
/* comment */ .toString();
37+
var test13 = 3.
38+
/* comment */ .toString();
39+
var test14 = 3
40+
// comment
41+
.toString();
42+
var test15 = 3.
43+
// comment
44+
.toString();
45+
var test16 = 3 // comment time
46+
.toString();
47+
var test17 = 3. // comment time again
48+
.toString();
49+
3350

tests/baselines/reference/numericLiteralsWithTrailingDecimalPoints01.js

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,35 @@
44
1.toString();
55
1.+2.0 + 3. ;
66

7-
// Preserve whitespace where important for JS compatibility
7+
// Preserve whitespace and comments where important for JS compatibility
88
var i: number = 1;
9-
var test1 = i.toString();
9+
var test1 = i.toString();
1010
var test2 = 2.toString();
1111
var test3 = 3 .toString();
1212
var test4 = 3 .toString();
13-
var test5 = 3 .toString();
13+
var test5 = 3 .toString();
1414
var test6 = 3.['toString']();
1515
var test7 = 3
1616
.toString();
1717
var test8 = new Number(4).toString();
18-
var test9 = 3. + 3.
18+
var test9 = 3. + 3.;
19+
var test10 = 0 /* comment */.toString();
20+
var test11 = 3. /* comment */ .toString();
21+
var test12 = 3
22+
/* comment */ .toString();
23+
var test13 = 3.
24+
/* comment */ .toString();
25+
var test14 = 3
26+
// comment
27+
.toString();
28+
var test15 = 3.
29+
// comment
30+
.toString();
31+
var test16 = 3 // comment time
32+
.toString();
33+
var test17 = 3. // comment time again
34+
.toString();
35+
1936

2037

2138
//// [numericLiteralsWithTrailingDecimalPoints01.js]
@@ -24,7 +41,7 @@ var test9 = 3. + 3.
2441
1.;
2542
toString();
2643
1. + 2.0 + 3.;
27-
// Preserve whitespace where important for JS compatibility
44+
// Preserve whitespace and comments where important for JS compatibility
2845
var i = 1;
2946
var test1 = i.toString();
3047
var test2 = 2., toString;
@@ -37,3 +54,19 @@ var test7 = 3
3754
.toString();
3855
var test8 = new Number(4).toString();
3956
var test9 = 3. + 3.;
57+
var test10 = 0 /* comment */.toString();
58+
var test11 = 3. /* comment */.toString();
59+
var test12 = 3
60+
/* comment */ .toString();
61+
var test13 = 3.
62+
/* comment */ .toString();
63+
var test14 = 3
64+
// comment
65+
.toString();
66+
var test15 = 3.
67+
// comment
68+
.toString();
69+
var test16 = 3 // comment time
70+
.toString();
71+
var test17 = 3. // comment time again
72+
.toString();

tests/baselines/reference/numericLiteralsWithTrailingDecimalPoints01.symbols

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212

1313
1.+2.0 + 3. ;
1414

15-
// Preserve whitespace where important for JS compatibility
15+
// Preserve whitespace and comments where important for JS compatibility
1616
var i: number = 1;
1717
>i : Symbol(i, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 6, 3))
1818

19-
var test1 = i.toString();
19+
var test1 = i.toString();
2020
>test1 : Symbol(test1, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 7, 3))
2121
>i.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
2222
>i : Symbol(i, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 6, 3))
@@ -36,7 +36,7 @@ var test4 = 3 .toString();
3636
>3 .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
3737
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
3838

39-
var test5 = 3 .toString();
39+
var test5 = 3 .toString();
4040
>test5 : Symbol(test5, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 11, 3))
4141
>3 .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
4242
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
@@ -58,6 +58,61 @@ var test8 = new Number(4).toString();
5858
>Number : Symbol(Number, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
5959
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
6060

61-
var test9 = 3. + 3.
61+
var test9 = 3. + 3.;
6262
>test9 : Symbol(test9, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 16, 3))
6363

64+
var test10 = 0 /* comment */.toString();
65+
>test10 : Symbol(test10, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 17, 3))
66+
>0 /* comment */.toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
67+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
68+
69+
var test11 = 3. /* comment */ .toString();
70+
>test11 : Symbol(test11, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 18, 3))
71+
>3. /* comment */ .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
72+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
73+
74+
var test12 = 3
75+
>test12 : Symbol(test12, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 19, 3))
76+
>3 /* comment */ .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
77+
78+
/* comment */ .toString();
79+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
80+
81+
var test13 = 3.
82+
>test13 : Symbol(test13, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 21, 3))
83+
>3. /* comment */ .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
84+
85+
/* comment */ .toString();
86+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
87+
88+
var test14 = 3
89+
>test14 : Symbol(test14, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 23, 3))
90+
>3 // comment .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
91+
92+
// comment
93+
.toString();
94+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
95+
96+
var test15 = 3.
97+
>test15 : Symbol(test15, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 26, 3))
98+
>3. // comment .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
99+
100+
// comment
101+
.toString();
102+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
103+
104+
var test16 = 3 // comment time
105+
>test16 : Symbol(test16, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 29, 3))
106+
>3 // comment time .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
107+
108+
.toString();
109+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
110+
111+
var test17 = 3. // comment time again
112+
>test17 : Symbol(test17, Decl(numericLiteralsWithTrailingDecimalPoints01.ts, 31, 3))
113+
>3. // comment time again .toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
114+
115+
.toString();
116+
>toString : Symbol(Number.toString, Decl(lib.es5.d.ts, --, --))
117+
118+

tests/baselines/reference/numericLiteralsWithTrailingDecimalPoints01.types

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
>2.0 : 2
2424
>3. : 3
2525

26-
// Preserve whitespace where important for JS compatibility
26+
// Preserve whitespace and comments where important for JS compatibility
2727
var i: number = 1;
2828
>i : number
2929
>1 : 1
3030

31-
var test1 = i.toString();
31+
var test1 = i.toString();
3232
>test1 : string
3333
>i.toString() : string
3434
>i.toString : (radix?: number) => string
@@ -56,7 +56,7 @@ var test4 = 3 .toString();
5656
>3 : 3
5757
>toString : (radix?: number) => string
5858

59-
var test5 = 3 .toString();
59+
var test5 = 3 .toString();
6060
>test5 : string
6161
>3 .toString() : string
6262
>3 .toString : (radix?: number) => string
@@ -88,9 +88,80 @@ var test8 = new Number(4).toString();
8888
>4 : 4
8989
>toString : (radix?: number) => string
9090

91-
var test9 = 3. + 3.
91+
var test9 = 3. + 3.;
9292
>test9 : number
9393
>3. + 3. : number
9494
>3. : 3
9595
>3. : 3
9696

97+
var test10 = 0 /* comment */.toString();
98+
>test10 : string
99+
>0 /* comment */.toString() : string
100+
>0 /* comment */.toString : (radix?: number) => string
101+
>0 : 0
102+
>toString : (radix?: number) => string
103+
104+
var test11 = 3. /* comment */ .toString();
105+
>test11 : string
106+
>3. /* comment */ .toString() : string
107+
>3. /* comment */ .toString : (radix?: number) => string
108+
>3. : 3
109+
>toString : (radix?: number) => string
110+
111+
var test12 = 3
112+
>test12 : string
113+
>3 /* comment */ .toString() : string
114+
>3 /* comment */ .toString : (radix?: number) => string
115+
>3 : 3
116+
117+
/* comment */ .toString();
118+
>toString : (radix?: number) => string
119+
120+
var test13 = 3.
121+
>test13 : string
122+
>3. /* comment */ .toString() : string
123+
>3. /* comment */ .toString : (radix?: number) => string
124+
>3. : 3
125+
126+
/* comment */ .toString();
127+
>toString : (radix?: number) => string
128+
129+
var test14 = 3
130+
>test14 : string
131+
>3 // comment .toString() : string
132+
>3 // comment .toString : (radix?: number) => string
133+
>3 : 3
134+
135+
// comment
136+
.toString();
137+
>toString : (radix?: number) => string
138+
139+
var test15 = 3.
140+
>test15 : string
141+
>3. // comment .toString() : string
142+
>3. // comment .toString : (radix?: number) => string
143+
>3. : 3
144+
145+
// comment
146+
.toString();
147+
>toString : (radix?: number) => string
148+
149+
var test16 = 3 // comment time
150+
>test16 : string
151+
>3 // comment time .toString() : string
152+
>3 // comment time .toString : (radix?: number) => string
153+
>3 : 3
154+
155+
.toString();
156+
>toString : (radix?: number) => string
157+
158+
var test17 = 3. // comment time again
159+
>test17 : string
160+
>3. // comment time again .toString() : string
161+
>3. // comment time again .toString : (radix?: number) => string
162+
>3. : 3
163+
164+
.toString();
165+
>toString : (radix?: number) => string
166+
167+

0 commit comments

Comments
 (0)