@@ -10,7 +10,20 @@ use ra_syntax::{
1010
1111use crate :: { FileId , FunctionSignature } ;
1212
13- #[ derive( Debug , PartialEq , Eq ) ]
13+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
14+ pub struct InlayConfig {
15+ pub type_hints : bool ,
16+ pub parameter_hints : bool ,
17+ pub max_length : Option < usize > ,
18+ }
19+
20+ impl Default for InlayConfig {
21+ fn default ( ) -> Self {
22+ Self { type_hints : true , parameter_hints : true , max_length : None }
23+ }
24+ }
25+
26+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
1427pub enum InlayKind {
1528 TypeHint ,
1629 ParameterHint ,
@@ -26,7 +39,7 @@ pub struct InlayHint {
2639pub ( crate ) fn inlay_hints (
2740 db : & RootDatabase ,
2841 file_id : FileId ,
29- max_inlay_hint_length : Option < usize > ,
42+ inlay_hint_opts : & InlayConfig ,
3043) -> Vec < InlayHint > {
3144 let _p = profile ( "inlay_hints" ) ;
3245 let sema = Semantics :: new ( db) ;
@@ -36,9 +49,9 @@ pub(crate) fn inlay_hints(
3649 for node in file. syntax ( ) . descendants ( ) {
3750 match_ast ! {
3851 match node {
39- ast:: CallExpr ( it) => { get_param_name_hints( & mut res, & sema, ast:: Expr :: from( it) ) ; } ,
40- ast:: MethodCallExpr ( it) => { get_param_name_hints( & mut res, & sema, ast:: Expr :: from( it) ) ; } ,
41- ast:: BindPat ( it) => { get_bind_pat_hints( & mut res, & sema, max_inlay_hint_length , it) ; } ,
52+ ast:: CallExpr ( it) => { get_param_name_hints( & mut res, & sema, inlay_hint_opts , ast:: Expr :: from( it) ) ; } ,
53+ ast:: MethodCallExpr ( it) => { get_param_name_hints( & mut res, & sema, inlay_hint_opts , ast:: Expr :: from( it) ) ; } ,
54+ ast:: BindPat ( it) => { get_bind_pat_hints( & mut res, & sema, inlay_hint_opts , it) ; } ,
4255 _ => ( ) ,
4356 }
4457 }
@@ -49,8 +62,13 @@ pub(crate) fn inlay_hints(
4962fn get_param_name_hints (
5063 acc : & mut Vec < InlayHint > ,
5164 sema : & Semantics < RootDatabase > ,
65+ inlay_hint_opts : & InlayConfig ,
5266 expr : ast:: Expr ,
5367) -> Option < ( ) > {
68+ if !inlay_hint_opts. parameter_hints {
69+ return None ;
70+ }
71+
5472 let args = match & expr {
5573 ast:: Expr :: CallExpr ( expr) => expr. arg_list ( ) ?. args ( ) ,
5674 ast:: Expr :: MethodCallExpr ( expr) => expr. arg_list ( ) ?. args ( ) ,
@@ -84,9 +102,13 @@ fn get_param_name_hints(
84102fn get_bind_pat_hints (
85103 acc : & mut Vec < InlayHint > ,
86104 sema : & Semantics < RootDatabase > ,
87- max_inlay_hint_length : Option < usize > ,
105+ inlay_hint_opts : & InlayConfig ,
88106 pat : ast:: BindPat ,
89107) -> Option < ( ) > {
108+ if !inlay_hint_opts. type_hints {
109+ return None ;
110+ }
111+
90112 let ty = sema. type_of_pat ( & pat. clone ( ) . into ( ) ) ?;
91113
92114 if should_not_display_type_hint ( sema. db , & pat, & ty) {
@@ -96,7 +118,7 @@ fn get_bind_pat_hints(
96118 acc. push ( InlayHint {
97119 range : pat. syntax ( ) . text_range ( ) ,
98120 kind : InlayKind :: TypeHint ,
99- label : ty. display_truncated ( sema. db , max_inlay_hint_length ) . to_string ( ) . into ( ) ,
121+ label : ty. display_truncated ( sema. db , inlay_hint_opts . max_length ) . to_string ( ) . into ( ) ,
100122 } ) ;
101123 Some ( ( ) )
102124}
@@ -202,10 +224,65 @@ fn get_fn_signature(sema: &Semantics<RootDatabase>, expr: &ast::Expr) -> Option<
202224
203225#[ cfg( test) ]
204226mod tests {
227+ use crate :: inlay_hints:: InlayConfig ;
205228 use insta:: assert_debug_snapshot;
206229
207230 use crate :: mock_analysis:: single_file;
208231
232+ #[ test]
233+ fn param_hints_only ( ) {
234+ let ( analysis, file_id) = single_file (
235+ r#"
236+ fn foo(a: i32, b: i32) -> i32 { a + b }
237+ fn main() {
238+ let _x = foo(4, 4);
239+ }"# ,
240+ ) ;
241+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig { parameter_hints: true , type_hints: false , max_length: None } ) . unwrap( ) , @r###"
242+ [
243+ InlayHint {
244+ range: [106; 107),
245+ kind: ParameterHint,
246+ label: "a",
247+ },
248+ InlayHint {
249+ range: [109; 110),
250+ kind: ParameterHint,
251+ label: "b",
252+ },
253+ ]"### ) ;
254+ }
255+
256+ #[ test]
257+ fn hints_disabled ( ) {
258+ let ( analysis, file_id) = single_file (
259+ r#"
260+ fn foo(a: i32, b: i32) -> i32 { a + b }
261+ fn main() {
262+ let _x = foo(4, 4);
263+ }"# ,
264+ ) ;
265+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig { type_hints: false , parameter_hints: false , max_length: None } ) . unwrap( ) , @r###"[]"### ) ;
266+ }
267+
268+ #[ test]
269+ fn type_hints_only ( ) {
270+ let ( analysis, file_id) = single_file (
271+ r#"
272+ fn foo(a: i32, b: i32) -> i32 { a + b }
273+ fn main() {
274+ let _x = foo(4, 4);
275+ }"# ,
276+ ) ;
277+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig { type_hints: true , parameter_hints: false , max_length: None } ) . unwrap( ) , @r###"
278+ [
279+ InlayHint {
280+ range: [97; 99),
281+ kind: TypeHint,
282+ label: "i32",
283+ },
284+ ]"### ) ;
285+ }
209286 #[ test]
210287 fn default_generic_types_should_not_be_displayed ( ) {
211288 let ( analysis, file_id) = single_file (
@@ -221,7 +298,7 @@ fn main() {
221298}"# ,
222299 ) ;
223300
224- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
301+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
225302 [
226303 InlayHint {
227304 range: [69; 71),
@@ -278,7 +355,7 @@ fn main() {
278355}"# ,
279356 ) ;
280357
281- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
358+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
282359 [
283360 InlayHint {
284361 range: [193; 197),
@@ -358,7 +435,7 @@ fn main() {
358435}"# ,
359436 ) ;
360437
361- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
438+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
362439 [
363440 InlayHint {
364441 range: [21; 30),
@@ -422,7 +499,7 @@ fn main() {
422499}"# ,
423500 ) ;
424501
425- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
502+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
426503 [
427504 InlayHint {
428505 range: [21; 30),
@@ -472,7 +549,7 @@ fn main() {
472549}"# ,
473550 ) ;
474551
475- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
552+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
476553 [
477554 InlayHint {
478555 range: [188; 192),
@@ -567,7 +644,7 @@ fn main() {
567644}"# ,
568645 ) ;
569646
570- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
647+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
571648 [
572649 InlayHint {
573650 range: [188; 192),
@@ -662,7 +739,7 @@ fn main() {
662739}"# ,
663740 ) ;
664741
665- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
742+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
666743 [
667744 InlayHint {
668745 range: [252; 256),
@@ -734,7 +811,7 @@ fn main() {
734811}"# ,
735812 ) ;
736813
737- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, Some ( 8 ) ) . unwrap( ) , @r###"
814+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig { max_length : Some ( 8 ) , .. Default :: default ( ) } ) . unwrap( ) , @r###"
738815 [
739816 InlayHint {
740817 range: [74; 75),
@@ -822,7 +899,7 @@ fn main() {
822899}"# ,
823900 ) ;
824901
825- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, None ) . unwrap( ) , @r###"
902+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig :: default ( ) ) . unwrap( ) , @r###"
826903 [
827904 InlayHint {
828905 range: [798; 809),
@@ -944,7 +1021,7 @@ fn main() {
9441021}"# ,
9451022 ) ;
9461023
947- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, Some ( 8 ) ) . unwrap( ) , @r###"
1024+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig { max_length : Some ( 8 ) , .. Default :: default ( ) } ) . unwrap( ) , @r###"
9481025 []
9491026 "###
9501027 ) ;
@@ -970,7 +1047,7 @@ fn main() {
9701047}"# ,
9711048 ) ;
9721049
973- assert_debug_snapshot ! ( analysis. inlay_hints( file_id, Some ( 8 ) ) . unwrap( ) , @r###"
1050+ assert_debug_snapshot ! ( analysis. inlay_hints( file_id, & InlayConfig { max_length : Some ( 8 ) , .. Default :: default ( ) } ) . unwrap( ) , @r###"
9741051 []
9751052 "###
9761053 ) ;
0 commit comments