Skip to content

Commit 51e4011

Browse files
author
Yui T
committed
Address PR comments
1 parent b335adb commit 51e4011

File tree

4 files changed

+66
-78
lines changed

4 files changed

+66
-78
lines changed

src/compiler/emitter.ts

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ namespace ts {
212212
} = comments;
213213

214214
let currentSourceFile: SourceFile;
215-
let statementOffset: number; // We cache the index of first non prologue so we don't have to recalculate it multiple times like in emitBodyInDirect
216215
let nodeIdToGeneratedName: string[]; // Map of generated names for specific nodes.
217216
let autoGeneratedIdToGeneratedName: string[]; // Map of generated names for temp and loop variables.
218217
let generatedNames: Map<string>; // Set of names generated by the NameGenerator.
@@ -312,7 +311,6 @@ namespace ts {
312311

313312
function setSourceFile(sourceFile: SourceFile) {
314313
currentSourceFile = sourceFile;
315-
statementOffset = getIndexOfFirstNonPrologueDirectives(sourceFile.statements);
316314
comments.setSourceFile(sourceFile);
317315
if (onSetSourceFile) {
318316
onSetSourceFile(sourceFile);
@@ -736,19 +734,6 @@ namespace ts {
736734
return node && substituteNode && substituteNode(hint, node) || node;
737735
}
738736

739-
function emitBodyIndirect(node: Node, elements: NodeArray<Node>, emitCallback: (node: Node) => void): void {
740-
// If the node is a sourceFile and it has prologueDirective (statmentOffSet is not zero) that is synthesize
741-
// We will need to emit detached comment here because emitPrologueDirective will not emit comments of such prologue directive
742-
const shouldEmitDetachedComment = node.kind !== SyntaxKind.SourceFile ? true :
743-
statementOffset === 0 || nodeIsSynthesized((node as SourceFile).statements[statementOffset - 1]);
744-
if (emitBodyWithDetachedComments && shouldEmitDetachedComment) {
745-
emitBodyWithDetachedComments(node, elements, emitCallback);
746-
}
747-
else {
748-
emitCallback(node);
749-
}
750-
}
751-
752737
function emitHelpersIndirect(node: Node) {
753738
if (onEmitHelpers) {
754739
onEmitHelpers(node, writeLines);
@@ -1652,7 +1637,12 @@ namespace ts {
16521637
? emitBlockFunctionBodyOnSingleLine
16531638
: emitBlockFunctionBodyWorker;
16541639

1655-
emitBodyIndirect(body, body.statements, emitBlockFunctionBody);
1640+
if (emitBodyWithDetachedComments) {
1641+
emitBodyWithDetachedComments(body, body.statements, emitBlockFunctionBody);
1642+
}
1643+
else {
1644+
emitBlockFunctionBody(body);
1645+
}
16561646

16571647
decreaseIndent();
16581648
writeToken(SyntaxKind.CloseBraceToken, body.statements.end, body);
@@ -2061,14 +2051,28 @@ namespace ts {
20612051

20622052
function emitSourceFile(node: SourceFile) {
20632053
writeLine();
2064-
emitBodyIndirect(node, node.statements, emitSourceFileWorker);
2054+
// If the node is a sourceFile and it has prologueDirective (statmentOffSet is not zero) that is synthesize
2055+
// We will need to emit detached comment here because emitPrologueDirective will not emit comments of such prologue directive
2056+
const statements = node.statements;
2057+
// Emit detached comment if there iare no prologue directives or this is a synthesized prologue directives.
2058+
// The synthesized node will have no leading comment so some comments may be missed.
2059+
const shouldEmitDetachedComment = statements.length === 0 ||
2060+
!isPrologueDirective(statements[0]) ||
2061+
(isPrologueDirective(statements[0]) && nodeIsSynthesized(statements[0]));
2062+
if (emitBodyWithDetachedComments && shouldEmitDetachedComment) {
2063+
emitBodyWithDetachedComments(node, statements, emitSourceFileWorker);
2064+
}
2065+
else {
2066+
emitSourceFileWorker(node);
2067+
}
20652068
}
20662069

20672070
function emitSourceFileWorker(node: SourceFile) {
20682071
const statements = node.statements;
20692072
pushNameGenerationScope();
20702073
emitHelpersIndirect(node);
2071-
emitList(node, statements, ListFormat.MultiLine, statementOffset);
2074+
const index = findIndex(statements, statement => !isPrologueDirective(statement));
2075+
emitList(node, statements, ListFormat.MultiLine, index === -1 ? statements.length : index);
20722076
popNameGenerationScope();
20732077
}
20742078

@@ -2122,40 +2126,27 @@ namespace ts {
21222126

21232127
function emitShebangIfNeeded(sourceFileOrBundle: Bundle | SourceFile) {
21242128
if (sourceFileOrBundle.kind === SyntaxKind.SourceFile) {
2125-
emitShebangInSourceFile(sourceFileOrBundle as SourceFile);
2129+
const shebang = getShebang(sourceFileOrBundle.text);
2130+
if (shebang) {
2131+
write(shebang);
2132+
writeLine();
2133+
return true;
2134+
}
21262135
}
21272136
else {
2128-
for (const sourceFile of (sourceFileOrBundle as Bundle).sourceFiles) {
2137+
for (const sourceFile of sourceFileOrBundle.sourceFiles) {
21292138
// Emit only the first encountered shebang
2130-
if (emitShebangInSourceFile(sourceFile)) {
2139+
if (emitShebangIfNeeded(sourceFile)) {
21312140
break;
21322141
}
21332142
}
21342143
}
2135-
2136-
function emitShebangInSourceFile(sourceFile: SourceFile): boolean {
2137-
const shebang = getShebang(sourceFile.text);
2138-
if (shebang) {
2139-
write(shebang);
2140-
writeLine();
2141-
return true;
2142-
}
2143-
}
21442144
}
21452145

21462146
//
21472147
// Helpers
21482148
//
21492149

2150-
function getIndexOfFirstNonPrologueDirectives(statements: Statement[]): number {
2151-
for (let i = 0; i < statements.length; i++) {
2152-
if (!isPrologueDirective(statements[i])) {
2153-
return i;
2154-
}
2155-
}
2156-
return statements.length;
2157-
}
2158-
21592150
function emitModifiers(node: Node, modifiers: NodeArray<Modifier>) {
21602151
if (modifiers && modifiers.length) {
21612152
emitList(node, modifiers, ListFormat.Modifiers);

tests/baselines/reference/jsDocTypes.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//// [tests/cases/conformance/salsa/jsDocTypes.ts] ////
22

33
//// [a.js]
4-
54
/** @type {String} */
65
var S;
76

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,132 @@
11
=== tests/cases/conformance/salsa/a.js ===
2-
32
/** @type {String} */
43
var S;
5-
>S : Symbol(S, Decl(a.js, 2, 3), Decl(b.ts, 0, 3))
4+
>S : Symbol(S, Decl(a.js, 1, 3), Decl(b.ts, 0, 3))
65

76
/** @type {string} */
87
var s;
9-
>s : Symbol(s, Decl(a.js, 5, 3), Decl(b.ts, 1, 3))
8+
>s : Symbol(s, Decl(a.js, 4, 3), Decl(b.ts, 1, 3))
109

1110
/** @type {Number} */
1211
var N;
13-
>N : Symbol(N, Decl(a.js, 8, 3), Decl(b.ts, 2, 3))
12+
>N : Symbol(N, Decl(a.js, 7, 3), Decl(b.ts, 2, 3))
1413

1514
/** @type {number} */
1615
var n;
17-
>n : Symbol(n, Decl(a.js, 11, 3), Decl(b.ts, 3, 3))
16+
>n : Symbol(n, Decl(a.js, 10, 3), Decl(b.ts, 3, 3))
1817

1918
/** @type {Boolean} */
2019
var B;
21-
>B : Symbol(B, Decl(a.js, 14, 3), Decl(b.ts, 4, 3))
20+
>B : Symbol(B, Decl(a.js, 13, 3), Decl(b.ts, 4, 3))
2221

2322
/** @type {boolean} */
2423
var b;
25-
>b : Symbol(b, Decl(a.js, 17, 3), Decl(b.ts, 5, 3))
24+
>b : Symbol(b, Decl(a.js, 16, 3), Decl(b.ts, 5, 3))
2625

2726
/** @type {Void} */
2827
var V;
29-
>V : Symbol(V, Decl(a.js, 20, 3), Decl(b.ts, 6, 3))
28+
>V : Symbol(V, Decl(a.js, 19, 3), Decl(b.ts, 6, 3))
3029

3130
/** @type {void} */
3231
var v;
33-
>v : Symbol(v, Decl(a.js, 23, 3), Decl(b.ts, 7, 3))
32+
>v : Symbol(v, Decl(a.js, 22, 3), Decl(b.ts, 7, 3))
3433

3534
/** @type {Undefined} */
3635
var U;
37-
>U : Symbol(U, Decl(a.js, 26, 3), Decl(b.ts, 8, 3))
36+
>U : Symbol(U, Decl(a.js, 25, 3), Decl(b.ts, 8, 3))
3837

3938
/** @type {undefined} */
4039
var u;
41-
>u : Symbol(u, Decl(a.js, 29, 3), Decl(b.ts, 9, 3))
40+
>u : Symbol(u, Decl(a.js, 28, 3), Decl(b.ts, 9, 3))
4241

4342
/** @type {Null} */
4443
var Nl;
45-
>Nl : Symbol(Nl, Decl(a.js, 32, 3), Decl(b.ts, 10, 3))
44+
>Nl : Symbol(Nl, Decl(a.js, 31, 3), Decl(b.ts, 10, 3))
4645

4746
/** @type {null} */
4847
var nl;
49-
>nl : Symbol(nl, Decl(a.js, 35, 3), Decl(b.ts, 11, 3))
48+
>nl : Symbol(nl, Decl(a.js, 34, 3), Decl(b.ts, 11, 3))
5049

5150
/** @type {Array} */
5251
var A;
53-
>A : Symbol(A, Decl(a.js, 38, 3), Decl(b.ts, 12, 3))
52+
>A : Symbol(A, Decl(a.js, 37, 3), Decl(b.ts, 12, 3))
5453

5554
/** @type {array} */
5655
var a;
57-
>a : Symbol(a, Decl(a.js, 41, 3), Decl(b.ts, 13, 3))
56+
>a : Symbol(a, Decl(a.js, 40, 3), Decl(b.ts, 13, 3))
5857

5958
/** @type {Promise} */
6059
var P;
61-
>P : Symbol(P, Decl(a.js, 44, 3), Decl(b.ts, 14, 3))
60+
>P : Symbol(P, Decl(a.js, 43, 3), Decl(b.ts, 14, 3))
6261

6362
/** @type {promise} */
6463
var p;
65-
>p : Symbol(p, Decl(a.js, 47, 3), Decl(b.ts, 15, 3))
64+
>p : Symbol(p, Decl(a.js, 46, 3), Decl(b.ts, 15, 3))
6665

6766
/** @type {?number} */
6867
var nullable;
69-
>nullable : Symbol(nullable, Decl(a.js, 50, 3), Decl(b.ts, 16, 3))
68+
>nullable : Symbol(nullable, Decl(a.js, 49, 3), Decl(b.ts, 16, 3))
7069

7170
/** @type {Object} */
7271
var Obj;
73-
>Obj : Symbol(Obj, Decl(a.js, 53, 3), Decl(b.ts, 17, 3))
72+
>Obj : Symbol(Obj, Decl(a.js, 52, 3), Decl(b.ts, 17, 3))
7473

7574

7675

7776
=== tests/cases/conformance/salsa/b.ts ===
7877
var S: string;
79-
>S : Symbol(S, Decl(a.js, 2, 3), Decl(b.ts, 0, 3))
78+
>S : Symbol(S, Decl(a.js, 1, 3), Decl(b.ts, 0, 3))
8079

8180
var s: string;
82-
>s : Symbol(s, Decl(a.js, 5, 3), Decl(b.ts, 1, 3))
81+
>s : Symbol(s, Decl(a.js, 4, 3), Decl(b.ts, 1, 3))
8382

8483
var N: number;
85-
>N : Symbol(N, Decl(a.js, 8, 3), Decl(b.ts, 2, 3))
84+
>N : Symbol(N, Decl(a.js, 7, 3), Decl(b.ts, 2, 3))
8685

8786
var n: number
88-
>n : Symbol(n, Decl(a.js, 11, 3), Decl(b.ts, 3, 3))
87+
>n : Symbol(n, Decl(a.js, 10, 3), Decl(b.ts, 3, 3))
8988

9089
var B: boolean;
91-
>B : Symbol(B, Decl(a.js, 14, 3), Decl(b.ts, 4, 3))
90+
>B : Symbol(B, Decl(a.js, 13, 3), Decl(b.ts, 4, 3))
9291

9392
var b: boolean;
94-
>b : Symbol(b, Decl(a.js, 17, 3), Decl(b.ts, 5, 3))
93+
>b : Symbol(b, Decl(a.js, 16, 3), Decl(b.ts, 5, 3))
9594

9695
var V :void;
97-
>V : Symbol(V, Decl(a.js, 20, 3), Decl(b.ts, 6, 3))
96+
>V : Symbol(V, Decl(a.js, 19, 3), Decl(b.ts, 6, 3))
9897

9998
var v: void;
100-
>v : Symbol(v, Decl(a.js, 23, 3), Decl(b.ts, 7, 3))
99+
>v : Symbol(v, Decl(a.js, 22, 3), Decl(b.ts, 7, 3))
101100

102101
var U: undefined;
103-
>U : Symbol(U, Decl(a.js, 26, 3), Decl(b.ts, 8, 3))
102+
>U : Symbol(U, Decl(a.js, 25, 3), Decl(b.ts, 8, 3))
104103

105104
var u: undefined;
106-
>u : Symbol(u, Decl(a.js, 29, 3), Decl(b.ts, 9, 3))
105+
>u : Symbol(u, Decl(a.js, 28, 3), Decl(b.ts, 9, 3))
107106

108107
var Nl: null;
109-
>Nl : Symbol(Nl, Decl(a.js, 32, 3), Decl(b.ts, 10, 3))
108+
>Nl : Symbol(Nl, Decl(a.js, 31, 3), Decl(b.ts, 10, 3))
110109

111110
var nl: null;
112-
>nl : Symbol(nl, Decl(a.js, 35, 3), Decl(b.ts, 11, 3))
111+
>nl : Symbol(nl, Decl(a.js, 34, 3), Decl(b.ts, 11, 3))
113112

114113
var A: any[];
115-
>A : Symbol(A, Decl(a.js, 38, 3), Decl(b.ts, 12, 3))
114+
>A : Symbol(A, Decl(a.js, 37, 3), Decl(b.ts, 12, 3))
116115

117116
var a: any[];
118-
>a : Symbol(a, Decl(a.js, 41, 3), Decl(b.ts, 13, 3))
117+
>a : Symbol(a, Decl(a.js, 40, 3), Decl(b.ts, 13, 3))
119118

120119
var P: Promise<any>;
121-
>P : Symbol(P, Decl(a.js, 44, 3), Decl(b.ts, 14, 3))
120+
>P : Symbol(P, Decl(a.js, 43, 3), Decl(b.ts, 14, 3))
122121
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
123122

124123
var p: Promise<any>;
125-
>p : Symbol(p, Decl(a.js, 47, 3), Decl(b.ts, 15, 3))
124+
>p : Symbol(p, Decl(a.js, 46, 3), Decl(b.ts, 15, 3))
126125
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
127126

128127
var nullable: number | null;
129-
>nullable : Symbol(nullable, Decl(a.js, 50, 3), Decl(b.ts, 16, 3))
128+
>nullable : Symbol(nullable, Decl(a.js, 49, 3), Decl(b.ts, 16, 3))
130129

131130
var Obj: any;
132-
>Obj : Symbol(Obj, Decl(a.js, 53, 3), Decl(b.ts, 17, 3))
131+
>Obj : Symbol(Obj, Decl(a.js, 52, 3), Decl(b.ts, 17, 3))
133132

tests/baselines/reference/jsDocTypes.types

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
=== tests/cases/conformance/salsa/a.js ===
2-
32
/** @type {String} */
43
var S;
54
>S : string

0 commit comments

Comments
 (0)