diff --git a/packages/pyright-internal/src/analyzer/typeEvaluator.ts b/packages/pyright-internal/src/analyzer/typeEvaluator.ts index 857665fc6..0e23b4780 100644 --- a/packages/pyright-internal/src/analyzer/typeEvaluator.ts +++ b/packages/pyright-internal/src/analyzer/typeEvaluator.ts @@ -11843,8 +11843,9 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions ? EvaluatorFlags.AllowMissingTypeArgs | EvaluatorFlags.EvaluateStringLiteralAsType | EvaluatorFlags.DisallowParamSpec | - EvaluatorFlags.DisallowTypeVarTuple - : EvaluatorFlags.DoNotSpecialize; + EvaluatorFlags.DisallowTypeVarTuple | + EvaluatorFlags.DisallowFinal + : EvaluatorFlags.DoNotSpecialize | EvaluatorFlags.DisallowFinal; const exprTypeResult = getTypeOfExpression( argParam.argument.valueExpression, flags, @@ -14929,7 +14930,7 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions ): Type { if (flags & EvaluatorFlags.DisallowFinal) { addError(LocMessage.finalContext(), errorNode); - return AnyType.create(); + return classType; } if (!typeArgs || typeArgs.length === 0) { @@ -14940,7 +14941,7 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions addError(LocMessage.finalTooManyArgs(), errorNode); } - return typeArgs[0].type; + return TypeBase.cloneAsSpecialForm(typeArgs[0].type, classType); } function createConcatenateType( diff --git a/packages/pyright-internal/src/tests/samples/final3.py b/packages/pyright-internal/src/tests/samples/final3.py index ecc4549c5..3e50bbbef 100644 --- a/packages/pyright-internal/src/tests/samples/final3.py +++ b/packages/pyright-internal/src/tests/samples/final3.py @@ -2,7 +2,9 @@ # introduced in Python 3.8. import typing -from typing import Any, Final, Protocol +from typing import Any, Final, Protocol, TypeVar + +T = TypeVar("T") foo1: typing.Final = 3 @@ -181,3 +183,11 @@ class ClassB: class ClassC(Protocol): x: Final[int] + + +def func3(x: type[T]) -> T: + return x() + + +# This should generate two errors because Final isn't compatible with type. +func3(Final[int]) diff --git a/packages/pyright-internal/src/tests/typeEvaluator4.test.ts b/packages/pyright-internal/src/tests/typeEvaluator4.test.ts index e6e9a567e..faff362fe 100644 --- a/packages/pyright-internal/src/tests/typeEvaluator4.test.ts +++ b/packages/pyright-internal/src/tests/typeEvaluator4.test.ts @@ -367,7 +367,7 @@ test('Final2', () => { test('Final3', () => { const analysisResults = TestUtils.typeAnalyzeSampleFiles(['final3.py']); - TestUtils.validateResults(analysisResults, 28); + TestUtils.validateResults(analysisResults, 30); }); test('Final4', () => {