);
}
- #[test]
- fn test_keywords_in_trait_def() {
- check(
- r"trait My { $0 }",
- expect![[r#"
- kw unsafe
- kw fn
- kw const
- kw type
- "#]],
- );
- }
-
- #[test]
- fn test_keywords_in_impl_def() {
- check(
- r"impl My { $0 }",
- expect![[r#"
- kw pub(crate)
- kw pub
- kw unsafe
- kw fn
- kw const
- kw type
- "#]],
- );
- }
-
- #[test]
- fn test_keywords_in_impl_def_with_attr() {
- check(
- r"impl My { #[foo] $0 }",
- expect![[r#"
- kw pub(crate)
- kw pub
- kw unsafe
- kw fn
- kw const
- kw type
- "#]],
- );
- }
-
#[test]
fn test_keywords_in_loop() {
check(
}
pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) {
- if !ctx.expects_item() || ctx.previous_token_is(T![unsafe]) {
+ if !ctx.expects_item() || ctx.previous_token_is(T![unsafe]) || ctx.path_qual().is_some() {
return;
}
if ctx.has_visibility_prev_sibling() {
check(
r#"
#[rustc_builtin_macro]
-pub macro Clone {}
-
-struct S;
-impl S {
- $0
-}
-"#,
- expect![[r#""#]],
- );
- check(
- r#"
-#[rustc_builtin_macro]
pub macro bench {}
fn f() {$0}
)
}
- #[test]
- fn completes_in_assoc_item_list() {
- check(
- r#"
-macro_rules! foo {}
-mod bar {}
-
-struct MyStruct {}
-impl MyStruct {
- $0
-}
-"#,
- expect![[r#"
- md bar
- ma foo!(…) macro_rules! foo
- "#]],
- )
- }
-
- #[test]
- fn completes_in_item_list() {
- check(
- r#"
-struct MyStruct {}
-macro_rules! foo {}
-mod bar {}
-
-$0
-"#,
- expect![[r#"
- md bar
- ma foo!(…) macro_rules! foo
- "#]],
- )
- }
-
#[test]
fn completes_types_and_const_in_arg_list() {
check(
pub(crate) fn is_path_disallowed(&self) -> bool {
self.attribute_under_caret.is_some()
|| self.previous_token_is(T![unsafe])
- || self.has_visibility_prev_sibling()
+ || matches!(
+ self.prev_sibling,
+ Some(ImmediatePrevSibling::Attribute) | Some(ImmediatePrevSibling::Visibility)
+ )
|| matches!(
self.completion_location,
Some(ImmediateLocation::Attribute(_))
TraitDefName,
ImplDefType,
Visibility,
+ Attribute,
}
/// Direct parent "thing" of what we are currently completing.
} else {
return None
},
+ ast::Attr(_it) => ImmediatePrevSibling::Attribute,
_ => return None,
}
};
fn test_vis_prev_sibling() {
check_prev_sibling(r"pub w$0", ImmediatePrevSibling::Visibility);
}
+
+ #[test]
+ fn test_attr_prev_sibling() {
+ check_prev_sibling(r"#[attr] w$0", ImmediatePrevSibling::Attribute);
+ }
}
}
fn check(ra_fixture: &str, expect: Expect) {
- let actual = completion_list(ra_fixture);
+ let base = r#"#[rustc_builtin_macro]
+pub macro Clone {}
+enum Enum { Variant }
+struct Struct {}
+#[macro_export]
+macro_rules! foo {}
+mod bar {}
+const CONST: () = ();
+trait Trait {}
+"#;
+ let actual = completion_list(&format!("{}{}", base, ra_fixture));
expect.assert_eq(&actual)
}
$0
}
"#,
- expect![[r#"
+ expect![[r##"
kw pub(crate)
kw pub
kw unsafe
sn tmod (Test module)
sn tfn (Test function)
sn macro_rules
- "#]],
+ ma foo!(…) #[macro_export] macro_rules! foo
+ "##]],
)
}
#[test]
fn in_source_file_item_list() {
check(
- r#"
-enum Enum { Variant }
-struct MyStruct {}
-#[macro_export]
-macro_rules! foo {}
-mod bar {}
-const CONST: () = ();
-
-$0"#,
+ r#"$0"#,
expect![[r##"
kw pub(crate)
kw pub
}
#[test]
-fn in_qualified_path() {
+fn in_item_list_after_attr() {
check(
- r#"
-enum Enum { Variant }
-struct MyStruct {}
-#[macro_export]
-macro_rules! foo {}
-mod bar {}
-const CONST: () = ();
-
-crate::$0"#,
- expect![[r##"
+ r#"#[attr] $0"#,
+ expect![[r#"
kw pub(crate)
kw pub
kw unsafe
sn tmod (Test module)
sn tfn (Test function)
sn macro_rules
+ "#]],
+ )
+}
+
+#[test]
+fn in_qualified_path() {
+ check(
+ r#"crate::$0"#,
+ expect![[r##"
+ kw pub(crate)
+ kw pub
+ kw unsafe
+ kw fn
+ kw const
+ kw type
+ kw impl
+ kw extern
+ kw use
+ kw trait
+ kw static
+ kw mod
+ kw enum
+ kw struct
+ kw union
md bar
- ma foo!(…) #[macro_export] macro_rules! foo
+ ma foo!(…) #[macro_export] macro_rules! foo
"##]],
)
}
#[test]
fn after_unsafe_token() {
check(
- r#"
-enum Enum { Variant }
-struct MyStruct {}
-#[macro_export]
-macro_rules! foo {}
-mod bar {}
-const CONST: () = ();
-
-unsafe $0"#,
+ r#"unsafe $0"#,
expect![[r#"
kw fn
kw trait
#[test]
fn after_visibility() {
check(
- r#"
-enum Enum { Variant }
-struct MyStruct {}
-#[macro_export]
-macro_rules! foo {}
-mod bar {}
-const CONST: () = ();
-
-pub $0"#,
+ r#"pub $0"#,
expect![[r#"
kw unsafe
kw fn
"#]],
);
}
+
+#[test]
+fn after_visibility_unsafe() {
+ // FIXME this shouldn't show `impl`
+ check(
+ r#"pub unsafe $0"#,
+ expect![[r#"
+ kw fn
+ kw trait
+ kw impl
+ "#]],
+ );
+}
+
+#[test]
+fn in_impl_assoc_item_list() {
+ check(
+ r#"impl Struct {
+ $0
+}"#,
+ expect![[r##"
+ kw pub(crate)
+ kw pub
+ kw unsafe
+ kw fn
+ kw const
+ kw type
+ md bar
+ ma foo!(…) #[macro_export] macro_rules! foo
+ ma foo!(…) #[macro_export] macro_rules! foo
+ "##]],
+ )
+}
+
+#[test]
+fn in_impl_assoc_item_list_after_attr() {
+ check(
+ r#"impl Struct {
+ #[attr] $0
+}"#,
+ expect![[r#"
+ kw pub(crate)
+ kw pub
+ kw unsafe
+ kw fn
+ kw const
+ kw type
+ "#]],
+ )
+}
+
+#[test]
+fn in_trait_assoc_item_list() {
+ check(
+ r"trait Foo { $0 }",
+ expect![[r##"
+ kw unsafe
+ kw fn
+ kw const
+ kw type
+ md bar
+ ma foo!(…) #[macro_export] macro_rules! foo
+ ma foo!(…) #[macro_export] macro_rules! foo
+ "##]],
+ );
+}