From 76ea0f8aa5bdcbf09a64e378b964ba40287d1369 Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Tue, 1 Aug 2023 13:16:08 -0600 Subject: [PATCH] Fixed a bug that resulted in a false positive error when a captured variable within an inner scope (function or lambda) is imported from another module using an import statement that comes after the function or lambda. This addresses https://github.com/microsoft/pyright/issues/5618. (#5623) Co-authored-by: Eric Traut --- packages/pyright-internal/src/analyzer/binder.ts | 6 ++++++ packages/pyright-internal/src/analyzer/typeEvaluator.ts | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/pyright-internal/src/analyzer/binder.ts b/packages/pyright-internal/src/analyzer/binder.ts index 81ab124ffba2..6b4dcb18599d 100644 --- a/packages/pyright-internal/src/analyzer/binder.ts +++ b/packages/pyright-internal/src/analyzer/binder.ts @@ -1732,6 +1732,8 @@ export class Binder extends ParseTreeWalker { const dataclassesSymbolsOfInterest = ['InitVar']; const importInfo = AnalyzerNodeInfo.getImportInfo(node.module); + AnalyzerNodeInfo.setFlowNode(node, this._currentFlowNode!); + let resolvedPath = ''; if (importInfo && importInfo.isImportFound && !importInfo.isNativeLib) { resolvedPath = importInfo.resolvedPaths[importInfo.resolvedPaths.length - 1]; @@ -1874,6 +1876,8 @@ export class Binder extends ParseTreeWalker { const importedName = importSymbolNode.name.value; const nameNode = importSymbolNode.alias || importSymbolNode.name; + AnalyzerNodeInfo.setFlowNode(importSymbolNode, this._currentFlowNode!); + const symbol = this._bindNameToScope(this._currentScope, nameNode); if (symbol) { @@ -2487,6 +2491,8 @@ export class Binder extends ParseTreeWalker { ) { const firstNamePartValue = node.module.nameParts[0].value; + AnalyzerNodeInfo.setFlowNode(node, this._currentFlowNode!); + // See if there's already a matching alias declaration for this import. // if so, we'll update it rather than creating a new one. This is required // to handle cases where multiple import statements target the same diff --git a/packages/pyright-internal/src/analyzer/typeEvaluator.ts b/packages/pyright-internal/src/analyzer/typeEvaluator.ts index 9cf2c2e681b2..365067d6d55d 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluator.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluator.ts @@ -4452,11 +4452,6 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions return true; } - // Assume alias declarations are also always safe to narrow. - if (decl.type === DeclarationType.Alias) { - return true; - } - const declCodeFlowNode = AnalyzerNodeInfo.getFlowNode(decl.node); if (!declCodeFlowNode) { return false;