blob: ed87b339fedf32fb0175c283b95fd94362df0f6c [file] [log] [blame]
//! Completion tests for item specifics overall.
//!
//! Except for use items which are tested in [super::use_tree] and mod declarations with are tested
//! in [crate::completions::mod_].
use expect_test::expect;
use crate::tests::{check, check_edit, check_with_base_items};
#[test]
fn target_type_or_trait_in_impl_block() {
check_with_base_items(
r#"
impl Tra$0
"#,
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
md module
st Record Record
st Tuple Tuple
st Unit Unit
tt Trait
un Union Union
bt u32 u32
kw crate::
kw self::
"#]],
)
}
#[test]
fn target_type_in_trait_impl_block() {
check_with_base_items(
r#"
impl Trait for Str$0
"#,
expect![[r#"
en Enum Enum
ma makro!(…) macro_rules! makro
md module
st Record Record
st Tuple Tuple
st Unit Unit
tt Trait
un Union Union
bt u32 u32
kw crate::
kw self::
"#]],
)
}
#[test]
fn after_trait_name_in_trait_def() {
check_with_base_items(
r"trait A $0",
expect![[r#"
kw where
"#]],
);
}
#[test]
fn after_target_name_in_impl() {
check_with_base_items(
r"impl Trait $0",
expect![[r#"
kw for
kw where
"#]],
);
check_with_base_items(
r"impl Trait f$0",
expect![[r#"
kw for
kw where
"#]],
);
check_with_base_items(
r"impl Trait for Type $0",
expect![[r#"
kw where
"#]],
);
}
#[test]
fn completes_where() {
check_with_base_items(
r"struct Struct $0",
expect![[r#"
kw where
"#]],
);
check_with_base_items(
r"struct Struct $0 {}",
expect![[r#"
kw where
"#]],
);
// FIXME: This shouldn't be completed here
check_with_base_items(
r"struct Struct $0 ()",
expect![[r#"
kw where
"#]],
);
check_with_base_items(
r"fn func() $0",
expect![[r#"
kw where
"#]],
);
check_with_base_items(
r"enum Enum $0",
expect![[r#"
kw where
"#]],
);
check_with_base_items(
r"enum Enum $0 {}",
expect![[r#"
kw where
"#]],
);
check_with_base_items(
r"trait Trait $0 {}",
expect![[r#"
kw where
"#]],
);
}
#[test]
fn before_record_field() {
check_with_base_items(
r#"
struct Foo {
$0
pub f: i32,
}
"#,
expect![[r#"
kw pub
kw pub(crate)
kw pub(super)
"#]],
)
}
#[test]
fn add_space_after_vis_kw() {
check_edit(
"pub(crate)",
r"
$0
",
r#"
pub(crate) $0
"#,
);
check_edit(
"pub",
r"
$0
",
r#"
pub $0
"#,
);
check_edit(
"pub(super)",
r"
$0
",
r#"
pub(super) $0
"#,
);
check_edit(
"in",
r"
pub($0)
",
r#"
pub(in $0)
"#,
);
}
#[test]
fn add_space_after_unsafe_kw() {
check_edit(
"unsafe",
r"
$0
",
r#"
unsafe $0
"#,
);
}
#[test]
fn add_space_after_for_where_kw() {
check_edit(
"for",
r#"
struct S {}
impl Copy $0
"#,
r#"
struct S {}
impl Copy for $0
"#,
);
check_edit(
"where",
r#"
struct S {}
impl Copy for S $0
"#,
r#"
struct S {}
impl Copy for S where $0
"#,
);
}
#[test]
fn test_is_not_considered_macro() {
check_with_base_items(
r#"
#[rustc_builtin]
pub macro test($item:item) {
/* compiler built-in */
}
macro_rules! expand_to_test {
( $i:ident ) => {
#[test]
fn foo() { $i; }
};
}
fn bar() {
let value = 5;
expand_to_test!(v$0);
}
"#,
expect![[r#"
ct CONST Unit
en Enum Enum
fn bar() fn()
fn foo() fn()
fn function() fn()
ma expand_to_test!(…) macro_rules! expand_to_test
ma makro!(…) macro_rules! makro
ma test!(…) macro test
md module
sc STATIC Unit
st Record Record
st Tuple Tuple
st Unit Unit
un Union Union
ev TupleV(…) TupleV(u32)
bt u32 u32
kw async
kw const
kw crate::
kw enum
kw extern
kw false
kw fn
kw for
kw if
kw if let
kw impl
kw impl for
kw let
kw letm
kw loop
kw match
kw mod
kw return
kw self::
kw static
kw struct
kw trait
kw true
kw type
kw union
kw unsafe
kw use
kw while
kw while let
sn macro_rules
sn pd
sn ppd
"#]],
);
}
#[test]
fn expression_in_item_macro() {
check(
r#"
fn foo() -> u8 { 0 }
macro_rules! foo {
($expr:expr) => {
const BAR: u8 = $expr;
};
}
foo!(f$0);
"#,
expect![[r#"
ct BAR u8
fn foo() fn() -> u8
ma foo!(…) macro_rules! foo
bt u32 u32
kw const
kw crate::
kw false
kw for
kw if
kw if let
kw loop
kw match
kw self::
kw true
kw unsafe
kw while
kw while let
"#]],
);
}