mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-18 09:30:35 +00:00
[red-knot] Do not show types for literal expressions on hover (#17290)
## Summary Resolves #17289. After this change, Red Knot will no longer show types on hover for `None`, `...`, `True`, `False`, numbers, strings (but not f-strings), and bytes literals. ## Test Plan Unit tests.
This commit is contained in:
parent
a388c73752
commit
34e06f2d17
2 changed files with 71 additions and 1 deletions
|
@ -1,4 +1,4 @@
|
||||||
use crate::goto::find_goto_target;
|
use crate::goto::{find_goto_target, GotoTarget};
|
||||||
use crate::{Db, MarkupKind, RangedValue};
|
use crate::{Db, MarkupKind, RangedValue};
|
||||||
use red_knot_python_semantic::types::Type;
|
use red_knot_python_semantic::types::Type;
|
||||||
use red_knot_python_semantic::SemanticModel;
|
use red_knot_python_semantic::SemanticModel;
|
||||||
|
@ -12,6 +12,12 @@ pub fn hover(db: &dyn Db, file: File, offset: TextSize) -> Option<RangedValue<Ho
|
||||||
let parsed = parsed_module(db.upcast(), file);
|
let parsed = parsed_module(db.upcast(), file);
|
||||||
let goto_target = find_goto_target(parsed, offset)?;
|
let goto_target = find_goto_target(parsed, offset)?;
|
||||||
|
|
||||||
|
if let GotoTarget::Expression(expr) = goto_target {
|
||||||
|
if expr.is_literal_expr() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let model = SemanticModel::new(db.upcast(), file);
|
let model = SemanticModel::new(db.upcast(), file);
|
||||||
let ty = goto_target.inferred_type(&model)?;
|
let ty = goto_target.inferred_type(&model)?;
|
||||||
|
|
||||||
|
@ -496,6 +502,57 @@ mod tests {
|
||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hover_whitespace() {
|
||||||
|
let test = cursor_test(
|
||||||
|
r#"
|
||||||
|
class C:
|
||||||
|
<CURSOR>
|
||||||
|
foo: str = 'bar'
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_snapshot!(test.hover(), @"Hover provided no content");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hover_literal_int() {
|
||||||
|
let test = cursor_test(
|
||||||
|
r#"
|
||||||
|
print(
|
||||||
|
0 + 1<CURSOR>
|
||||||
|
)
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_snapshot!(test.hover(), @"Hover provided no content");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hover_literal_ellipsis() {
|
||||||
|
let test = cursor_test(
|
||||||
|
r#"
|
||||||
|
print(
|
||||||
|
.<CURSOR>..
|
||||||
|
)
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_snapshot!(test.hover(), @"Hover provided no content");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hover_docstring() {
|
||||||
|
let test = cursor_test(
|
||||||
|
r#"
|
||||||
|
def f():
|
||||||
|
"""Lorem ipsum dolor sit amet.<CURSOR>"""
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_snapshot!(test.hover(), @"Hover provided no content");
|
||||||
|
}
|
||||||
|
|
||||||
impl CursorTest {
|
impl CursorTest {
|
||||||
fn hover(&self) -> String {
|
fn hover(&self) -> String {
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
|
@ -102,6 +102,19 @@ impl Expr {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ExprRef<'_> {
|
impl ExprRef<'_> {
|
||||||
|
/// See [`Expr::is_literal_expr`].
|
||||||
|
pub fn is_literal_expr(&self) -> bool {
|
||||||
|
matches!(
|
||||||
|
self,
|
||||||
|
ExprRef::StringLiteral(_)
|
||||||
|
| ExprRef::BytesLiteral(_)
|
||||||
|
| ExprRef::NumberLiteral(_)
|
||||||
|
| ExprRef::BooleanLiteral(_)
|
||||||
|
| ExprRef::NoneLiteral(_)
|
||||||
|
| ExprRef::EllipsisLiteral(_)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn precedence(&self) -> OperatorPrecedence {
|
pub fn precedence(&self) -> OperatorPrecedence {
|
||||||
OperatorPrecedence::from(self)
|
OperatorPrecedence::from(self)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue