From ea7ea7079cd8cf030ccd9b8c5e522165eace58c5 Mon Sep 17 00:00:00 2001 From: yue4u Date: Sat, 2 Jul 2022 23:17:29 +0900 Subject: [PATCH] fix: escape for enum variant --- crates/ide-completion/src/render/pattern.rs | 6 +-- crates/ide-completion/src/tests/pattern.rs | 54 +++++++++++++++++++++ 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 "#]], ); } @@ -490,6 +493,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(