internal: add default to minicore

This commit is contained in:
Aleksey Kladov 2021-06-17 20:49:49 +03:00
parent ce926aebc4
commit 08c220ab2c
6 changed files with 94 additions and 78 deletions

View file

@ -3016,8 +3016,8 @@ fn foo() {
file_id: FileId( file_id: FileId(
1, 1,
), ),
full_range: 245..427, full_range: 246..428,
focus_range: 284..290, focus_range: 285..291,
name: "Future", name: "Future",
kind: Trait, kind: Trait,
description: "pub trait Future", description: "pub trait Future",

View file

@ -1,5 +1,4 @@
use ide_db::helpers::FamousDefs; use ide_db::{helpers::FamousDefs, RootDatabase};
use ide_db::RootDatabase;
use syntax::ast::{self, AstNode, NameOwner}; use syntax::ast::{self, AstNode, NameOwner};
use crate::{AssistContext, AssistId, AssistKind, Assists}; use crate::{AssistContext, AssistId, AssistKind, Assists};
@ -92,23 +91,20 @@ mod tests {
use super::*; use super::*;
fn check_not_applicable(ra_fixture: &str) {
let fixture =
format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE);
check_assist_not_applicable(generate_default_from_enum_variant, &fixture)
}
#[test] #[test]
fn test_generate_default_from_variant() { fn test_generate_default_from_variant() {
check_assist( check_assist(
generate_default_from_enum_variant, generate_default_from_enum_variant,
r#" r#"
//- minicore: default
enum Variant { enum Variant {
Undefined, Undefined,
Minor$0, Minor$0,
Major, Major,
}"#, }
r#"enum Variant { "#,
r#"
enum Variant {
Undefined, Undefined,
Minor, Minor,
Major, Major,
@ -118,15 +114,18 @@ impl Default for Variant {
fn default() -> Self { fn default() -> Self {
Self::Minor Self::Minor
} }
}"#, }
"#,
); );
} }
#[test] #[test]
fn test_generate_default_already_implemented() { fn test_generate_default_already_implemented() {
cov_mark::check!(test_gen_default_impl_already_exists); cov_mark::check!(test_gen_default_impl_already_exists);
check_not_applicable( check_assist_not_applicable(
generate_default_from_enum_variant,
r#" r#"
//- minicore: default
enum Variant { enum Variant {
Undefined, Undefined,
Minor$0, Minor$0,
@ -137,20 +136,24 @@ impl Default for Variant {
fn default() -> Self { fn default() -> Self {
Self::Minor Self::Minor
} }
}"#, }
"#,
); );
} }
#[test] #[test]
fn test_add_from_impl_no_element() { fn test_add_from_impl_no_element() {
cov_mark::check!(test_gen_default_on_non_unit_variant_not_implemented); cov_mark::check!(test_gen_default_on_non_unit_variant_not_implemented);
check_not_applicable( check_assist_not_applicable(
generate_default_from_enum_variant,
r#" r#"
//- minicore: default
enum Variant { enum Variant {
Undefined, Undefined,
Minor(u32)$0, Minor(u32)$0,
Major, Major,
}"#, }
"#,
); );
} }
@ -158,7 +161,10 @@ enum Variant {
fn test_generate_default_from_variant_with_one_variant() { fn test_generate_default_from_variant_with_one_variant() {
check_assist( check_assist(
generate_default_from_enum_variant, generate_default_from_enum_variant,
r#"enum Variant { Undefi$0ned }"#, r#"
//- minicore: default
enum Variant { Undefi$0ned }
"#,
r#" r#"
enum Variant { Undefined } enum Variant { Undefined }
@ -166,7 +172,8 @@ impl Default for Variant {
fn default() -> Self { fn default() -> Self {
Self::Undefined Self::Undefined
} }
}"#, }
"#,
); );
} }
} }

View file

@ -1,7 +1,3 @@
use crate::{
assist_context::{AssistContext, Assists},
AssistId,
};
use ide_db::helpers::FamousDefs; use ide_db::helpers::FamousDefs;
use itertools::Itertools; use itertools::Itertools;
use stdx::format_to; use stdx::format_to;
@ -10,6 +6,11 @@ use syntax::{
AstNode, AstNode,
}; };
use crate::{
assist_context::{AssistContext, Assists},
AssistId,
};
// Assist: generate_default_from_new // Assist: generate_default_from_new
// //
// Generates default implementation from new method. // Generates default implementation from new method.
@ -140,16 +141,16 @@ fn is_default_implemented(ctx: &AssistContext, impl_: &Impl) -> bool {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use ide_db::helpers::FamousDefs;
use crate::tests::{check_assist, check_assist_not_applicable}; use crate::tests::{check_assist, check_assist_not_applicable};
use super::*; use super::*;
#[test] #[test]
fn generate_default() { fn generate_default() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
struct Example { _inner: () } struct Example { _inner: () }
impl Example { impl Example {
@ -182,8 +183,10 @@ fn main() {}
#[test] #[test]
fn generate_default2() { fn generate_default2() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
struct Test { value: u32 } struct Test { value: u32 }
impl Test { impl Test {
@ -212,8 +215,10 @@ impl Default for Test {
#[test] #[test]
fn new_function_with_generic() { fn new_function_with_generic() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
pub struct Foo<T> { pub struct Foo<T> {
_bar: *mut T, _bar: *mut T,
} }
@ -246,8 +251,10 @@ impl<T> Default for Foo<T> {
#[test] #[test]
fn new_function_with_generics() { fn new_function_with_generics() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
pub struct Foo<T, B> { pub struct Foo<T, B> {
_tars: *mut T, _tars: *mut T,
_bar: *mut B, _bar: *mut B,
@ -282,8 +289,10 @@ impl<T, B> Default for Foo<T, B> {
#[test] #[test]
fn new_function_with_generic_and_bound() { fn new_function_with_generic_and_bound() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
pub struct Foo<T> { pub struct Foo<T> {
t: T, t: T,
} }
@ -316,8 +325,10 @@ impl<T: From<i32>> Default for Foo<T> {
#[test] #[test]
fn new_function_with_generics_and_bounds() { fn new_function_with_generics_and_bounds() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
pub struct Foo<T, B> { pub struct Foo<T, B> {
_tars: T, _tars: T,
_bar: B, _bar: B,
@ -352,8 +363,10 @@ impl<T: From<i32>, B: From<i64>> Default for Foo<T, B> {
#[test] #[test]
fn new_function_with_generic_and_where() { fn new_function_with_generic_and_where() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
pub struct Foo<T> { pub struct Foo<T> {
t: T, t: T,
} }
@ -395,8 +408,10 @@ where
#[test] #[test]
fn new_function_with_generics_and_wheres() { fn new_function_with_generics_and_wheres() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
pub struct Foo<T, B> { pub struct Foo<T, B> {
_tars: T, _tars: T,
_bar: B, _bar: B,
@ -441,8 +456,10 @@ where
#[test] #[test]
fn new_function_with_parameters() { fn new_function_with_parameters() {
cov_mark::check!(new_function_with_parameters); cov_mark::check!(new_function_with_parameters);
check_not_applicable( check_assist_not_applicable(
generate_default_from_new,
r#" r#"
//- minicore: default
struct Example { _inner: () } struct Example { _inner: () }
impl Example { impl Example {
@ -457,7 +474,8 @@ impl Example {
#[test] #[test]
fn other_function_than_new() { fn other_function_than_new() {
cov_mark::check!(other_function_than_new); cov_mark::check!(other_function_than_new);
check_not_applicable( check_assist_not_applicable(
generate_default_from_new,
r#" r#"
struct Example { _inner: () } struct Example { _inner: () }
@ -474,8 +492,10 @@ impl Example {
#[test] #[test]
fn default_block_is_already_present() { fn default_block_is_already_present() {
cov_mark::check!(default_block_is_already_present); cov_mark::check!(default_block_is_already_present);
check_not_applicable( check_assist_not_applicable(
generate_default_from_new,
r#" r#"
//- minicore: default
struct Example { _inner: () } struct Example { _inner: () }
impl Example { impl Example {
@ -495,7 +515,8 @@ impl Default for Example {
#[test] #[test]
fn standalone_new_function() { fn standalone_new_function() {
check_not_applicable( check_assist_not_applicable(
generate_default_from_new,
r#" r#"
fn n$0ew() -> u32 { fn n$0ew() -> u32 {
0 0
@ -506,8 +527,10 @@ fn n$0ew() -> u32 {
#[test] #[test]
fn multiple_struct_blocks() { fn multiple_struct_blocks() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
struct Example { _inner: () } struct Example { _inner: () }
struct Test { value: u32 } struct Test { value: u32 }
@ -538,8 +561,10 @@ impl Default for Example {
#[test] #[test]
fn when_struct_is_after_impl() { fn when_struct_is_after_impl() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
impl Example { impl Example {
pub fn $0new() -> Self { pub fn $0new() -> Self {
Self { _inner: () } Self { _inner: () }
@ -568,8 +593,10 @@ struct Example { _inner: () }
#[test] #[test]
fn struct_in_module() { fn struct_in_module() {
check_pass( check_assist(
generate_default_from_new,
r#" r#"
//- minicore: default
mod test { mod test {
struct Example { _inner: () } struct Example { _inner: () }
@ -603,8 +630,10 @@ impl Default for Example {
#[test] #[test]
fn struct_in_module_with_default() { fn struct_in_module_with_default() {
cov_mark::check!(struct_in_module_with_default); cov_mark::check!(struct_in_module_with_default);
check_not_applicable( check_assist_not_applicable(
generate_default_from_new,
r#" r#"
//- minicore: default
mod test { mod test {
struct Example { _inner: () } struct Example { _inner: () }
@ -623,14 +652,4 @@ mod test {
"#, "#,
); );
} }
fn check_pass(before: &str, after: &str) {
let before = &format!("//- /main.rs crate:main deps:core{}{}", before, FamousDefs::FIXTURE);
check_assist(generate_default_from_new, before, after);
}
fn check_not_applicable(before: &str) {
let before = &format!("//- /main.rs crate:main deps:core{}{}", before, FamousDefs::FIXTURE);
check_assist_not_applicable(generate_default_from_new, before);
}
} }

View file

@ -48,10 +48,9 @@ pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) ->
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use expect_test::{expect, Expect}; use expect_test::{expect, Expect};
use ide_db::helpers::FamousDefs;
use crate::{ use crate::{
tests::{self, filtered_completion_list}, tests::{check_edit, filtered_completion_list},
CompletionKind, CompletionKind,
}; };
@ -61,31 +60,17 @@ mod tests {
} }
fn check_snippet(ra_fixture: &str, expect: Expect) { fn check_snippet(ra_fixture: &str, expect: Expect) {
let actual = filtered_completion_list( let actual = filtered_completion_list(ra_fixture, CompletionKind::Snippet);
&format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE),
CompletionKind::Snippet,
);
expect.assert_eq(&actual); expect.assert_eq(&actual);
} }
fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
tests::check_edit(
what,
&format!(
"//- /main.rs crate:main deps:core{}\n{}",
ra_fixture_before,
FamousDefs::FIXTURE,
),
&(ra_fixture_after.to_owned() + "\n"),
);
}
#[test] #[test]
fn test_record_literal_field_default() { fn test_record_literal_field_default() {
let test_code = r#" let test_code = r#"
//- minicore: default
struct S { foo: u32, bar: usize } struct S { foo: u32, bar: usize }
impl core::default::Default for S { impl Default for S {
fn default() -> Self { fn default() -> Self {
S { S {
foo: 0, foo: 0,
@ -121,9 +106,10 @@ fn process(f: S) {
check_edit( check_edit(
"..Default::default()", "..Default::default()",
r#" r#"
//- minicore: default
struct S { foo: u32, bar: usize } struct S { foo: u32, bar: usize }
impl core::default::Default for S { impl Default for S {
fn default() -> Self { fn default() -> Self {
S { S {
foo: 0, foo: 0,
@ -142,7 +128,7 @@ fn process(f: S) {
r#" r#"
struct S { foo: u32, bar: usize } struct S { foo: u32, bar: usize }
impl core::default::Default for S { impl Default for S {
fn default() -> Self { fn default() -> Self {
S { S {
foo: 0, foo: 0,

View file

@ -20,12 +20,6 @@ pub mod convert {
} }
} }
pub mod default {
pub trait Default {
fn default() -> Self;
}
}
pub mod option { pub mod option {
pub enum Option<T> { pub enum Option<T> {
None, None,

View file

@ -22,6 +22,7 @@
//! result: //! result:
//! iterator: option //! iterator: option
//! iterators: iterator //! iterators: iterator
//! default: sized
pub mod marker { pub mod marker {
// region:sized // region:sized
@ -37,6 +38,14 @@ pub mod marker {
// endregion:unsize // endregion:unsize
} }
// region:default
pub mod default {
pub trait Default: Sized {
fn default() -> Self;
}
}
// endregion:default
pub mod ops { pub mod ops {
// region:coerce_unsized // region:coerce_unsized
mod unsize { mod unsize {
@ -309,6 +318,7 @@ pub mod iter {
pub mod prelude { pub mod prelude {
pub mod v1 { pub mod v1 {
pub use crate::{ pub use crate::{
default::Default, // :default
iter::{IntoIterator, Iterator}, // :iterator iter::{IntoIterator, Iterator}, // :iterator
marker::Sized, // :sized marker::Sized, // :sized
ops::{Fn, FnMut, FnOnce}, // :fn ops::{Fn, FnMut, FnOnce}, // :fn