about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/ide_completion/src/render/literal.rs19
-rw-r--r--crates/ide_completion/src/render/pattern.rs17
-rw-r--r--crates/ide_completion/src/tests/expression.rs21
-rw-r--r--crates/ide_completion/src/tests/pattern.rs8
4 files changed, 49 insertions, 16 deletions
diff --git a/crates/ide_completion/src/render/literal.rs b/crates/ide_completion/src/render/literal.rs
index d91e80f90c0..e65631712ec 100644
--- a/crates/ide_completion/src/render/literal.rs
+++ b/crates/ide_completion/src/render/literal.rs
@@ -49,12 +49,12 @@ fn render(
     name: hir::Name,
     path: Option<hir::ModPath>,
 ) -> Option<CompletionItem> {
-    if let Some(PathCompletionCtx { has_call_parens: true, .. }) = completion.path_context {
-        return None;
-    }
     let db = completion.db;
-    let fields = thing.fields(completion)?;
+    let kind = thing.kind(db);
+    let has_call_parens =
+        matches!(completion.path_context, Some(PathCompletionCtx { has_call_parens: true, .. }));
 
+    let fields = thing.fields(completion)?;
     let (qualified_name, short_qualified_name, qualified) = match path {
         Some(path) => {
             let short = hir::ModPath::from_segments(
@@ -68,13 +68,14 @@ fn render(
     let qualified_name = qualified_name.to_string();
     let snippet_cap = ctx.snippet_cap();
 
-    let kind = thing.kind(db);
     let mut rendered = match kind {
-        StructKind::Tuple => render_tuple_lit(db, snippet_cap, &fields, &qualified_name),
-        StructKind::Record => render_record_lit(db, snippet_cap, &fields, &qualified_name),
-        StructKind::Unit => {
-            RenderedLiteral { literal: qualified_name.clone(), detail: qualified_name.clone() }
+        StructKind::Tuple if !has_call_parens => {
+            render_tuple_lit(db, snippet_cap, &fields, &qualified_name)
+        }
+        StructKind::Record if !has_call_parens => {
+            render_record_lit(db, snippet_cap, &fields, &qualified_name)
         }
+        _ => RenderedLiteral { literal: qualified_name.clone(), detail: qualified_name.clone() },
     };
 
     if snippet_cap.is_some() {
diff --git a/crates/ide_completion/src/render/pattern.rs b/crates/ide_completion/src/render/pattern.rs
index efceb85718d..ff61bf61c54 100644
--- a/crates/ide_completion/src/render/pattern.rs
+++ b/crates/ide_completion/src/render/pattern.rs
@@ -6,7 +6,7 @@ use itertools::Itertools;
 use syntax::SmolStr;
 
 use crate::{
-    context::{ParamKind, PatternContext},
+    context::{ParamKind, PathCompletionCtx, PatternContext},
     render::{variant::visible_fields, RenderContext},
     CompletionItem, CompletionItemKind,
 };
@@ -77,12 +77,19 @@ fn render_pat(
     fields: &[hir::Field],
     fields_omitted: bool,
 ) -> Option<String> {
+    let has_call_parens = matches!(
+        ctx.completion.path_context,
+        Some(PathCompletionCtx { has_call_parens: true, .. })
+    );
     let mut pat = match kind {
-        StructKind::Tuple => render_tuple_as_pat(ctx.snippet_cap(), fields, name, fields_omitted),
-        StructKind::Record => {
+        StructKind::Tuple if !has_call_parens => {
+            render_tuple_as_pat(ctx.snippet_cap(), fields, name, fields_omitted)
+        }
+        StructKind::Record if !has_call_parens => {
             render_record_as_pat(ctx.db(), ctx.snippet_cap(), fields, name, fields_omitted)
         }
-        _ => return None,
+        StructKind::Unit => return None,
+        _ => name.to_owned(),
     };
 
     if matches!(
@@ -91,7 +98,7 @@ fn render_pat(
             param_ctx: Some((.., ParamKind::Function(_))),
             has_type_ascription: false,
             ..
-        })
+        }) if !has_call_parens
     ) {
         pat.push(':');
         pat.push(' ');
diff --git a/crates/ide_completion/src/tests/expression.rs b/crates/ide_completion/src/tests/expression.rs
index bb8b34b79a3..f38c504fab8 100644
--- a/crates/ide_completion/src/tests/expression.rs
+++ b/crates/ide_completion/src/tests/expression.rs
@@ -552,3 +552,24 @@ fn func() {
         "#]],
     );
 }
+
+#[test]
+fn with_parens() {
+    check_empty(
+        r#"
+enum Enum {
+    Variant()
+}
+impl Enum {
+    fn variant() -> Self { Enum::Variant() }
+}
+fn func() {
+    Enum::$0()
+}
+"#,
+        expect![[r#"
+            ev Variant(…) Variant
+            fn variant    fn() -> Enum
+        "#]],
+    );
+}
diff --git a/crates/ide_completion/src/tests/pattern.rs b/crates/ide_completion/src/tests/pattern.rs
index 405a128b7e0..3b592635288 100644
--- a/crates/ide_completion/src/tests/pattern.rs
+++ b/crates/ide_completion/src/tests/pattern.rs
@@ -429,7 +429,9 @@ fn foo() {
     }
 }
 "#,
-        expect![[r#""#]],
+        expect![[r#"
+            ev TupleVariant(…) TupleVariant
+        "#]],
     );
     check_empty(
         r#"
@@ -442,7 +444,9 @@ fn foo() {
     }
 }
 "#,
-        expect![[r#""#]],
+        expect![[r#"
+            ev RecordVariant {…} RecordVariant
+        "#]],
     );
 }