From 54228277a5e9eee6de0d5429e7fe204d66b04c0e Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Wed, 13 Oct 2021 14:39:52 -0700 Subject: [PATCH] Added support for an unpacked tuple assignment within an instance method when the source of the assignment is the `self` parameter. --- .../src/analyzer/typeEvaluator.ts | 2 ++ .../src/tests/samples/namedTuples5.py | 15 +++++++++++++++ .../src/tests/typeEvaluator1.test.ts | 6 ++++++ 3 files changed, 23 insertions(+) create mode 100644 packages/pyright-internal/src/tests/samples/namedTuples5.py diff --git a/packages/pyright-internal/src/analyzer/typeEvaluator.ts b/packages/pyright-internal/src/analyzer/typeEvaluator.ts index a3428ac9789f..dc56f88ce227 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluator.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluator.ts @@ -2494,6 +2494,8 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions // entries at that location. const unpackIndex = target.expressions.findIndex((expr) => expr.nodeType === ParseNodeType.Unpack); + type = makeTopLevelTypeVarsConcrete(type); + doForEachSubtype(type, (subtype) => { // Is this subtype a tuple? const tupleType = getSpecializedTupleType(subtype); diff --git a/packages/pyright-internal/src/tests/samples/namedTuples5.py b/packages/pyright-internal/src/tests/samples/namedTuples5.py new file mode 100644 index 000000000000..334a4d06d4ab --- /dev/null +++ b/packages/pyright-internal/src/tests/samples/namedTuples5.py @@ -0,0 +1,15 @@ +# This sample tests the case where a NamedTuple object is referenced +# through a `self` parameter. + +from typing import Literal, NamedTuple + + +class Fruit(NamedTuple): + name: str + cost: float + + def new_cost(self, new_cost: float): + my_name, my_cost = self + t1: Literal["str"] = reveal_type(my_name) + t2: Literal["float"] = reveal_type(my_cost) + return Fruit(my_name, new_cost) diff --git a/packages/pyright-internal/src/tests/typeEvaluator1.test.ts b/packages/pyright-internal/src/tests/typeEvaluator1.test.ts index f8149488ec45..f23a73ff4dc9 100644 --- a/packages/pyright-internal/src/tests/typeEvaluator1.test.ts +++ b/packages/pyright-internal/src/tests/typeEvaluator1.test.ts @@ -1013,6 +1013,12 @@ test('NamedTuples4', () => { TestUtils.validateResults(analysisResults, 0); }); +test('NamedTuples5', () => { + const analysisResults = TestUtils.typeAnalyzeSampleFiles(['namedTuples5.py']); + + TestUtils.validateResults(analysisResults, 0); +}); + test('Slots1', () => { const analysisResults = TestUtils.typeAnalyzeSampleFiles(['slots1.py']);