diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ide_completion/src/render.rs | 101 |
1 files changed, 16 insertions, 85 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index 027dee4f0..e72f54ef4 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs | |||
@@ -327,18 +327,18 @@ impl<'a> Render<'a> { | |||
327 | fn compute_relevance(ctx: &RenderContext, ty: &Type, name: &str) -> Option<CompletionRelevance> { | 327 | fn compute_relevance(ctx: &RenderContext, ty: &Type, name: &str) -> Option<CompletionRelevance> { |
328 | let (expected_name, expected_type) = ctx.expected_name_and_type()?; | 328 | let (expected_name, expected_type) = ctx.expected_name_and_type()?; |
329 | let mut res = CompletionRelevance::default(); | 329 | let mut res = CompletionRelevance::default(); |
330 | res.exact_type_match = ty == &expected_type | 330 | res.exact_type_match = relevance_type_match(ctx.db().upcast(), ty, expected_type); |
331 | || autoderef_relevance( | ||
332 | ctx.db().upcast(), | ||
333 | ty, | ||
334 | expected_type.remove_ref().as_ref().unwrap_or(&expected_type), | ||
335 | ); | ||
336 | res.exact_name_match = name == &expected_name; | 331 | res.exact_name_match = name == &expected_name; |
337 | Some(res) | 332 | Some(res) |
338 | } | 333 | } |
339 | 334 | ||
340 | fn autoderef_relevance(db: &dyn HirDatabase, ty: &Type, expected_type: &Type) -> bool { | 335 | fn relevance_type_match(db: &dyn HirDatabase, ty: &Type, expected_type: Type) -> bool { |
341 | ty.autoderef(db).any(|deref_ty| &deref_ty == expected_type) | 336 | if ty == &expected_type { |
337 | return true; | ||
338 | } | ||
339 | |||
340 | let ty_without_ref = expected_type.remove_ref().unwrap_or(expected_type); | ||
341 | ty.autoderef(db).any(|deref_ty| deref_ty == ty_without_ref) | ||
342 | } | 342 | } |
343 | 343 | ||
344 | #[cfg(test)] | 344 | #[cfg(test)] |
@@ -1001,7 +1001,7 @@ fn main() { | |||
1001 | 1001 | ||
1002 | #[test] | 1002 | #[test] |
1003 | fn suggest_deref() { | 1003 | fn suggest_deref() { |
1004 | check( | 1004 | check_relevance( |
1005 | r#" | 1005 | r#" |
1006 | #[lang = "deref"] | 1006 | #[lang = "deref"] |
1007 | trait Deref { | 1007 | trait Deref { |
@@ -1030,82 +1030,13 @@ fn main() { | |||
1030 | } | 1030 | } |
1031 | "#, | 1031 | "#, |
1032 | expect![[r#" | 1032 | expect![[r#" |
1033 | [ | 1033 | lc t [type] |
1034 | CompletionItem { | 1034 | tt Deref [] |
1035 | label: "Deref", | 1035 | st S [] |
1036 | source_range: 293..293, | 1036 | st T [] |
1037 | delete: 293..293, | 1037 | fn foo(…) [] |
1038 | insert: "Deref", | 1038 | lc m [] |
1039 | kind: SymbolKind( | 1039 | fn main() [] |
1040 | Trait, | ||
1041 | ), | ||
1042 | }, | ||
1043 | CompletionItem { | ||
1044 | label: "S", | ||
1045 | source_range: 293..293, | ||
1046 | delete: 293..293, | ||
1047 | insert: "S", | ||
1048 | kind: SymbolKind( | ||
1049 | Struct, | ||
1050 | ), | ||
1051 | }, | ||
1052 | CompletionItem { | ||
1053 | label: "T", | ||
1054 | source_range: 293..293, | ||
1055 | delete: 293..293, | ||
1056 | insert: "T", | ||
1057 | kind: SymbolKind( | ||
1058 | Struct, | ||
1059 | ), | ||
1060 | }, | ||
1061 | CompletionItem { | ||
1062 | label: "foo(…)", | ||
1063 | source_range: 293..293, | ||
1064 | delete: 293..293, | ||
1065 | insert: "foo(${1:s})$0", | ||
1066 | kind: SymbolKind( | ||
1067 | Function, | ||
1068 | ), | ||
1069 | lookup: "foo", | ||
1070 | detail: "-> ()", | ||
1071 | trigger_call_info: true, | ||
1072 | }, | ||
1073 | CompletionItem { | ||
1074 | label: "m", | ||
1075 | source_range: 293..293, | ||
1076 | delete: 293..293, | ||
1077 | insert: "m", | ||
1078 | kind: SymbolKind( | ||
1079 | Local, | ||
1080 | ), | ||
1081 | detail: "i32", | ||
1082 | }, | ||
1083 | CompletionItem { | ||
1084 | label: "main()", | ||
1085 | source_range: 293..293, | ||
1086 | delete: 293..293, | ||
1087 | insert: "main()$0", | ||
1088 | kind: SymbolKind( | ||
1089 | Function, | ||
1090 | ), | ||
1091 | lookup: "main", | ||
1092 | detail: "-> ()", | ||
1093 | }, | ||
1094 | CompletionItem { | ||
1095 | label: "t", | ||
1096 | source_range: 293..293, | ||
1097 | delete: 293..293, | ||
1098 | insert: "t", | ||
1099 | kind: SymbolKind( | ||
1100 | Local, | ||
1101 | ), | ||
1102 | detail: "T", | ||
1103 | relevance: CompletionRelevance { | ||
1104 | exact_name_match: false, | ||
1105 | exact_type_match: true, | ||
1106 | }, | ||
1107 | }, | ||
1108 | ] | ||
1109 | "#]], | 1040 | "#]], |
1110 | ) | 1041 | ) |
1111 | } | 1042 | } |