Skip to content

Commit

Permalink
Added support for Final and ClassVar annotations embedded within …
Browse files Browse the repository at this point in the history
…`Annotated`. Runtime support has recently been added for this case.
  • Loading branch information
msfterictraut committed Jan 25, 2022
1 parent cb36725 commit 8ce7fa6
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
15 changes: 7 additions & 8 deletions packages/pyright-internal/src/analyzer/typeEvaluator.ts
Expand Up @@ -6179,18 +6179,19 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
const typeArgs: TypeResult[] = [];
let adjFlags = flags;

if (isFinalAnnotation) {
adjFlags |= EvaluatorFlags.FinalDisallowed;
} else if (isClassVarAnnotation) {
adjFlags |= EvaluatorFlags.ClassVarDisallowed;
if (isFinalAnnotation || isClassVarAnnotation) {
adjFlags |= EvaluatorFlags.ClassVarDisallowed | EvaluatorFlags.FinalDisallowed;
} else {
adjFlags &= ~(
EvaluatorFlags.DoNotSpecialize |
EvaluatorFlags.ParamSpecDisallowed |
EvaluatorFlags.TypeVarTupleDisallowed |
EvaluatorFlags.RequiredAllowed
);
adjFlags |= EvaluatorFlags.ClassVarDisallowed;

if (!isAnnotatedClass) {
adjFlags |= EvaluatorFlags.ClassVarDisallowed | EvaluatorFlags.FinalDisallowed;
}
}

// Create a local function that validates a single type argument.
Expand Down Expand Up @@ -6267,9 +6268,7 @@ export function createTypeEvaluator(importLookup: ImportLookup, evaluatorOptions
EvaluatorFlags.ExpectingType |
EvaluatorFlags.ExpectingTypeAnnotation |
EvaluatorFlags.ConvertEllipsisToAny |
EvaluatorFlags.EvaluateStringLiteralAsType |
EvaluatorFlags.FinalDisallowed |
EvaluatorFlags.ClassVarDisallowed;
EvaluatorFlags.EvaluateStringLiteralAsType;

const fileInfo = AnalyzerNodeInfo.getFileInfo(node);
if (fileInfo.isStubFile) {
Expand Down
7 changes: 6 additions & 1 deletion packages/pyright-internal/src/tests/samples/annotated1.py
@@ -1,7 +1,7 @@
# This sample tests handling of the Python 3.9 "Annotated" feature
# described in PEP 593.

from typing import Annotated, TypeVar
from typing import Annotated, TypeVar, ClassVar, Final


class struct2:
Expand Down Expand Up @@ -53,3 +53,8 @@ def func2(a: TypeWithStringArg):
Param = Annotated[_T, "x"]

x: Param[int] = 3


class A:
classvar: Annotated[ClassVar[int], (2, 5)] = 4
const: Annotated[Final[int], "metadata"] = 4

1 comment on commit 8ce7fa6

@GBeauregard
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. See also https://bugs.python.org/issue46511 for the corresponding dataclasses change (pending feedback). I'll try to make sure typing_extensions is sorted as well.

Please sign in to comment.