From 5cc6762c230bd7e96c07dd3d90dfa6a5b9d10efc Mon Sep 17 00:00:00 2001 From: Aria Desires Date: Thu, 3 Jul 2025 19:14:55 -0400 Subject: [PATCH] fixup --- crates/ty_ide/src/goto.rs | 69 ++++++++++++------- .../ty_python_semantic/src/semantic_model.rs | 40 +++++------ .../ty_python_semantic/src/types/call/bind.rs | 2 +- 3 files changed, 66 insertions(+), 45 deletions(-) diff --git a/crates/ty_ide/src/goto.rs b/crates/ty_ide/src/goto.rs index 7455b5c658..abcc1283a9 100644 --- a/crates/ty_ide/src/goto.rs +++ b/crates/ty_ide/src/goto.rs @@ -1195,8 +1195,9 @@ f(**kwargs) fn goto_def_class() { let test = cursor_test( r#" - class AB(val: int): - self.myval = val + class AB: + def __init__(self, val: int): + self.myval = val x = AB(5) "#, @@ -1206,27 +1207,46 @@ f(**kwargs) info[goto-type-definition]: Type definition --> main.py:2:19 | - 2 | class AB(val: int): + 2 | class AB: | ^^ - 3 | self.myval = val + 3 | def __init__(self, val: int): + 4 | self.myval = val | info: Source - --> main.py:5:17 + --> main.py:6:17 | - 3 | self.myval = val - 4 | - 5 | x = AB(5) + 4 | self.myval = val + 5 | + 6 | x = AB(5) | ^^ | "); } #[test] - fn goto_def_class_instance_variable() { + fn goto_def_class_implicit_instance_variable() { let test = cursor_test( r#" - class AB(val: int): - self.myval = val + class AB: + def __init__(self, val: int): + self.myval = val + + x = AB(5) + print(x.myval) + "#, + ); + + assert_snapshot!(test.goto_definition(), @"No goto target found"); + } + + #[test] + fn goto_def_class_explicit_instance_variable() { + let test = cursor_test( + r#" + class AB: + myval: int + def __init__(self, val: int): + self.myval = val x = AB(5) print(x.myval) @@ -1240,8 +1260,9 @@ f(**kwargs) fn goto_def_path_parent() { let test = cursor_test( r#" - class AB(val: int): - self.myval = val + class AB: + def __init__(self, val: int): + self.myval = val xyz = AB(5) print(xyz.myval) @@ -1250,19 +1271,19 @@ f(**kwargs) assert_snapshot!(test.goto_definition(), @r" info[goto-type-definition]: Type definition - --> main.py:5:13 + --> main.py:6:13 | - 3 | self.myval = val - 4 | - 5 | xyz = AB(5) + 4 | self.myval = val + 5 | + 6 | xyz = AB(5) | ^^^ - 6 | print(xyz.myval) + 7 | print(xyz.myval) | info: Source - --> main.py:6:19 + --> main.py:7:19 | - 5 | xyz = AB(5) - 6 | print(xyz.myval) + 6 | xyz = AB(5) + 7 | print(xyz.myval) | ^^^ | "); @@ -1272,7 +1293,7 @@ f(**kwargs) fn goto_def_class_class_variable() { let test = cursor_test( r#" - class AB(): + class AB: RED = "red" BLUE = "blue" @@ -1287,7 +1308,7 @@ f(**kwargs) fn goto_def_class_path_parent() { let test = cursor_test( r#" - class AB(): + class AB: RED = "red" BLUE = "blue" @@ -1299,7 +1320,7 @@ f(**kwargs) info[goto-type-definition]: Type definition --> main.py:2:19 | - 2 | class AB(): + 2 | class AB: | ^^ 3 | RED = "red" 4 | BLUE = "blue" diff --git a/crates/ty_python_semantic/src/semantic_model.rs b/crates/ty_python_semantic/src/semantic_model.rs index 398f1f7ec4..d2986ef645 100644 --- a/crates/ty_python_semantic/src/semantic_model.rs +++ b/crates/ty_python_semantic/src/semantic_model.rs @@ -187,27 +187,27 @@ pub trait HasDefinition { impl HasDefinition for ast::ExprRef<'_> { fn definitions<'db>(&self, model: &SemanticModel<'db>) -> Option>> { - let ExprRef::Name(name) = self else { - return None; - }; - match name.ctx { - ExprContext::Load => { - let index = semantic_index(model.db, model.file); - let file_scope = index.expression_scope_id(*self); - let scope = file_scope.to_scope_id(model.db, model.file); - let use_def = index.use_def_map(file_scope); - let use_id = self.scoped_use_id(model.db, scope); + match self { + ExprRef::Name(name) => match name.ctx { + ExprContext::Load => { + let index = semantic_index(model.db, model.file); + let file_scope = index.expression_scope_id(*self); + let scope = file_scope.to_scope_id(model.db, model.file); + let use_def = index.use_def_map(file_scope); + let use_id = self.scoped_use_id(model.db, scope); - Some( - use_def - .bindings_at_use(use_id) - .filter_map(|binding| binding.binding.definition()) - .collect(), - ) - } - ExprContext::Store => None, - ExprContext::Del => None, - ExprContext::Invalid => None, + Some( + use_def + .bindings_at_use(use_id) + .filter_map(|binding| binding.binding.definition()) + .collect(), + ) + } + ExprContext::Store => None, + ExprContext::Del => None, + ExprContext::Invalid => None, + }, + _ => None, } } } diff --git a/crates/ty_python_semantic/src/types/call/bind.rs b/crates/ty_python_semantic/src/types/call/bind.rs index 23719419bd..ec2209c58e 100644 --- a/crates/ty_python_semantic/src/types/call/bind.rs +++ b/crates/ty_python_semantic/src/types/call/bind.rs @@ -2667,7 +2667,7 @@ impl<'db> BindingError<'db> { if let Some(builder) = context.report_lint(&MISSING_ARGUMENT, node) { let s = if parameters.0.len() == 1 { "" } else { "s" }; let mut diag = builder.into_diagnostic(format_args!( - "No argument{s} provided for required parameterzz{s} {parameters}{}", + "No argument{s} provided for required parameter{s} {parameters}{}", if let Some(CallableDescription { kind, name }) = callable_description { format!(" of {kind} `{name}`") } else {