Skip to content

Commit dcc16d9

Browse files
Fix nil pointer in transformExpandoAssignment for element access expressions (microsoft#3723)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com>
1 parent 633af79 commit dcc16d9

5 files changed

Lines changed: 98 additions & 1 deletion

File tree

internal/transformers/declarations/transform.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2259,7 +2259,7 @@ func (tx *DeclarationTransformer) transformExpandoAssignment(node *ast.BinaryExp
22592259
if isNonContextualKeywordName {
22602260
namedExports := tx.Factory().NewNamedExports(tx.Factory().NewNodeList(
22612261
[]*ast.Node{
2262-
tx.Factory().NewExportSpecifier(false /*isTypeOnly*/, exportName, tx.Factory().NewIdentifier(left.Name().Text())),
2262+
tx.Factory().NewExportSpecifier(false /*isTypeOnly*/, exportName, tx.Factory().NewIdentifier(property)),
22632263
},
22642264
))
22652265
statements = append(statements, tx.Factory().NewExportDeclaration(nil /*modifiers*/, false /*isTypeOnly*/, namedExports, nil /*moduleSpecifier*/, nil /*attributes*/))
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//// [tests/cases/compiler/jsExpandoAssignmentElementAccess.ts] ////
2+
3+
//// [repro.js]
4+
var x = {};
5+
x['if'] = 1;
6+
x['else'] = 1;
7+
8+
9+
10+
11+
//// [repro.d.ts]
12+
declare var x: {
13+
if: number;
14+
else: number;
15+
};
16+
declare namespace x {
17+
var _a: number;
18+
export { _a as if };
19+
}
20+
declare namespace x {
21+
var _b: number;
22+
export { _b as else };
23+
}
24+
25+
26+
//// [DtsFileErrors]
27+
28+
29+
repro.d.ts(1,13): error TS2300: Duplicate identifier 'x'.
30+
repro.d.ts(5,19): error TS2300: Duplicate identifier 'x'.
31+
repro.d.ts(9,19): error TS2300: Duplicate identifier 'x'.
32+
33+
34+
==== repro.d.ts (3 errors) ====
35+
declare var x: {
36+
~
37+
!!! error TS2300: Duplicate identifier 'x'.
38+
if: number;
39+
else: number;
40+
};
41+
declare namespace x {
42+
~
43+
!!! error TS2300: Duplicate identifier 'x'.
44+
var _a: number;
45+
export { _a as if };
46+
}
47+
declare namespace x {
48+
~
49+
!!! error TS2300: Duplicate identifier 'x'.
50+
var _b: number;
51+
export { _b as else };
52+
}
53+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//// [tests/cases/compiler/jsExpandoAssignmentElementAccess.ts] ////
2+
3+
=== repro.js ===
4+
var x = {};
5+
>x : Symbol(x, Decl(repro.js, 0, 3))
6+
7+
x['if'] = 1;
8+
>x : Symbol(x, Decl(repro.js, 0, 3))
9+
>'if' : Symbol('if', Decl(repro.js, 0, 11))
10+
11+
x['else'] = 1;
12+
>x : Symbol(x, Decl(repro.js, 0, 3))
13+
>'else' : Symbol('else', Decl(repro.js, 1, 12))
14+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [tests/cases/compiler/jsExpandoAssignmentElementAccess.ts] ////
2+
3+
=== repro.js ===
4+
var x = {};
5+
>x : { if: number; else: number; }
6+
>{} : { if: number; else: number; }
7+
8+
x['if'] = 1;
9+
>x['if'] = 1 : 1
10+
>x['if'] : number
11+
>x : { if: number; else: number; }
12+
>'if' : "if"
13+
>1 : 1
14+
15+
x['else'] = 1;
16+
>x['else'] = 1 : 1
17+
>x['else'] : number
18+
>x : { if: number; else: number; }
19+
>'else' : "else"
20+
>1 : 1
21+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @declaration: true
4+
// @emitDeclarationOnly: true
5+
6+
// @filename: repro.js
7+
var x = {};
8+
x['if'] = 1;
9+
x['else'] = 1;

0 commit comments

Comments
 (0)