1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
use super::*;
#[test]
fn macro_rules_are_globally_visible() {
let map = def_map(
"
//- /lib.rs
macro_rules! structs {
($($i:ident),*) => {
$(struct $i { field: u32 } )*
}
}
structs!(Foo);
mod nested;
//- /nested.rs
structs!(Bar, Baz);
",
);
assert_snapshot_matches!(map, @r###"
⋮crate
⋮Foo: t v
⋮nested: t
⋮
⋮crate::nested
⋮Bar: t v
⋮Baz: t v
"###);
}
#[test]
fn macro_rules_can_define_modules() {
let map = def_map(
"
//- /lib.rs
macro_rules! m {
($name:ident) => { mod $name; }
}
m!(n1);
//- /n1.rs
m!(n2)
//- /n1/n2.rs
struct X;
",
);
assert_snapshot_matches!(map, @r###"
⋮crate
⋮n1: t
⋮
⋮crate::n1
⋮n2: t
⋮
⋮crate::n1::n2
⋮X: t v
"###);
}
#[test]
fn macro_rules_from_other_crates_are_visible() {
let map = def_map_with_crate_graph(
"
//- /main.rs
foo::structs!(Foo, Bar)
mod bar;
//- /bar.rs
use crate::*;
//- /lib.rs
#[macro_export]
macro_rules! structs {
($($i:ident),*) => {
$(struct $i { field: u32 } )*
}
}
",
crate_graph! {
"main": ("/main.rs", ["foo"]),
"foo": ("/lib.rs", []),
},
);
assert_snapshot_matches!(map, @r###"
⋮crate
⋮Bar: t v
⋮Foo: t v
⋮bar: t
⋮
⋮crate::bar
⋮Bar: t v
⋮Foo: t v
⋮bar: t
"###);
}
|