10
10
11
11
use ast;
12
12
use attr;
13
- use codemap:: DUMMY_SP ;
13
+ use codemap:: { DUMMY_SP , Span , ExpnInfo , NameAndSpan , MacroAttribute } ;
14
14
use codemap;
15
15
use fold:: Folder ;
16
16
use fold;
17
17
use parse:: token:: InternedString ;
18
18
use parse:: token:: special_idents;
19
- use parse:: token;
19
+ use parse:: { token, ParseSess } ;
20
20
use ptr:: P ;
21
21
use util:: small_vector:: SmallVector ;
22
22
23
+ /// Craft a span that will be ignored by the stability lint's
24
+ /// call to codemap's is_internal check.
25
+ /// The expanded code uses the unstable `#[prelude_import]` attribute.
26
+ fn ignored_span ( sess : & ParseSess , sp : Span ) -> Span {
27
+ let info = ExpnInfo {
28
+ call_site : DUMMY_SP ,
29
+ callee : NameAndSpan {
30
+ name : "std_inject" . to_string ( ) ,
31
+ format : MacroAttribute ,
32
+ span : None ,
33
+ allow_internal_unstable : true ,
34
+ }
35
+ } ;
36
+ let expn_id = sess. codemap ( ) . record_expansion ( info) ;
37
+ let mut sp = sp;
38
+ sp. expn_id = expn_id;
39
+ return sp;
40
+ }
41
+
23
42
pub fn maybe_inject_crates_ref ( krate : ast:: Crate , alt_std_name : Option < String > )
24
43
-> ast:: Crate {
25
44
if use_std ( & krate) {
@@ -29,9 +48,12 @@ pub fn maybe_inject_crates_ref(krate: ast::Crate, alt_std_name: Option<String>)
29
48
}
30
49
}
31
50
32
- pub fn maybe_inject_prelude ( krate : ast:: Crate ) -> ast:: Crate {
51
+ pub fn maybe_inject_prelude ( sess : & ParseSess , krate : ast:: Crate ) -> ast:: Crate {
33
52
if use_std ( & krate) {
34
- inject_prelude ( krate)
53
+ let mut fold = PreludeInjector {
54
+ span : ignored_span ( sess, DUMMY_SP )
55
+ } ;
56
+ fold. fold_crate ( krate)
35
57
} else {
36
58
krate
37
59
}
@@ -80,8 +102,9 @@ fn inject_crates_ref(krate: ast::Crate, alt_std_name: Option<String>) -> ast::Cr
80
102
fold. fold_crate ( krate)
81
103
}
82
104
83
- struct PreludeInjector ;
84
-
105
+ struct PreludeInjector {
106
+ span : Span
107
+ }
85
108
86
109
impl fold:: Folder for PreludeInjector {
87
110
fn fold_crate ( & mut self , mut krate : ast:: Crate ) -> ast:: Crate {
@@ -107,7 +130,7 @@ impl fold::Folder for PreludeInjector {
107
130
108
131
fn fold_mod ( & mut self , mut mod_ : ast:: Mod ) -> ast:: Mod {
109
132
let prelude_path = ast:: Path {
110
- span : DUMMY_SP ,
133
+ span : self . span ,
111
134
global : false ,
112
135
segments : vec ! [
113
136
ast:: PathSegment {
@@ -131,27 +154,22 @@ impl fold::Folder for PreludeInjector {
131
154
ident : special_idents:: invalid,
132
155
node : ast:: ItemUse ( vp) ,
133
156
attrs : vec ! [ ast:: Attribute {
134
- span: DUMMY_SP ,
157
+ span: self . span ,
135
158
node: ast:: Attribute_ {
136
159
id: attr:: mk_attr_id( ) ,
137
160
style: ast:: AttrOuter ,
138
161
value: P ( ast:: MetaItem {
139
- span: DUMMY_SP ,
162
+ span: self . span ,
140
163
node: ast:: MetaWord ( token:: get_name(
141
164
special_idents:: prelude_import. name) ) ,
142
165
} ) ,
143
166
is_sugared_doc: false ,
144
167
} ,
145
168
} ] ,
146
169
vis : ast:: Inherited ,
147
- span : DUMMY_SP ,
170
+ span : self . span ,
148
171
} ) ) ;
149
172
150
173
fold:: noop_fold_mod ( mod_, self )
151
174
}
152
175
}
153
-
154
- fn inject_prelude ( krate : ast:: Crate ) -> ast:: Crate {
155
- let mut fold = PreludeInjector ;
156
- fold. fold_crate ( krate)
157
- }
0 commit comments