Skip to content

Commit 1631365

Browse files
kinto0meta-codesync[bot]
authored andcommitted
Fix hover type for all definition contexts
Summary: Handle FunctionDef, MethodDef, ClassDef, Parameter, TypeParameter, ExceptionHandler, and PatternMatch contexts in get_type_at by constructing a Key::Definition and looking up the type, instead of returning None. This fixes hover on redefined functions (and other cases where definition_at fails to find the definition). Reviewed By: stroxler Differential Revision: D95331714 fbshipit-source-id: 8ecfd7c52692434f346b6735c780bba292b3d810
1 parent cdd00fd commit 1631365

File tree

2 files changed

+44
-21
lines changed

2 files changed

+44
-21
lines changed

pyrefly/lib/state/lsp.rs

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -912,48 +912,72 @@ impl<'a> Transaction<'a> {
912912
self.get_type(handle, &key)
913913
}
914914
Some(IdentifierWithContext {
915-
identifier: _,
915+
identifier,
916916
context:
917917
IdentifierContext::FunctionDef { docstring_range: _ }
918918
| IdentifierContext::MethodDef { docstring_range: _ },
919919
}) => {
920-
// TODO(grievejia): Handle definitions of functions
921-
None
920+
let key = Key::Definition(ShortIdentifier::new(&identifier));
921+
let bindings = self.get_bindings(handle)?;
922+
if !bindings.is_valid_key(&key) {
923+
return None;
924+
}
925+
self.get_type(handle, &key)
922926
}
923927
Some(IdentifierWithContext {
924-
identifier: _,
928+
identifier,
925929
context: IdentifierContext::ClassDef { docstring_range: _ },
926930
}) => {
927-
// TODO(grievejia): Handle definitions of classes
928-
None
931+
let key = Key::Definition(ShortIdentifier::new(&identifier));
932+
let bindings = self.get_bindings(handle)?;
933+
if !bindings.is_valid_key(&key) {
934+
return None;
935+
}
936+
self.get_type(handle, &key)
929937
}
930938
Some(IdentifierWithContext {
931-
identifier: _,
939+
identifier,
932940
context: IdentifierContext::Parameter,
933941
}) => {
934-
// TODO(grievejia): Handle definitions of params
935-
None
942+
let key = Key::Definition(ShortIdentifier::new(&identifier));
943+
let bindings = self.get_bindings(handle)?;
944+
if !bindings.is_valid_key(&key) {
945+
return None;
946+
}
947+
self.get_type(handle, &key)
936948
}
937949
Some(IdentifierWithContext {
938-
identifier: _,
950+
identifier,
939951
context: IdentifierContext::TypeParameter,
940952
}) => {
941-
// TODO(grievejia): Handle definitions of type params
942-
None
953+
let key = Key::Definition(ShortIdentifier::new(&identifier));
954+
let bindings = self.get_bindings(handle)?;
955+
if !bindings.is_valid_key(&key) {
956+
return None;
957+
}
958+
self.get_type(handle, &key)
943959
}
944960
Some(IdentifierWithContext {
945-
identifier: _,
961+
identifier,
946962
context: IdentifierContext::ExceptionHandler,
947963
}) => {
948-
// TODO(grievejia): Handle definitions of exception names
949-
None
964+
let key = Key::Definition(ShortIdentifier::new(&identifier));
965+
let bindings = self.get_bindings(handle)?;
966+
if !bindings.is_valid_key(&key) {
967+
return None;
968+
}
969+
self.get_type(handle, &key)
950970
}
951971
Some(IdentifierWithContext {
952-
identifier: _,
972+
identifier,
953973
context: IdentifierContext::PatternMatch(_),
954974
}) => {
955-
// TODO(grievejia): Handle definitions of pattern-introduced names
956-
None
975+
let key = Key::Definition(ShortIdentifier::new(&identifier));
976+
let bindings = self.get_bindings(handle)?;
977+
if !bindings.is_valid_key(&key) {
978+
return None;
979+
}
980+
self.get_type(handle, &key)
957981
}
958982
Some(IdentifierWithContext {
959983
identifier,

pyrefly/lib/test/lsp/hover_type.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ Hover Result: `(x: list[int], y: str, z: Literal[42]) -> list[int]`
7474
);
7575
}
7676

77-
// TODO(kylei): redefinitions should work. they are especially common in try/except blocks
7877
#[test]
7978
fn redefinition_test() {
8079
let code = r#"
@@ -89,11 +88,11 @@ def f(): ...
8988
# main.py
9089
2 | def f(): ...
9190
^
92-
Hover Result: None
91+
Hover Result: `() -> None`
9392
9493
4 | def f(): ...
9594
^
96-
Hover Result: None
95+
Hover Result: `() -> None`
9796
"#
9897
.trim(),
9998
report.trim(),

0 commit comments

Comments
 (0)