Skip to content

Commit

Permalink
Cherry-pick PR #49157 into release-4.7 (#49167)
Browse files Browse the repository at this point in the history
Component commits:
8d1095d Fix uncalled function check usage detection for && expressions

Co-authored-by: Andrew Branch <andrew@wheream.io>
  • Loading branch information
typescript-bot and andrewbranch committed May 18, 2022
1 parent 77b83f1 commit 114e310
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Expand Up @@ -37919,7 +37919,7 @@ namespace ts {
const childSymbol = getSymbolAtLocation(childNode);
if (childSymbol && childSymbol === testedSymbol) {
// If the test was a simple identifier, the above check is sufficient
if (isIdentifier(expr)) {
if (isIdentifier(expr) || isIdentifier(testedNode) && isBinaryExpression(testedNode.parent)) {
return true;
}
// Otherwise we need to ensure the symbol is called on the same target
Expand Down
Expand Up @@ -78,4 +78,8 @@ tests/cases/compiler/uncalledFunctionChecksInConditional.ts(48,22): error TS2774
!!! error TS2774: This condition will always return true since this function is always defined. Did you mean to call it instead?
// error on isFoo
}


if (x && z) {
// no error
z();
}
Expand Up @@ -49,7 +49,11 @@ if (x || uy || z || isUndefinedFoo) {
if (ux || y || uz || isFoo) {
// error on isFoo
}


if (x && z) {
// no error
z();
}

//// [uncalledFunctionChecksInConditional.js]
if (isFoo) {
Expand Down Expand Up @@ -82,3 +86,7 @@ if (x || uy || z || isUndefinedFoo) {
if (ux || y || uz || isFoo) {
// error on isFoo
}
if (x && z) {
// no error
z();
}
Expand Up @@ -101,3 +101,11 @@ if (ux || y || uz || isFoo) {
// error on isFoo
}

if (x && z) {
>x : Symbol(x, Decl(uncalledFunctionChecksInConditional.ts, 24, 13))
>z : Symbol(z, Decl(uncalledFunctionChecksInConditional.ts, 27, 38))

// no error
z();
>z : Symbol(z, Decl(uncalledFunctionChecksInConditional.ts, 27, 38))
}
Expand Up @@ -120,3 +120,13 @@ if (ux || y || uz || isFoo) {
// error on isFoo
}

if (x && z) {
>x && z : false | (() => boolean)
>x : boolean
>z : () => boolean

// no error
z();
>z() : boolean
>z : () => boolean
}
5 changes: 5 additions & 0 deletions tests/cases/compiler/uncalledFunctionChecksInConditional.ts
Expand Up @@ -50,3 +50,8 @@ if (x || uy || z || isUndefinedFoo) {
if (ux || y || uz || isFoo) {
// error on isFoo
}

if (x && z) {
// no error
z();
}

0 comments on commit 114e310

Please sign in to comment.