diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 365a3d36515af..d89c09babf2da 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1072,7 +1072,6 @@ namespace ts { node = node.parent; } return !isStatementCondition(node) && - !isLogicalAssignmentExpression(node.parent) && !isLogicalExpression(node.parent) && !(isOptionalChain(node.parent) && node.parent.expression === node); } diff --git a/tests/baselines/reference/logicalAssignment11(target=es2015).js b/tests/baselines/reference/logicalAssignment11(target=es2015).js new file mode 100644 index 0000000000000..26c8118da53a5 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=es2015).js @@ -0,0 +1,20 @@ +//// [logicalAssignment11.ts] +let x: string | undefined; + +let d: string | undefined; +d ?? (d = x ?? "x") +d.length; + +let e: string | undefined; +e ??= x ?? "x" +e.length + +//// [logicalAssignment11.js] +"use strict"; +let x; +let d; +d !== null && d !== void 0 ? d : (d = x !== null && x !== void 0 ? x : "x"); +d.length; +let e; +e !== null && e !== void 0 ? e : (e = x !== null && x !== void 0 ? x : "x"); +e.length; diff --git a/tests/baselines/reference/logicalAssignment11(target=es2015).symbols b/tests/baselines/reference/logicalAssignment11(target=es2015).symbols new file mode 100644 index 0000000000000..95c1b3b332327 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=es2015).symbols @@ -0,0 +1,29 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts === +let x: string | undefined; +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +let d: string | undefined; +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) + +d ?? (d = x ?? "x") +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +d.length; +>d.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + +let e: string | undefined; +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) + +e ??= x ?? "x" +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +e.length +>e.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/logicalAssignment11(target=es2015).types b/tests/baselines/reference/logicalAssignment11(target=es2015).types new file mode 100644 index 0000000000000..5595ba8327737 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=es2015).types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts === +let x: string | undefined; +>x : string | undefined + +let d: string | undefined; +>d : string | undefined + +d ?? (d = x ?? "x") +>d ?? (d = x ?? "x") : string +>d : string | undefined +>(d = x ?? "x") : string +>d = x ?? "x" : string +>d : string | undefined +>x ?? "x" : string +>x : string | undefined +>"x" : "x" + +d.length; +>d.length : number +>d : string +>length : number + +let e: string | undefined; +>e : string | undefined + +e ??= x ?? "x" +>e ??= x ?? "x" : string +>e : string | undefined +>x ?? "x" : string +>x : string | undefined +>"x" : "x" + +e.length +>e.length : number +>e : string +>length : number + diff --git a/tests/baselines/reference/logicalAssignment11(target=es2020).js b/tests/baselines/reference/logicalAssignment11(target=es2020).js new file mode 100644 index 0000000000000..96629d905e668 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=es2020).js @@ -0,0 +1,20 @@ +//// [logicalAssignment11.ts] +let x: string | undefined; + +let d: string | undefined; +d ?? (d = x ?? "x") +d.length; + +let e: string | undefined; +e ??= x ?? "x" +e.length + +//// [logicalAssignment11.js] +"use strict"; +let x; +let d; +d ?? (d = x ?? "x"); +d.length; +let e; +e ?? (e = x ?? "x"); +e.length; diff --git a/tests/baselines/reference/logicalAssignment11(target=es2020).symbols b/tests/baselines/reference/logicalAssignment11(target=es2020).symbols new file mode 100644 index 0000000000000..95c1b3b332327 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=es2020).symbols @@ -0,0 +1,29 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts === +let x: string | undefined; +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +let d: string | undefined; +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) + +d ?? (d = x ?? "x") +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +d.length; +>d.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + +let e: string | undefined; +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) + +e ??= x ?? "x" +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +e.length +>e.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/logicalAssignment11(target=es2020).types b/tests/baselines/reference/logicalAssignment11(target=es2020).types new file mode 100644 index 0000000000000..5595ba8327737 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=es2020).types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts === +let x: string | undefined; +>x : string | undefined + +let d: string | undefined; +>d : string | undefined + +d ?? (d = x ?? "x") +>d ?? (d = x ?? "x") : string +>d : string | undefined +>(d = x ?? "x") : string +>d = x ?? "x" : string +>d : string | undefined +>x ?? "x" : string +>x : string | undefined +>"x" : "x" + +d.length; +>d.length : number +>d : string +>length : number + +let e: string | undefined; +>e : string | undefined + +e ??= x ?? "x" +>e ??= x ?? "x" : string +>e : string | undefined +>x ?? "x" : string +>x : string | undefined +>"x" : "x" + +e.length +>e.length : number +>e : string +>length : number + diff --git a/tests/baselines/reference/logicalAssignment11(target=esnext).js b/tests/baselines/reference/logicalAssignment11(target=esnext).js new file mode 100644 index 0000000000000..ffcc40516cc33 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=esnext).js @@ -0,0 +1,20 @@ +//// [logicalAssignment11.ts] +let x: string | undefined; + +let d: string | undefined; +d ?? (d = x ?? "x") +d.length; + +let e: string | undefined; +e ??= x ?? "x" +e.length + +//// [logicalAssignment11.js] +"use strict"; +let x; +let d; +d ?? (d = x ?? "x"); +d.length; +let e; +e ??= x ?? "x"; +e.length; diff --git a/tests/baselines/reference/logicalAssignment11(target=esnext).symbols b/tests/baselines/reference/logicalAssignment11(target=esnext).symbols new file mode 100644 index 0000000000000..95c1b3b332327 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=esnext).symbols @@ -0,0 +1,29 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts === +let x: string | undefined; +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +let d: string | undefined; +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) + +d ?? (d = x ?? "x") +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +d.length; +>d.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>d : Symbol(d, Decl(logicalAssignment11.ts, 2, 3)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + +let e: string | undefined; +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) + +e ??= x ?? "x" +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) +>x : Symbol(x, Decl(logicalAssignment11.ts, 0, 3)) + +e.length +>e.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) +>e : Symbol(e, Decl(logicalAssignment11.ts, 6, 3)) +>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --)) + diff --git a/tests/baselines/reference/logicalAssignment11(target=esnext).types b/tests/baselines/reference/logicalAssignment11(target=esnext).types new file mode 100644 index 0000000000000..5595ba8327737 --- /dev/null +++ b/tests/baselines/reference/logicalAssignment11(target=esnext).types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts === +let x: string | undefined; +>x : string | undefined + +let d: string | undefined; +>d : string | undefined + +d ?? (d = x ?? "x") +>d ?? (d = x ?? "x") : string +>d : string | undefined +>(d = x ?? "x") : string +>d = x ?? "x" : string +>d : string | undefined +>x ?? "x" : string +>x : string | undefined +>"x" : "x" + +d.length; +>d.length : number +>d : string +>length : number + +let e: string | undefined; +>e : string | undefined + +e ??= x ?? "x" +>e ??= x ?? "x" : string +>e : string | undefined +>x ?? "x" : string +>x : string | undefined +>"x" : "x" + +e.length +>e.length : number +>e : string +>length : number + diff --git a/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts new file mode 100644 index 0000000000000..96b6ff7e54b42 --- /dev/null +++ b/tests/cases/conformance/esnext/logicalAssignment/logicalAssignment11.ts @@ -0,0 +1,12 @@ +// @strict: true +// @target: esnext, es2020, es2015 + +let x: string | undefined; + +let d: string | undefined; +d ?? (d = x ?? "x") +d.length; + +let e: string | undefined; +e ??= x ?? "x" +e.length \ No newline at end of file