mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 06:41:48 +00:00
Move out completion pattern tests
This commit is contained in:
parent
c2aa7782d6
commit
f835279b3a
5 changed files with 349 additions and 467 deletions
348
crates/ide_completion/src/tests/pattern.rs
Normal file
348
crates/ide_completion/src/tests/pattern.rs
Normal file
|
@ -0,0 +1,348 @@
|
|||
//! Completions tests for pattern position.
|
||||
use expect_test::{expect, Expect};
|
||||
|
||||
use crate::tests::completion_list;
|
||||
|
||||
fn check(ra_fixture: &str, expect: Expect) {
|
||||
let actual = completion_list(ra_fixture);
|
||||
expect.assert_eq(&actual)
|
||||
}
|
||||
|
||||
fn check_with(ra_fixture: &str, expect: Expect) {
|
||||
let base = r#"
|
||||
enum Enum { TupleV(u32), RecordV { field: u32 }, UnitV }
|
||||
use self::Enum::TupleV;
|
||||
mod module {}
|
||||
|
||||
static STATIC: Unit = Unit;
|
||||
const CONST: Unit = Unit;
|
||||
struct Record { field: u32 }
|
||||
struct Tuple(u32);
|
||||
struct Unit
|
||||
macro_rules! makro {}
|
||||
"#;
|
||||
let actual = completion_list(&format!("{}\n{}", base, ra_fixture));
|
||||
expect.assert_eq(&actual)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ident_rebind_pat() {
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let en$0 @ x
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ident_ref_pat() {
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let ref en$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let ref en$0 @ x
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ident_ref_mut_pat() {
|
||||
// FIXME mut is already here, don't complete it again
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let ref mut en$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let ref mut en$0 @ x
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ref_pat() {
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let &en$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
// FIXME mut is already here, don't complete it again
|
||||
check(
|
||||
r#"
|
||||
fn quux() {
|
||||
let &mut en$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn refutable() {
|
||||
check_with(
|
||||
r#"
|
||||
fn foo() {
|
||||
if let a$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Record Record { field$1 }$0
|
||||
st Record
|
||||
en Enum
|
||||
bn Tuple Tuple($1)$0
|
||||
st Tuple
|
||||
md module
|
||||
bn TupleV TupleV($1)$0
|
||||
ev TupleV
|
||||
st Unit
|
||||
ct CONST
|
||||
ma makro!(…) macro_rules! makro
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn irrefutable() {
|
||||
check_with(
|
||||
r#"
|
||||
fn foo() {
|
||||
let a$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Record Record { field$1 }$0
|
||||
st Record
|
||||
bn Tuple Tuple($1)$0
|
||||
st Tuple
|
||||
st Unit
|
||||
ma makro!(…) macro_rules! makro
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn in_param() {
|
||||
check_with(
|
||||
r#"
|
||||
fn foo(a$0) {
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Record Record { field$1 }: Record$0
|
||||
st Record
|
||||
bn Tuple Tuple($1): Tuple$0
|
||||
st Tuple
|
||||
st Unit
|
||||
ma makro!(…) macro_rules! makro
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn only_fn_like_macros() {
|
||||
check(
|
||||
r#"
|
||||
macro_rules! m { ($e:expr) => { $e } }
|
||||
|
||||
#[rustc_builtin_macro]
|
||||
macro Clone {}
|
||||
|
||||
fn foo() {
|
||||
let x$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
ma m!(…) macro_rules! m
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn in_simple_macro_call() {
|
||||
check(
|
||||
r#"
|
||||
macro_rules! m { ($e:expr) => { $e } }
|
||||
enum E { X }
|
||||
|
||||
fn foo() {
|
||||
m!(match E::X { a$0 })
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
ev E::X ()
|
||||
en E
|
||||
ma m!(…) macro_rules! m
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn omits_private_fields_pat() {
|
||||
check(
|
||||
r#"
|
||||
mod foo {
|
||||
pub struct Record { pub field: i32, _field: i32 }
|
||||
pub struct Tuple(pub u32, u32);
|
||||
pub struct Invisible(u32, u32);
|
||||
}
|
||||
use foo::*;
|
||||
|
||||
fn outer() {
|
||||
if let a$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Record Record { field$1, .. }$0
|
||||
st Record
|
||||
bn Tuple Tuple($1, ..)$0
|
||||
st Tuple
|
||||
st Invisible
|
||||
md foo
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
|
||||
// #[test]
|
||||
// fn only_shows_ident_completion() {
|
||||
// check_edit(
|
||||
// "Foo",
|
||||
// r#"
|
||||
// struct Foo(i32);
|
||||
// fn main() {
|
||||
// match Foo(92) {
|
||||
// a$0(92) => (),
|
||||
// }
|
||||
// }
|
||||
// "#,
|
||||
// r#"
|
||||
// struct Foo(i32);
|
||||
// fn main() {
|
||||
// match Foo(92) {
|
||||
// Foo(92) => (),
|
||||
// }
|
||||
// }
|
||||
// "#,
|
||||
// );
|
||||
// }
|
||||
|
||||
#[test]
|
||||
fn completes_self_pats() {
|
||||
check(
|
||||
r#"
|
||||
struct Foo(i32);
|
||||
impl Foo {
|
||||
fn foo() {
|
||||
match Foo(0) {
|
||||
a$0
|
||||
}
|
||||
}
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Self Self($1)$0
|
||||
sp Self
|
||||
bn Foo Foo($1)$0
|
||||
st Foo
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn completes_qualified_variant() {
|
||||
check(
|
||||
r#"
|
||||
enum Foo {
|
||||
Bar { baz: i32 }
|
||||
}
|
||||
impl Foo {
|
||||
fn foo() {
|
||||
match {Foo::Bar { baz: 0 }} {
|
||||
B$0
|
||||
}
|
||||
}
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Self::Bar Self::Bar { baz$1 }$0
|
||||
ev Self::Bar { baz: i32 }
|
||||
bn Foo::Bar Foo::Bar { baz$1 }$0
|
||||
ev Foo::Bar { baz: i32 }
|
||||
sp Self
|
||||
en Foo
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn completes_in_record_field_pat() {
|
||||
check(
|
||||
r#"
|
||||
struct Foo { bar: Bar }
|
||||
struct Bar(u32);
|
||||
fn outer(Foo { bar: $0 }: Foo) {}
|
||||
"#,
|
||||
expect![[r#"
|
||||
kw mut
|
||||
bn Foo Foo { bar$1 }$0
|
||||
st Foo
|
||||
bn Bar Bar($1)$0
|
||||
st Bar
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn skips_in_record_field_pat_name() {
|
||||
check(
|
||||
r#"
|
||||
struct Foo { bar: Bar }
|
||||
struct Bar(u32);
|
||||
fn outer(Foo { bar$0 }: Foo) {}
|
||||
"#,
|
||||
expect![[r#""#]],
|
||||
)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue