//! 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 dyn kw fn kw for kw impl 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 dyn kw fn kw for kw impl 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 "#]], ); }