From fde33baaa5391d8ea515fa90ee8b6c10cd25d20c Mon Sep 17 00:00:00 2001 From: Matthew Mckee Date: Mon, 29 Dec 2025 09:30:48 +0000 Subject: [PATCH] [ty] Make the implicit shadowing message on invalid assignment diagnostic `info` (#22219) --- .../resources/mdtest/attributes.md | 2 +- .../resources/mdtest/call/dunder.md | 2 +- .../resources/mdtest/shadowing/class.md | 2 +- .../resources/mdtest/shadowing/function.md | 2 +- ...licit_class_shado…_(c8ff9e3a079e8bd5).snap | 4 ++-- ...licit_function_sh…_(a1515328b775ebc1).snap | 4 ++-- .../src/types/diagnostic.rs | 22 ++++++++----------- 7 files changed, 17 insertions(+), 21 deletions(-) diff --git a/crates/ty_python_semantic/resources/mdtest/attributes.md b/crates/ty_python_semantic/resources/mdtest/attributes.md index c1294b2d5a..f9fa77bb7a 100644 --- a/crates/ty_python_semantic/resources/mdtest/attributes.md +++ b/crates/ty_python_semantic/resources/mdtest/attributes.md @@ -1867,7 +1867,7 @@ def external_getattribute(name) -> int: class ThisFails: def __init__(self): - # error: [invalid-assignment] "Implicit shadowing of function `__getattribute__`" + # error: [invalid-assignment] self.__getattribute__ = external_getattribute # error: [unresolved-attribute] diff --git a/crates/ty_python_semantic/resources/mdtest/call/dunder.md b/crates/ty_python_semantic/resources/mdtest/call/dunder.md index 56c7e5d8ad..258702b6b6 100644 --- a/crates/ty_python_semantic/resources/mdtest/call/dunder.md +++ b/crates/ty_python_semantic/resources/mdtest/call/dunder.md @@ -205,7 +205,7 @@ class C: return str(key) def f(self): - # error: [invalid-assignment] "Implicit shadowing of function `__getitem__`" + # error: [invalid-assignment] self.__getitem__ = None # This is still fine, and simply calls the `__getitem__` method on the class diff --git a/crates/ty_python_semantic/resources/mdtest/shadowing/class.md b/crates/ty_python_semantic/resources/mdtest/shadowing/class.md index 97550ec57c..2f2cae26e7 100644 --- a/crates/ty_python_semantic/resources/mdtest/shadowing/class.md +++ b/crates/ty_python_semantic/resources/mdtest/shadowing/class.md @@ -5,7 +5,7 @@ ```py class C: ... -C = 1 # error: "Implicit shadowing of class `C`" +C = 1 # error: [invalid-assignment] ``` ## Explicit diff --git a/crates/ty_python_semantic/resources/mdtest/shadowing/function.md b/crates/ty_python_semantic/resources/mdtest/shadowing/function.md index dda365e13a..cf5f07f4ad 100644 --- a/crates/ty_python_semantic/resources/mdtest/shadowing/function.md +++ b/crates/ty_python_semantic/resources/mdtest/shadowing/function.md @@ -15,7 +15,7 @@ def f(x: str): ```py def f(): ... -f = 1 # error: "Implicit shadowing of function `f`" +f = 1 # error: [invalid-assignment] ``` ## Explicit shadowing diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_class_shado…_(c8ff9e3a079e8bd5).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_class_shado…_(c8ff9e3a079e8bd5).snap index 9c2fa5e925..0e44e1e9e2 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_class_shado…_(c8ff9e3a079e8bd5).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_class_shado…_(c8ff9e3a079e8bd5).snap @@ -20,7 +20,7 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/diagnostics/shadowing.md # Diagnostics ``` -error[invalid-assignment]: Implicit shadowing of class `C` +error[invalid-assignment]: Object of type `Literal[1]` is not assignable to `` --> src/mdtest_snippet.py:3:1 | 1 | class C: ... @@ -30,7 +30,7 @@ error[invalid-assignment]: Implicit shadowing of class `C` | | | Declared type `` | -info: Annotate to make it explicit if this is intentional +info: Implicit shadowing of class `C`, add an annotation to make it explicit if this is intentional info: rule `invalid-assignment` is enabled by default ``` diff --git a/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_function_sh…_(a1515328b775ebc1).snap b/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_function_sh…_(a1515328b775ebc1).snap index e642105997..4a502635f3 100644 --- a/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_function_sh…_(a1515328b775ebc1).snap +++ b/crates/ty_python_semantic/resources/mdtest/snapshots/shadowing.md_-_Shadowing_-_Implicit_function_sh…_(a1515328b775ebc1).snap @@ -20,7 +20,7 @@ mdtest path: crates/ty_python_semantic/resources/mdtest/diagnostics/shadowing.md # Diagnostics ``` -error[invalid-assignment]: Implicit shadowing of function `f` +error[invalid-assignment]: Object of type `Literal[1]` is not assignable to `def f() -> Unknown` --> src/mdtest_snippet.py:3:1 | 1 | def f(): ... @@ -30,7 +30,7 @@ error[invalid-assignment]: Implicit shadowing of function `f` | | | Declared type `def f() -> Unknown` | -info: Annotate to make it explicit if this is intentional +info: Implicit shadowing of function `f`, add an annotation to make it explicit if this is intentional info: rule `invalid-assignment` is enabled by default ``` diff --git a/crates/ty_python_semantic/src/types/diagnostic.rs b/crates/ty_python_semantic/src/types/diagnostic.rs index 1657487dab..0f1a23aae5 100644 --- a/crates/ty_python_semantic/src/types/diagnostic.rs +++ b/crates/ty_python_semantic/src/types/diagnostic.rs @@ -2452,29 +2452,25 @@ fn report_invalid_assignment_with_message<'db, 'ctx: 'db, T: Ranged>( message: std::fmt::Arguments, ) -> Option> { let builder = context.report_lint(&INVALID_ASSIGNMENT, node)?; + + let mut diag = builder.into_diagnostic(message); + match target_ty { Type::ClassLiteral(class) => { - let mut diag = builder.into_diagnostic(format_args!( - "Implicit shadowing of class `{}`", + diag.info(format_args!( + "Implicit shadowing of class `{}`, add an annotation to make it explicit if this is intentional", class.name(context.db()), )); - diag.info("Annotate to make it explicit if this is intentional"); - Some(diag) } Type::FunctionLiteral(function) => { - let mut diag = builder.into_diagnostic(format_args!( - "Implicit shadowing of function `{}`", + diag.info(format_args!( + "Implicit shadowing of function `{}`, add an annotation to make it explicit if this is intentional", function.name(context.db()), )); - diag.info("Annotate to make it explicit if this is intentional"); - Some(diag) - } - - _ => { - let diag = builder.into_diagnostic(message); - Some(diag) } + _ => {} } + Some(diag) } pub(super) fn report_invalid_assignment<'db>(