Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/compiler/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2220,7 +2220,7 @@ namespace ts {
}
return AssignmentDeclarationKind.ObjectDefinePropertyValue;
}
if (expr.operatorToken.kind !== SyntaxKind.EqualsToken || !isAccessExpression(expr.left)) {
if (expr.operatorToken.kind !== SyntaxKind.EqualsToken || !isAccessExpression(expr.left) || isVoidZero(getRightMostAssignedExpression(expr))) {
return AssignmentDeclarationKind.None;
}
if (isBindableStaticNameExpression(expr.left.expression, /*excludeThisKeyword*/ true) && getElementOrPropertyAccessName(expr.left) === "prototype" && isObjectLiteralExpression(getInitializerOfBinaryExpression(expr))) {
Expand All @@ -2230,6 +2230,10 @@ namespace ts {
return getAssignmentDeclarationPropertyAccessKind(expr.left);
}

function isVoidZero(node: Node) {
return isVoidExpression(node) && isNumericLiteral(node.expression) && node.expression.text === "0";
}

/**
* Does not handle signed numeric names like `a[+0]` - handling those would require handling prefix unary expressions
* throughout late binding handling as well, which is awkward (but ultimately probably doable if there is demand)
Expand Down
17 changes: 17 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//// [assignmentToVoidZero1.js]
// #38552
exports.y = exports.x = void 0;
exports.x = 1;
exports.y = 2;


//// [assignmentToVoidZero1.js]
// #38552
exports.y = exports.x = void 0;
exports.x = 1;
exports.y = 2;


//// [assignmentToVoidZero1.d.ts]
export var x: number;
export var y: number;
20 changes: 20 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero1.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
=== tests/cases/conformance/salsa/assignmentToVoidZero1.js ===
// #38552
exports.y = exports.x = void 0;
>exports.y : Symbol(y, Decl(assignmentToVoidZero1.js, 2, 14))
>exports : Symbol("tests/cases/conformance/salsa/assignmentToVoidZero1", Decl(assignmentToVoidZero1.js, 0, 0))
>y : Symbol(y, Decl(assignmentToVoidZero1.js, 2, 14))
>exports.x : Symbol(x, Decl(assignmentToVoidZero1.js, 1, 31))
>exports : Symbol("tests/cases/conformance/salsa/assignmentToVoidZero1", Decl(assignmentToVoidZero1.js, 0, 0))
>x : Symbol(x, Decl(assignmentToVoidZero1.js, 1, 31))

exports.x = 1;
>exports.x : Symbol(x, Decl(assignmentToVoidZero1.js, 1, 31))
>exports : Symbol(x, Decl(assignmentToVoidZero1.js, 1, 31))
>x : Symbol(x, Decl(assignmentToVoidZero1.js, 1, 31))

exports.y = 2;
>exports.y : Symbol(y, Decl(assignmentToVoidZero1.js, 2, 14))
>exports : Symbol(y, Decl(assignmentToVoidZero1.js, 2, 14))
>y : Symbol(y, Decl(assignmentToVoidZero1.js, 2, 14))

28 changes: 28 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero1.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
=== tests/cases/conformance/salsa/assignmentToVoidZero1.js ===
// #38552
exports.y = exports.x = void 0;
>exports.y = exports.x = void 0 : undefined
>exports.y : number
>exports : typeof import("tests/cases/conformance/salsa/assignmentToVoidZero1")
>y : number
>exports.x = void 0 : undefined
>exports.x : number
>exports : typeof import("tests/cases/conformance/salsa/assignmentToVoidZero1")
>x : number
>void 0 : undefined
>0 : 0

exports.x = 1;
>exports.x = 1 : 1
>exports.x : number
>exports : typeof import("tests/cases/conformance/salsa/assignmentToVoidZero1")
>x : number
>1 : 1

exports.y = 2;
>exports.y = 2 : 2
>exports.y : number
>exports : typeof import("tests/cases/conformance/salsa/assignmentToVoidZero1")
>y : number
>2 : 2

36 changes: 36 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero2.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
tests/cases/conformance/salsa/assignmentToVoidZero2.js(2,9): error TS2339: Property 'k' does not exist on type 'typeof import("tests/cases/conformance/salsa/assignmentToVoidZero2")'.
tests/cases/conformance/salsa/assignmentToVoidZero2.js(5,3): error TS2339: Property 'y' does not exist on type 'typeof o'.
tests/cases/conformance/salsa/assignmentToVoidZero2.js(6,9): error TS2339: Property 'y' does not exist on type 'typeof o'.
tests/cases/conformance/salsa/assignmentToVoidZero2.js(13,9): error TS2339: Property 'q' does not exist on type 'C'.
tests/cases/conformance/salsa/importer.js(1,13): error TS2305: Module '"./assignmentToVoidZero2"' has no exported member 'k'.


==== tests/cases/conformance/salsa/assignmentToVoidZero2.js (4 errors) ====
exports.j = 1;
exports.k = void 0;
~
!!! error TS2339: Property 'k' does not exist on type 'typeof import("tests/cases/conformance/salsa/assignmentToVoidZero2")'.
var o = {}
o.x = 1
o.y = void 0
~
!!! error TS2339: Property 'y' does not exist on type 'typeof o'.
o.x + o.y
~
!!! error TS2339: Property 'y' does not exist on type 'typeof o'.

function C() {
this.p = 1
this.q = void 0
}
var c = new C()
c.p + c.q
~
!!! error TS2339: Property 'q' does not exist on type 'C'.

==== tests/cases/conformance/salsa/importer.js (1 errors) ====
import { j, k } from './assignmentToVoidZero2'
~
!!! error TS2305: Module '"./assignmentToVoidZero2"' has no exported member 'k'.
j + k

46 changes: 46 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//// [tests/cases/conformance/salsa/assignmentToVoidZero2.ts] ////

//// [assignmentToVoidZero2.js]
exports.j = 1;
exports.k = void 0;
var o = {}
o.x = 1
o.y = void 0
o.x + o.y

function C() {
this.p = 1
this.q = void 0
}
var c = new C()
c.p + c.q

//// [importer.js]
import { j, k } from './assignmentToVoidZero2'
j + k


//// [assignmentToVoidZero2.js]
exports.j = 1;
exports.k = void 0;
var o = {};
o.x = 1;
o.y = void 0;
o.x + o.y;
function C() {
this.p = 1;
this.q = void 0;
}
var c = new C();
c.p + c.q;
//// [importer.js]
"use strict";
exports.__esModule = true;
var assignmentToVoidZero2_1 = require("./assignmentToVoidZero2");
assignmentToVoidZero2_1.j + assignmentToVoidZero2_1.k;


//// [assignmentToVoidZero2.d.ts]
export var j: number;
//// [importer.d.ts]
export {};
53 changes: 53 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero2.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
=== tests/cases/conformance/salsa/assignmentToVoidZero2.js ===
exports.j = 1;
>exports.j : Symbol(j, Decl(assignmentToVoidZero2.js, 0, 0))
>exports : Symbol(j, Decl(assignmentToVoidZero2.js, 0, 0))
>j : Symbol(j, Decl(assignmentToVoidZero2.js, 0, 0))

exports.k = void 0;
>exports : Symbol("tests/cases/conformance/salsa/assignmentToVoidZero2", Decl(assignmentToVoidZero2.js, 0, 0))

var o = {}
>o : Symbol(o, Decl(assignmentToVoidZero2.js, 2, 3), Decl(assignmentToVoidZero2.js, 2, 10))

o.x = 1
>o.x : Symbol(o.x, Decl(assignmentToVoidZero2.js, 2, 10))
>o : Symbol(o, Decl(assignmentToVoidZero2.js, 2, 3), Decl(assignmentToVoidZero2.js, 2, 10))
>x : Symbol(o.x, Decl(assignmentToVoidZero2.js, 2, 10))

o.y = void 0
>o : Symbol(o, Decl(assignmentToVoidZero2.js, 2, 3), Decl(assignmentToVoidZero2.js, 2, 10))

o.x + o.y
>o.x : Symbol(o.x, Decl(assignmentToVoidZero2.js, 2, 10))
>o : Symbol(o, Decl(assignmentToVoidZero2.js, 2, 3), Decl(assignmentToVoidZero2.js, 2, 10))
>x : Symbol(o.x, Decl(assignmentToVoidZero2.js, 2, 10))
>o : Symbol(o, Decl(assignmentToVoidZero2.js, 2, 3), Decl(assignmentToVoidZero2.js, 2, 10))

function C() {
>C : Symbol(C, Decl(assignmentToVoidZero2.js, 5, 9))

this.p = 1
>p : Symbol(C.p, Decl(assignmentToVoidZero2.js, 7, 14))

this.q = void 0
}
var c = new C()
>c : Symbol(c, Decl(assignmentToVoidZero2.js, 11, 3))
>C : Symbol(C, Decl(assignmentToVoidZero2.js, 5, 9))

c.p + c.q
>c.p : Symbol(C.p, Decl(assignmentToVoidZero2.js, 7, 14))
>c : Symbol(c, Decl(assignmentToVoidZero2.js, 11, 3))
>p : Symbol(C.p, Decl(assignmentToVoidZero2.js, 7, 14))
>c : Symbol(c, Decl(assignmentToVoidZero2.js, 11, 3))

=== tests/cases/conformance/salsa/importer.js ===
import { j, k } from './assignmentToVoidZero2'
>j : Symbol(j, Decl(importer.js, 0, 8))
>k : Symbol(k, Decl(importer.js, 0, 11))

j + k
>j : Symbol(j, Decl(importer.js, 0, 8))
>k : Symbol(k, Decl(importer.js, 0, 11))

86 changes: 86 additions & 0 deletions tests/baselines/reference/assignmentToVoidZero2.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
=== tests/cases/conformance/salsa/assignmentToVoidZero2.js ===
exports.j = 1;
>exports.j = 1 : 1
>exports.j : number
>exports : typeof import("tests/cases/conformance/salsa/assignmentToVoidZero2")
>j : number
>1 : 1

exports.k = void 0;
>exports.k = void 0 : undefined
>exports.k : any
>exports : typeof import("tests/cases/conformance/salsa/assignmentToVoidZero2")
>k : any
>void 0 : undefined
>0 : 0

var o = {}
>o : typeof o
>{} : {}

o.x = 1
>o.x = 1 : 1
>o.x : number
>o : typeof o
>x : number
>1 : 1

o.y = void 0
>o.y = void 0 : undefined
>o.y : any
>o : typeof o
>y : any
>void 0 : undefined
>0 : 0

o.x + o.y
>o.x + o.y : any
>o.x : number
>o : typeof o
>x : number
>o.y : any
>o : typeof o
>y : any

function C() {
>C : typeof C

this.p = 1
>this.p = 1 : 1
>this.p : any
>this : any
>p : any
>1 : 1

this.q = void 0
>this.q = void 0 : undefined
>this.q : any
>this : any
>q : any
>void 0 : undefined
>0 : 0
}
var c = new C()
>c : C
>new C() : C
>C : typeof C

c.p + c.q
>c.p + c.q : any
>c.p : number
>c : C
>p : number
>c.q : any
>c : C
>q : any

=== tests/cases/conformance/salsa/importer.js ===
import { j, k } from './assignmentToVoidZero2'
>j : number
>k : any

j + k
>j + k : any
>j : number
>k : any

11 changes: 11 additions & 0 deletions tests/cases/conformance/salsa/assignmentToVoidZero1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// @filename: assignmentToVoidZero1.js
// @declaration: true
// @module: commonjs
// @outdir: auss
// @checkJs: true
// @allowJs: true

// #38552
exports.y = exports.x = void 0;
exports.x = 1;
exports.y = 2;
24 changes: 24 additions & 0 deletions tests/cases/conformance/salsa/assignmentToVoidZero2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// @filename: assignmentToVoidZero2.js
// @declaration: true
// @module: commonjs
// @outdir: auss
// @checkJs: true
// @allowJs: true
// @noImplicitAny: true
exports.j = 1;
exports.k = void 0;
var o = {}
o.x = 1
o.y = void 0
o.x + o.y

function C() {
this.p = 1
this.q = void 0
}
var c = new C()
c.p + c.q

// @filename: importer.js
import { j, k } from './assignmentToVoidZero2'
j + k