]> git.lizzy.rs Git - rust.git/commitdiff
More functional
authorAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 23 Apr 2020 23:08:27 +0000 (01:08 +0200)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 23 Apr 2020 23:08:27 +0000 (01:08 +0200)
crates/ra_ide/src/completion/completion_item.rs
crates/ra_ide/src/completion/presentation.rs

index ea1e0433c0d257ccf757c27999dc2f3bd0aa6306..687b380bbe82da046faab5f4296fb634c45a2ee4 100644 (file)
@@ -93,7 +93,7 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
     }
 }
 
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, Copy)]
 pub enum CompletionScore {
     /// If only type match
     TypeMatch,
@@ -202,7 +202,7 @@ pub fn deprecated(&self) -> bool {
     }
 
     pub fn score(&self) -> Option<CompletionScore> {
-        self.score.clone()
+        self.score
     }
 
     pub fn set_score(&mut self, score: CompletionScore) {
index f8dac1d54178aecc3363382d8224be267766ecb7..5aedfc47f2ce6d980185a54782df90b6f88aad3c 100644 (file)
@@ -34,7 +34,9 @@ pub(crate) fn add_field(
         .set_deprecated(is_deprecated)
         .build();
 
-        compute_score(&mut completion_item, ctx);
+        if let Some(score) = compute_score(&completion_item, ctx) {
+            completion_item.set_score(score);
+        }
 
         self.add(completion_item);
     }
@@ -305,7 +307,10 @@ pub(crate) fn add_enum_variant(
     }
 }
 
-pub(crate) fn compute_score(completion_item: &mut CompletionItem, ctx: &CompletionContext) {
+pub(crate) fn compute_score(
+    completion_item: &CompletionItem,
+    ctx: &CompletionContext,
+) -> Option<CompletionScore> {
     let (active_name, active_type) = if let Some(record_field) = &ctx.record_field_syntax {
         if let Some((struct_field, _)) = ctx.sema.resolve_record_field(record_field) {
             (
@@ -313,7 +318,7 @@ pub(crate) fn compute_score(completion_item: &mut CompletionItem, ctx: &Completi
                 struct_field.signature_ty(ctx.db).display(ctx.db).to_string(),
             )
         } else {
-            return;
+            return None;
         }
     } else if let Some(call_info) = call_info(ctx.db, ctx.file_position) {
         if call_info.active_parameter_type().is_some()
@@ -321,10 +326,10 @@ pub(crate) fn compute_score(completion_item: &mut CompletionItem, ctx: &Completi
         {
             (call_info.active_parameter_name().unwrap(), call_info.active_parameter_type().unwrap())
         } else {
-            return;
+            return None;
         }
     } else {
-        return;
+        return None;
     };
 
     // Compute score
@@ -332,13 +337,15 @@ pub(crate) fn compute_score(completion_item: &mut CompletionItem, ctx: &Completi
     if let Some(a_parameter_type) = completion_item.detail() {
         if &active_type == a_parameter_type {
             // If same type + same name then go top position
-            if active_name == completion_item.label() {
-                completion_item.set_score(CompletionScore::TypeAndNameMatch);
+            let res = if active_name == completion_item.label() {
+                CompletionScore::TypeAndNameMatch
             } else {
-                completion_item.set_score(CompletionScore::TypeMatch);
-            }
+                CompletionScore::TypeMatch
+            };
+            return Some(res);
         }
     }
+    None
 }
 
 enum Params {