@@ -4392,7 +4392,7 @@ export function createTypeEvaluator(
43924392 case ParseNodeType.TypeAnnotation: {
43934393 let annotationType: Type | undefined = getTypeOfAnnotation(target.d.annotation, {
43944394 varTypeAnnotation: true,
4395- allowFinal: ParseTreeUtils. isFinalAllowedForAssignmentTarget(target.d.valueExpr),
4395+ allowFinal: isFinalAllowedForAssignmentTarget(target.d.valueExpr),
43964396 allowClassVar: isClassVarAllowedForAssignmentTarget(target.d.valueExpr),
43974397 });
43984398
@@ -4467,18 +4467,34 @@ export function createTypeEvaluator(
44674467 }
44684468
44694469 function isClassVarAllowedForAssignmentTarget(targetNode: ExpressionNode): boolean {
4470+ // ClassVar is allowed only in a class body.
44704471 const classNode = ParseTreeUtils.getEnclosingClass(targetNode, /* stopAtFunction */ true);
44714472 if (!classNode) {
44724473 return false;
44734474 }
44744475
44754476 // ClassVar is not allowed in a TypedDict or a NamedTuple class.
4477+ return !isInTypedDictOrNamedTuple(classNode);
4478+ }
4479+
4480+ function isFinalAllowedForAssignmentTarget(targetNode: ExpressionNode): boolean {
4481+ const classNode = ParseTreeUtils.getEnclosingClass(targetNode, /* stopAtFunction */ true);
4482+
4483+ // Final is not allowed in the body of a TypedDict or NamedTuple class.
4484+ if (classNode && isInTypedDictOrNamedTuple(classNode)) {
4485+ return false;
4486+ }
4487+
4488+ return ParseTreeUtils.isFinalAllowedForAssignmentTarget(targetNode);
4489+ }
4490+
4491+ function isInTypedDictOrNamedTuple(classNode: ClassNode): boolean {
44764492 const classType = getTypeOfClass(classNode)?.classType;
44774493 if (!classType) {
44784494 return false;
44794495 }
44804496
4481- return ! ClassType.isTypedDictClass(classType) && !classType.shared.namedTupleEntries;
4497+ return ClassType.isTypedDictClass(classType) || ! !classType.shared.namedTupleEntries;
44824498 }
44834499
44844500 function verifyRaiseExceptionType(node: ExpressionNode, allowNone: boolean) {
@@ -20038,7 +20054,7 @@ export function createTypeEvaluator(
2003820054 } else {
2003920055 const annotationType = getTypeOfAnnotation(node.d.annotation, {
2004020056 varTypeAnnotation: true,
20041- allowFinal: ParseTreeUtils. isFinalAllowedForAssignmentTarget(node.d.valueExpr),
20057+ allowFinal: isFinalAllowedForAssignmentTarget(node.d.valueExpr),
2004220058 allowClassVar: isClassVarAllowedForAssignmentTarget(node.d.valueExpr),
2004320059 });
2004420060
@@ -20187,7 +20203,7 @@ export function createTypeEvaluator(
2018720203 if (annotationNode === annotationParent.d.annotationComment) {
2018820204 getTypeOfAnnotation(annotationNode, {
2018920205 varTypeAnnotation: true,
20190- allowFinal: ParseTreeUtils. isFinalAllowedForAssignmentTarget(annotationParent.d.leftExpr),
20206+ allowFinal: isFinalAllowedForAssignmentTarget(annotationParent.d.leftExpr),
2019120207 allowClassVar: isClassVarAllowedForAssignmentTarget(annotationParent.d.leftExpr),
2019220208 });
2019320209 } else {
@@ -22169,7 +22185,7 @@ export function createTypeEvaluator(
2216922185 ? declaration.node.parent
2217022186 : declaration.node;
2217122187 const allowClassVar = isClassVarAllowedForAssignmentTarget(declNode);
22172- const allowFinal = ParseTreeUtils. isFinalAllowedForAssignmentTarget(declNode);
22188+ const allowFinal = isFinalAllowedForAssignmentTarget(declNode);
2217322189 const allowRequired =
2217422190 ParseTreeUtils.isRequiredAllowedForAssignmentTarget(declNode) ||
2217522191 !!declaration.isInInlinedTypedDict;
0 commit comments