From d2816bf98e6ceb6d33fec5977ca80fbbd6762c4f Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Sun, 15 Dec 2024 12:09:34 -0800 Subject: [PATCH] Fixed bug that results in spurious type evaluation error when an operator overload method like `__add__` is implemented with a descriptor object. This addresses #9574. --- packages/pyright-internal/src/analyzer/typeEvaluator.ts | 8 ++++++-- .../pyright-internal/src/analyzer/typeEvaluatorTypes.ts | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/pyright-internal/src/analyzer/typeEvaluator.ts b/packages/pyright-internal/src/analyzer/typeEvaluator.ts index 0e65bbd5e1cc..512b0d5c10b0 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluator.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluator.ts @@ -2412,11 +2412,12 @@ export function createTypeEvaluator( classType: ClassType, memberName: string, selfType?: ClassType | TypeVarType | undefined, + errorNode?: ExpressionNode | undefined, diag?: DiagnosticAddendum, recursionCount = 0 ): FunctionType | OverloadedType | undefined { const boundMethodResult = getTypeOfBoundMember( - /* errorNode */ undefined, + errorNode, classType, memberName, /* usage */ undefined, @@ -2444,6 +2445,7 @@ export function createTypeEvaluator( boundMethodResult.type, '__call__', /* selfType */ undefined, + errorNode, diag, recursionCount ); @@ -13469,7 +13471,7 @@ export function createTypeEvaluator( const concreteSubtype = makeTopLevelTypeVarsConcrete(subtype); if (isClass(concreteSubtype)) { - magicMethodType = getBoundMagicMethod(concreteSubtype, methodName, subtype, diag); + magicMethodType = getBoundMagicMethod(concreteSubtype, methodName, subtype, errorNode, diag); } if (magicMethodType) { @@ -24738,6 +24740,7 @@ export function createTypeEvaluator( concreteSrcType, '__call__', /* selfType */ undefined, + /* errorNode */ undefined, /* diag */ undefined, recursionCount ); @@ -25667,6 +25670,7 @@ export function createTypeEvaluator( objType, '__call__', /* selfType */ undefined, + /* errorNode */ undefined, /* diag */ undefined, recursionCount ); diff --git a/packages/pyright-internal/src/analyzer/typeEvaluatorTypes.ts b/packages/pyright-internal/src/analyzer/typeEvaluatorTypes.ts index e85c84615776..a2137df86599 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluatorTypes.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluatorTypes.ts @@ -742,6 +742,7 @@ export interface TypeEvaluator { classType: ClassType, memberName: string, selfType?: ClassType | TypeVarType | undefined, + errorNode?: ExpressionNode | undefined, diag?: DiagnosticAddendum, recursionCount?: number ) => FunctionType | OverloadedType | undefined;