diff --git a/packages/pyright-internal/src/analyzer/typeEvaluator.ts b/packages/pyright-internal/src/analyzer/typeEvaluator.ts index 448323209..db8963523 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluator.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluator.ts @@ -14622,11 +14622,11 @@ export function createTypeEvaluator( assert(node.nodeType === ParseNodeType.ComprehensionIf); // Evaluate the test expression to validate it and mark symbols - // as referenced. Don't bother doing this if we're in speculative - // mode because it doesn't affect the element type. - if (!isSpeculativeModeInUse(node.testExpression)) { - getTypeOfExpression(node.testExpression); - } + // as referenced. This doesn't affect the type of the evalauted + // comprehension, but it is important for evaluating intermediate + // expressions such as assignment expressions that can affect other + // subexpressions. + getTypeOfExpression(node.testExpression); } return isIncomplete; @@ -19721,7 +19721,7 @@ export function createTypeEvaluator( } case ParseNodeType.AssignmentExpression: { - getTypeOfExpression(curNode); + evaluateTypesForExpressionInContext(curNode); return; } diff --git a/packages/pyright-internal/src/tests/samples/comprehension8.py b/packages/pyright-internal/src/tests/samples/comprehension8.py index 5196e9697..ce71dd1aa 100644 --- a/packages/pyright-internal/src/tests/samples/comprehension8.py +++ b/packages/pyright-internal/src/tests/samples/comprehension8.py @@ -9,7 +9,7 @@ class ClassA: output: str -def func1(foo: ClassA): - foo.output = "".join( - stripped for line in foo.input.splitlines() if (stripped := line.strip()) +def func1(a: ClassA, x: str): + a.output = x.join( + stripped for line in a.input.splitlines() if (stripped := line.strip()) )