Unnamed repository; edit this file 'description' to name the repository.
fix: escape for enum variant
yue4u 2022-07-02
parent 622b516 · commit ea7ea70
-rw-r--r--crates/ide-completion/src/render/pattern.rs6
-rw-r--r--crates/ide-completion/src/tests/pattern.rs54
2 files changed, 57 insertions, 3 deletions
diff --git a/crates/ide-completion/src/render/pattern.rs b/crates/ide-completion/src/render/pattern.rs
index 16b3415e34..d6779961c0 100644
--- a/crates/ide-completion/src/render/pattern.rs
+++ b/crates/ide-completion/src/render/pattern.rs
@@ -96,7 +96,7 @@ fn render_pat(
StructKind::Record => {
render_record_as_pat(ctx.db(), ctx.snippet_cap(), fields, name, fields_omitted)
}
- StructKind::Unit => return None,
+ StructKind::Unit => name.to_string(),
};
let needs_ascription = matches!(
@@ -131,7 +131,7 @@ fn render_record_as_pat(
format!(
"{name} {{ {}{} }}",
fields.enumerate().format_with(", ", |(idx, field), f| {
- f(&format_args!("{}${}", field.name(db), idx + 1))
+ f(&format_args!("{}${}", field.name(db).escaped(), idx + 1))
}),
if fields_omitted { ", .." } else { "" },
name = name
@@ -140,7 +140,7 @@ fn render_record_as_pat(
None => {
format!(
"{name} {{ {}{} }}",
- fields.map(|field| field.name(db)).format(", "),
+ fields.map(|field| field.name(db).escaped().to_smol_str()).format(", "),
if fields_omitted { ", .." } else { "" },
name = name
)
diff --git a/crates/ide-completion/src/tests/pattern.rs b/crates/ide-completion/src/tests/pattern.rs
index 3d0010e73a..63ccf9003b 100644
--- a/crates/ide-completion/src/tests/pattern.rs
+++ b/crates/ide-completion/src/tests/pattern.rs
@@ -164,6 +164,7 @@ fn foo() {
ev Variant
bn Record {…} Record { field$1 }$0
bn Tuple(…) Tuple($1)$0
+ bn Variant Variant$0
kw mut
kw ref
"#]],
@@ -243,6 +244,7 @@ fn foo() {
expect![[r#"
en E
ma m!(…) macro_rules! m
+ bn E::X E::X$0
kw mut
kw ref
"#]],
@@ -318,6 +320,7 @@ fn func() {
ct ASSOC_CONST const ASSOC_CONST: ()
bn RecordV {…} RecordV { field$1 }$0
bn TupleV(…) TupleV($1)$0
+ bn UnitV UnitV$0
"#]],
);
}
@@ -491,6 +494,57 @@ fn foo() {
}
#[test]
+fn completes_enum_variant_pat_escape() {
+ cov_mark::check!(enum_variant_pattern_path);
+ check_empty(
+ r#"
+enum Enum {
+ A,
+ B { r#type: i32 },
+ r#type,
+ r#struct { r#type: i32 },
+}
+fn foo() {
+ match (Enum::A) {
+ $0
+ }
+}
+"#,
+ expect![[r#"
+ en Enum
+ bn Enum::A Enum::A$0
+ bn Enum::B {…} Enum::B { r#type$1 }$0
+ bn Enum::struct {…} Enum::r#struct { r#type$1 }$0
+ bn Enum::type Enum::r#type$0
+ kw mut
+ kw ref
+ "#]],
+ );
+
+ check_empty(
+ r#"
+enum Enum {
+ A,
+ B { r#type: i32 },
+ r#type,
+ r#struct { r#type: i32 },
+}
+fn foo() {
+ match (Enum::A) {
+ Enum::$0
+ }
+}
+"#,
+ expect![[r#"
+ bn A A$0
+ bn B {…} B { r#type$1 }$0
+ bn struct {…} r#struct { r#type$1 }$0
+ bn type r#type$0
+ "#]],
+ );
+}
+
+#[test]
fn completes_associated_const() {
check_empty(
r#"