@@ -100,6 +100,7 @@ impl<'a> fold::Folder for StandardLibraryInjector<'a> {
100
100
} ) ;
101
101
}
102
102
103
+ // `extern crate` must be precede `use` items
103
104
vis. push_all_move ( krate. module . view_items . clone ( ) ) ;
104
105
let new_module = ast:: Mod {
105
106
view_items : vis,
@@ -130,8 +131,20 @@ impl<'a> fold::Folder for PreludeInjector<'a> {
130
131
if !no_prelude ( krate. attrs . as_slice ( ) ) {
131
132
// only add `use std::prelude::*;` if there wasn't a
132
133
// `#![no_implicit_prelude]` at the crate level.
134
+
135
+ let mut attrs = krate. attrs . clone ( ) ;
136
+
137
+ // fold_mod() will insert glob path.
138
+ let globs_attr = attr:: mk_attr ( attr:: mk_list_item (
139
+ InternedString :: new ( "feature" ) ,
140
+ vec ! (
141
+ attr:: mk_word_item( InternedString :: new( "globs" ) ) ,
142
+ ) ) ) ;
143
+ attrs. push ( globs_attr) ;
144
+
133
145
ast:: Crate {
134
146
module : self . fold_mod ( & krate. module ) ,
147
+ attrs : attrs,
135
148
..krate
136
149
}
137
150
} else {
@@ -175,11 +188,20 @@ impl<'a> fold::Folder for PreludeInjector<'a> {
175
188
span : DUMMY_SP ,
176
189
} ;
177
190
178
- let vis = ( vec ! ( vi2) ) . append ( module. view_items . as_slice ( ) ) ;
191
+ let ( crates, uses) = module. view_items . partitioned ( |x| {
192
+ match x. node {
193
+ ast:: ViewItemExternCrate ( ..) => true ,
194
+ _ => false ,
195
+ }
196
+ } ) ;
197
+
198
+ // add vi2 after any `extern crate` but before any `use`
199
+ let mut view_items = crates;
200
+ view_items. push ( vi2) ;
201
+ view_items. push_all_move ( uses) ;
179
202
180
- // FIXME #2543: Bad copy.
181
203
let new_module = ast:: Mod {
182
- view_items : vis ,
204
+ view_items : view_items ,
183
205
..( * module) . clone ( )
184
206
} ;
185
207
fold:: noop_fold_mod ( & new_module, self )
0 commit comments