Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_fields.rs8
-rw-r--r--crates/syntax/src/ast/make.rs12
-rw-r--r--crates/syntax/src/ast/node_ext.rs4
-rw-r--r--crates/test-utils/src/minicore.rs13
4 files changed, 31 insertions, 6 deletions
diff --git a/crates/ide-diagnostics/src/handlers/missing_fields.rs b/crates/ide-diagnostics/src/handlers/missing_fields.rs
index d5f25dfaf2..050d5477f6 100644
--- a/crates/ide-diagnostics/src/handlers/missing_fields.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_fields.rs
@@ -588,14 +588,14 @@ fn test_fn() {
fn test_fill_struct_fields_default() {
check_fix(
r#"
-//- minicore: default, option
+//- minicore: default, option, slice
struct TestWithDefault(usize);
impl Default for TestWithDefault {
pub fn default() -> Self {
Self(0)
}
}
-struct TestStruct { one: i32, two: TestWithDefault }
+struct TestStruct { one: i32, two: TestWithDefault, r: &'static [i32] }
fn test_fn() {
let s = TestStruct{ $0 };
@@ -608,10 +608,10 @@ impl Default for TestWithDefault {
Self(0)
}
}
-struct TestStruct { one: i32, two: TestWithDefault }
+struct TestStruct { one: i32, two: TestWithDefault, r: &'static [i32] }
fn test_fn() {
- let s = TestStruct{ one: 0, two: TestWithDefault::default() };
+ let s = TestStruct{ one: 0, two: TestWithDefault::default(), r: <&'static [i32]>::default() };
}
",
);
diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs
index f5d1d009a5..00971569a2 100644
--- a/crates/syntax/src/ast/make.rs
+++ b/crates/syntax/src/ast/make.rs
@@ -74,10 +74,18 @@ pub mod ext {
expr_from_text("_")
}
pub fn expr_ty_default(ty: &ast::Type) -> ast::Expr {
- expr_from_text(&format!("{ty}::default()"))
+ if !ty.needs_angles_in_path() {
+ expr_from_text(&format!("{ty}::default()"))
+ } else {
+ expr_from_text(&format!("<{ty}>::default()"))
+ }
}
pub fn expr_ty_new(ty: &ast::Type) -> ast::Expr {
- expr_from_text(&format!("{ty}::new()"))
+ if !ty.needs_angles_in_path() {
+ expr_from_text(&format!("{ty}::new()"))
+ } else {
+ expr_from_text(&format!("<{ty}>::new()"))
+ }
}
pub fn expr_self() -> ast::Expr {
expr_from_text("self")
diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs
index 76cfea9d5b..63e4608d0f 100644
--- a/crates/syntax/src/ast/node_ext.rs
+++ b/crates/syntax/src/ast/node_ext.rs
@@ -717,6 +717,10 @@ impl ast::Type {
None
}
}
+
+ pub fn needs_angles_in_path(&self) -> bool {
+ !matches!(self, ast::Type::PathType(_)) || self.generic_arg_list().is_some()
+ }
}
#[derive(Debug, Clone, PartialEq, Eq)]
diff --git a/crates/test-utils/src/minicore.rs b/crates/test-utils/src/minicore.rs
index c34475bbdf..86fb080732 100644
--- a/crates/test-utils/src/minicore.rs
+++ b/crates/test-utils/src/minicore.rs
@@ -1503,6 +1503,19 @@ pub mod slice {
loop {}
}
}
+
+ // region:default
+ impl<T> const Default for &[T] {
+ fn default() -> Self {
+ &[]
+ }
+ }
+ impl<T> const Default for &mut [T] {
+ fn default() -> Self {
+ &mut []
+ }
+ }
+ // endregion:default
}
// endregion:slice