From 63a5d2d86e7eb5803d9cdf582065c9261c3628a9 Mon Sep 17 00:00:00 2001 From: Asuka Minato Date: Sat, 11 Jul 2026 18:44:13 +0900 Subject: [PATCH] fix --- pyrefly/lib/lsp/wasm/hover.rs | 1 + pyrefly/lib/test/lsp/hover.rs | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/pyrefly/lib/lsp/wasm/hover.rs b/pyrefly/lib/lsp/wasm/hover.rs index 948a7bf26a..c5038e60b6 100644 --- a/pyrefly/lib/lsp/wasm/hover.rs +++ b/pyrefly/lib/lsp/wasm/hover.rs @@ -578,6 +578,7 @@ fn class_hover_display( _ => None, }?; constructor.transform_toplevel_callable(|c| expand_callable_kwargs_for_hover(solver, c)); + constructor = solver.for_display(constructor); Some(constructor.as_lsp_string_with_fallback_name(name_for_display, LspDisplayMode::Hover)) } diff --git a/pyrefly/lib/test/lsp/hover.rs b/pyrefly/lib/test/lsp/hover.rs index 826061c42b..dc84fe2dfa 100644 --- a/pyrefly/lib/test/lsp/hover.rs +++ b/pyrefly/lib/test/lsp/hover.rs @@ -1668,6 +1668,28 @@ Box[str]("hello") ); } +// Regression test for https://github.com/facebook/pyrefly/issues/3240 +#[test] +fn hover_on_generic_metaclass_constructor_does_not_show_inference_var() { + let code = r#" +class DeclarativeAttributeIntercept(type): + pass + +class DCTransformDeclarative(DeclarativeAttributeIntercept): +# ^ + pass +"#; + let report = get_batched_lsp_operations_report(&[("main", code)], get_test_report); + assert!( + !report.contains("-> @"), + "Hover must not expose an internal inference variable, got: {report}" + ); + assert!( + report.contains(") -> Self@DeclarativeAttributeIntercept: ..."), + "Hover should resolve the constructor's return type, got: {report}" + ); +} + #[test] fn hover_on_class_type_parameter_shows_variance_covariant() { let code = r#"