Skip to content

Commit dc0f4af

Browse files
authored
Save & recalculate declare flag modifier on late printed statements (#29412)
* Save & recalculate declre flag modifier on late printed statements * Accept related baseline updates
1 parent d4055a3 commit dc0f4af

18 files changed

+137
-1645
lines changed

src/compiler/transformers/declarations.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,10 @@ namespace ts {
634634
if (!isLateVisibilityPaintedStatement(i)) {
635635
return Debug.fail(`Late replaced statement was found which is not handled by the declaration transformer!: ${(ts as any).SyntaxKind ? (ts as any).SyntaxKind[(i as any).kind] : (i as any).kind}`);
636636
}
637+
const priorNeedsDeclare = needsDeclare;
638+
needsDeclare = i.parent && isSourceFile(i.parent) && !(isExternalModule(i.parent) && isBundledEmit);
637639
const result = transformTopLevelDeclaration(i, /*privateDeclaration*/ true);
640+
needsDeclare = priorNeedsDeclare;
638641
lateStatementReplacementMap.set("" + getOriginalNodeId(i), result);
639642
}
640643

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//// [declarationEmitLocalClassHasRequiredDeclare.ts]
2+
export declare namespace A {
3+
namespace X { }
4+
}
5+
6+
class X { }
7+
8+
export class A {
9+
static X = X;
10+
}
11+
12+
export declare namespace Y {
13+
14+
}
15+
16+
export class Y { }
17+
18+
//// [declarationEmitLocalClassHasRequiredDeclare.js]
19+
"use strict";
20+
exports.__esModule = true;
21+
var X = /** @class */ (function () {
22+
function X() {
23+
}
24+
return X;
25+
}());
26+
var A = /** @class */ (function () {
27+
function A() {
28+
}
29+
A.X = X;
30+
return A;
31+
}());
32+
exports.A = A;
33+
var Y = /** @class */ (function () {
34+
function Y() {
35+
}
36+
return Y;
37+
}());
38+
exports.Y = Y;
39+
40+
41+
//// [declarationEmitLocalClassHasRequiredDeclare.d.ts]
42+
export declare namespace A {
43+
namespace X { }
44+
}
45+
declare class X {
46+
}
47+
export declare class A {
48+
static X: typeof X;
49+
}
50+
export declare namespace Y {
51+
}
52+
export declare class Y {
53+
}
54+
export {};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/compiler/declarationEmitLocalClassHasRequiredDeclare.ts ===
2+
export declare namespace A {
3+
>A : Symbol(A, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 0, 0), Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 4, 11))
4+
5+
namespace X { }
6+
>X : Symbol(X, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 0, 28), Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 6, 16))
7+
}
8+
9+
class X { }
10+
>X : Symbol(X, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 2, 1))
11+
12+
export class A {
13+
>A : Symbol(A, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 0, 0), Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 4, 11))
14+
15+
static X = X;
16+
>X : Symbol(A.X, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 0, 28), Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 6, 16))
17+
>X : Symbol(X, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 2, 1))
18+
}
19+
20+
export declare namespace Y {
21+
>Y : Symbol(Y, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 8, 1), Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 12, 1))
22+
23+
}
24+
25+
export class Y { }
26+
>Y : Symbol(Y, Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 8, 1), Decl(declarationEmitLocalClassHasRequiredDeclare.ts, 12, 1))
27+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/compiler/declarationEmitLocalClassHasRequiredDeclare.ts ===
2+
export declare namespace A {
3+
namespace X { }
4+
}
5+
6+
class X { }
7+
>X : X
8+
9+
export class A {
10+
>A : A
11+
12+
static X = X;
13+
>X : typeof X
14+
>X : typeof X
15+
}
16+
17+
export declare namespace Y {
18+
19+
}
20+
21+
export class Y { }
22+
>Y : Y
23+

tests/baselines/reference/getEmitOutputWithEmitterErrors2.baseline

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ define(["require", "exports"], function (require, exports) {
1616
});
1717

1818
FileName : /tests/cases/fourslash/inputFile.d.ts
19-
class C {
19+
declare class C {
2020
}
2121
export declare module M {
2222
var foo: C;

tests/baselines/reference/moduleAugmentationImportsAndExports2.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export declare class B {
7777
n: number;
7878
}
7979
//// [f3.d.ts]
80-
namespace N {
80+
declare namespace N {
8181
interface Ifc {
8282
a: any;
8383
}

tests/baselines/reference/moduleAugmentationImportsAndExports3.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export declare class B {
7575
n: number;
7676
}
7777
//// [f3.d.ts]
78-
namespace N {
78+
declare namespace N {
7979
interface Ifc {
8080
a: any;
8181
}

tests/baselines/reference/moduleAugmentationImportsAndExports5.js

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export declare class B {
8080
}
8181
//// [f3.d.ts]
8282
import { B } from "./f2";
83-
namespace N {
83+
declare namespace N {
8484
interface Ifc {
8585
a: number;
8686
}
@@ -100,46 +100,3 @@ declare module "./f1" {
100100
export {};
101101
//// [f4.d.ts]
102102
import "./f3";
103-
104-
105-
//// [DtsFileErrors]
106-
107-
108-
tests/cases/compiler/f3.d.ts(2,1): error TS1046: A 'declare' modifier is required for a top level declaration in a .d.ts file.
109-
110-
111-
==== tests/cases/compiler/f1.d.ts (0 errors) ====
112-
export declare class A {
113-
}
114-
115-
==== tests/cases/compiler/f2.d.ts (0 errors) ====
116-
export declare class B {
117-
n: number;
118-
}
119-
120-
==== tests/cases/compiler/f3.d.ts (1 errors) ====
121-
import { B } from "./f2";
122-
namespace N {
123-
~~~~~~~~~
124-
!!! error TS1046: A 'declare' modifier is required for a top level declaration in a .d.ts file.
125-
interface Ifc {
126-
a: number;
127-
}
128-
interface Cls {
129-
b: number;
130-
}
131-
}
132-
import I = N.Ifc;
133-
import C = N.Cls;
134-
declare module "./f1" {
135-
interface A {
136-
foo(): B;
137-
bar(): I;
138-
baz(): C;
139-
}
140-
}
141-
export {};
142-
143-
==== tests/cases/compiler/f4.d.ts (0 errors) ====
144-
import "./f3";
145-

0 commit comments

Comments
 (0)