[ty] Use invalid-assignment error code for invalid assignments to ClassVars (#20156)

## Summary

This error is about assigning to attributes rather than reading
attributes, so I think `invalid-assignment` makes more sense than
`invalid-attribute-access`

## Test Plan

existing mdtests updated
This commit is contained in:
Alex Waygood 2025-08-29 18:43:30 +01:00 committed by GitHub
parent fa7798ddd9
commit 9b1b58a451
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 15 additions and 15 deletions

View file

@ -699,7 +699,7 @@ reveal_type(c_instance.pure_class_variable1) # revealed: str
reveal_type(c_instance.pure_class_variable2) # revealed: Unknown | Literal[1] reveal_type(c_instance.pure_class_variable2) # revealed: Unknown | Literal[1]
# error: [invalid-attribute-access] "Cannot assign to ClassVar `pure_class_variable1` from an instance of type `C`" # error: [invalid-assignment] "Cannot assign to ClassVar `pure_class_variable1` from an instance of type `C`"
c_instance.pure_class_variable1 = "value set on instance" c_instance.pure_class_variable1 = "value set on instance"
C.pure_class_variable1 = "overwritten on class" C.pure_class_variable1 = "overwritten on class"

View file

@ -53,7 +53,7 @@ C.attr = 1 # fine
C.attr = "wrong" # error: [invalid-assignment] C.attr = "wrong" # error: [invalid-assignment]
instance = C() instance = C()
instance.attr = 1 # error: [invalid-attribute-access] instance.attr = 1 # error: [invalid-assignment]
``` ```
## Unknown attributes ## Unknown attributes

View file

@ -1387,7 +1387,7 @@ class ClassVarXProto(Protocol):
def f(obj: ClassVarXProto): def f(obj: ClassVarXProto):
reveal_type(obj.x) # revealed: int reveal_type(obj.x) # revealed: int
reveal_type(type(obj).x) # revealed: int reveal_type(type(obj).x) # revealed: int
obj.x = 42 # error: [invalid-attribute-access] "Cannot assign to ClassVar `x` from an instance of type `ClassVarXProto`" obj.x = 42 # error: [invalid-assignment] "Cannot assign to ClassVar `x` from an instance of type `ClassVarXProto`"
class InstanceAttrX: class InstanceAttrX:
x: int x: int

View file

@ -21,7 +21,7 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/diagnostics/attribute_as
7 | C.attr = "wrong" # error: [invalid-assignment] 7 | C.attr = "wrong" # error: [invalid-assignment]
8 | 8 |
9 | instance = C() 9 | instance = C()
10 | instance.attr = 1 # error: [invalid-attribute-access] 10 | instance.attr = 1 # error: [invalid-assignment]
``` ```
# Diagnostics # Diagnostics
@ -41,13 +41,13 @@ info: rule `invalid-assignment` is enabled by default
``` ```
``` ```
error[invalid-attribute-access]: Cannot assign to ClassVar `attr` from an instance of type `C` error[invalid-assignment]: Cannot assign to ClassVar `attr` from an instance of type `C`
--> src/mdtest_snippet.py:10:1 --> src/mdtest_snippet.py:10:1
| |
9 | instance = C() 9 | instance = C()
10 | instance.attr = 1 # error: [invalid-attribute-access] 10 | instance.attr = 1 # error: [invalid-assignment]
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
| |
info: rule `invalid-attribute-access` is enabled by default info: rule `invalid-assignment` is enabled by default
``` ```

View file

@ -26,15 +26,15 @@ reveal_type(C.e) # revealed: int
c = C() c = C()
# error: [invalid-attribute-access] # error: [invalid-assignment]
c.a = 2 c.a = 2
# error: [invalid-attribute-access] # error: [invalid-assignment]
c.b = 2 c.b = 2
# error: [invalid-attribute-access] # error: [invalid-assignment]
c.c = 2 c.c = 2
# error: [invalid-attribute-access] # error: [invalid-assignment]
c.d = 2 c.d = 2
# error: [invalid-attribute-access] # error: [invalid-assignment]
c.e = 2 c.e = 2
``` ```
@ -58,7 +58,7 @@ class C:
from module import C from module import C
c = C() c = C()
c.a = 2 # error: [invalid-attribute-access] c.a = 2 # error: [invalid-assignment]
``` ```
## Conflicting type qualifiers ## Conflicting type qualifiers
@ -82,7 +82,7 @@ reveal_type(C.a) # revealed: int | str
c = C() c = C()
# error: [invalid-attribute-access] # error: [invalid-assignment]
c.a = 2 c.a = 2
``` ```

View file

@ -4195,7 +4195,7 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
meta_attr @ PlaceAndQualifiers { .. } if meta_attr.is_class_var() => { meta_attr @ PlaceAndQualifiers { .. } if meta_attr.is_class_var() => {
if emit_diagnostics { if emit_diagnostics {
if let Some(builder) = if let Some(builder) =
self.context.report_lint(&INVALID_ATTRIBUTE_ACCESS, target) self.context.report_lint(&INVALID_ASSIGNMENT, target)
{ {
builder.into_diagnostic(format_args!( builder.into_diagnostic(format_args!(
"Cannot assign to ClassVar `{attribute}` \ "Cannot assign to ClassVar `{attribute}` \