@@ -148,31 +148,103 @@ impl<'a> fold::Folder for PreludeInjector<'a> {
148
148
}
149
149
150
150
fn fold_mod ( & mut self , module : & ast:: Mod ) -> ast:: Mod {
151
- let prelude_path = ast:: Path {
152
- span : DUMMY_SP ,
153
- global : false ,
154
- segments : vec ! (
155
- ast:: PathSegment {
156
- identifier: token:: str_to_ident( "std" ) ,
157
- lifetimes: Vec :: new( ) ,
158
- types: OwnedSlice :: empty( ) ,
159
- } ,
160
- ast:: PathSegment {
161
- identifier: token:: str_to_ident( "prelude" ) ,
162
- lifetimes: Vec :: new( ) ,
163
- types: OwnedSlice :: empty( ) ,
164
- } ) ,
165
- } ;
151
+ fn create_path_list ( path : & [ & str ] , idents : & [ & str ] ) -> ast:: ViewItem {
152
+ let base_path = ast:: Path {
153
+ span : DUMMY_SP ,
154
+ global : false ,
155
+ segments : path. iter ( ) . map ( |& s| {
156
+ ast:: PathSegment {
157
+ identifier : token:: str_to_ident ( s) ,
158
+ lifetimes : Vec :: new ( ) ,
159
+ types : OwnedSlice :: empty ( ) ,
160
+ }
161
+ } ) . collect ( ) ,
162
+ } ;
166
163
167
- let vp = @codemap:: dummy_spanned ( ast:: ViewPathGlob ( prelude_path, ast:: DUMMY_NODE_ID ) ) ;
168
- let vi2 = ast:: ViewItem {
169
- node : ast:: ViewItemUse ( vec ! ( vp) ) ,
170
- attrs : Vec :: new ( ) ,
171
- vis : ast:: Inherited ,
172
- span : DUMMY_SP ,
173
- } ;
164
+ let idents: Vec < ast:: PathListIdent > = idents. iter ( ) . map ( |& s| {
165
+ let ident = ast:: PathListIdent_ {
166
+ name : token:: str_to_ident ( s) ,
167
+ id : ast:: DUMMY_NODE_ID ,
168
+ } ;
169
+ codemap:: dummy_spanned ( ident)
170
+ } ) . collect ( ) ;
171
+
172
+ let view_path_ = ast:: ViewPathList ( base_path, idents, ast:: DUMMY_NODE_ID ) ;
173
+ let view_path = @codemap:: dummy_spanned ( view_path_) ;
174
+ let view_item = ast:: ViewItem {
175
+ node : ast:: ViewItemUse ( vec ! ( view_path) ) ,
176
+ attrs : Vec :: new ( ) ,
177
+ vis : ast:: Inherited ,
178
+ span : DUMMY_SP ,
179
+ } ;
180
+ view_item
181
+ }
182
+
183
+ let preludes = [
184
+ // Reexported core operators
185
+ ( & [ "std" , "kinds" ] , & [ "Copy" , "Send" , "Sized" , "Share" ] ) ,
186
+ ( & [ "std" , "ops" ] , & [ "Add" , "Sub" , "Mul" , "Div" , "Rem" , "Neg" , "Not" ] ) ,
187
+ ( & [ "std" , "ops" ] , & [ "BitAnd" , "BitOr" , "BitXor" ] ) ,
188
+ ( & [ "std" , "ops" ] , & [ "Drop" , "Deref" , "DerefMut" ] ) ,
189
+ ( & [ "std" , "ops" ] , & [ "Shl" , "Shr" , "Index" ] ) ,
190
+ ( & [ "std" , "option" ] , & [ "Option" , "Some" , "None" ] ) ,
191
+ ( & [ "std" , "result" ] , & [ "Result" , "Ok" , "Err" ] ) ,
192
+
193
+ // Reexported functions
194
+ ( & [ "std" , "from_str" ] , & [ "from_str" ] ) ,
195
+ ( & [ "std" , "iter" ] , & [ "range" ] ) ,
196
+ ( & [ "std" , "mem" ] , & [ "drop" ] ) ,
197
+
198
+ // Reexported types and traits
199
+ ( & [ "std" , "ascii" ] , & [ "Ascii" , "AsciiCast" , "OwnedAsciiCast" , "AsciiStr" , "IntoBytes" ] ) ,
200
+ ( & [ "std" , "c_str" ] , & [ "ToCStr" ] ) ,
201
+ ( & [ "std" , "char" ] , & [ "Char" ] ) ,
202
+ ( & [ "std" , "clone" ] , & [ "Clone" ] ) ,
203
+ ( & [ "std" , "cmp" ] , & [ "Eq" , "Ord" , "TotalEq" , "TotalOrd" , "Ordering" , "Less" , "Equal" , "Greater" , "Equiv" ] ) ,
204
+ ( & [ "std" , "container" ] , & [ "Container" , "Mutable" , "Map" , "MutableMap" , "Set" , "MutableSet" ] ) ,
205
+ ( & [ "std" , "iter" ] , & [ "FromIterator" , "Extendable" ] ) ,
206
+ ( & [ "std" , "iter" ] , & [ "Iterator" , "DoubleEndedIterator" , "RandomAccessIterator" , "CloneableIterator" ] ) ,
207
+ ( & [ "std" , "iter" ] , & [ "OrdIterator" , "MutableDoubleEndedIterator" , "ExactSize" ] ) ,
208
+ ( & [ "std" , "num" ] , & [ "Num" , "NumCast" , "CheckedAdd" , "CheckedSub" , "CheckedMul" ] ) ,
209
+ ( & [ "std" , "num" ] , & [ "Signed" , "Unsigned" , "Round" ] ) ,
210
+ ( & [ "std" , "num" ] , & [ "Primitive" , "Int" , "Float" , "ToPrimitive" , "FromPrimitive" ] ) ,
211
+ ( & [ "std" , "path" ] , & [ "GenericPath" , "Path" , "PosixPath" , "WindowsPath" ] ) ,
212
+ ( & [ "std" , "ptr" ] , & [ "RawPtr" ] ) ,
213
+ ( & [ "std" , "io" ] , & [ "Buffer" , "Writer" , "Reader" , "Seek" ] ) ,
214
+ ( & [ "std" , "str" ] , & [ "Str" , "StrVector" , "StrSlice" , "OwnedStr" , "IntoMaybeOwned" ] ) ,
215
+ ( & [ "std" , "to_str" ] , & [ "ToStr" , "IntoStr" ] ) ,
216
+ ( & [ "std" , "tuple" ] , & [ "Tuple1" , "Tuple2" , "Tuple3" , "Tuple4" ] ) ,
217
+ ( & [ "std" , "tuple" ] , & [ "Tuple5" , "Tuple6" , "Tuple7" , "Tuple8" ] ) ,
218
+ ( & [ "std" , "tuple" ] , & [ "Tuple9" , "Tuple10" , "Tuple11" , "Tuple12" ] ) ,
219
+ ( & [ "std" , "slice" ] , & [ "ImmutableEqVector" , "ImmutableTotalOrdVector" , "ImmutableCloneableVector" ] ) ,
220
+ ( & [ "std" , "slice" ] , & [ "OwnedVector" , "OwnedCloneableVector" , "OwnedEqVector" ] ) ,
221
+ ( & [ "std" , "slice" ] , & [ "MutableVector" , "MutableTotalOrdVector" ] ) ,
222
+ ( & [ "std" , "slice" ] , & [ "Vector" , "VectorVector" , "CloneableVector" , "ImmutableVector" ] ) ,
223
+ ( & [ "std" , "strbuf" ] , & [ "StrBuf" ] ) ,
224
+ ( & [ "std" , "vec" ] , & [ "Vec" ] ) ,
225
+
226
+ // Reexported runtime types
227
+ ( & [ "std" , "comm" ] , & [ "sync_channel" , "channel" , "SyncSender" , "Sender" , "Receiver" ] ) ,
228
+ ( & [ "std" , "task" ] , & [ "spawn" ] ) ,
229
+
230
+ // no GC. :p
231
+ ] ;
232
+
233
+ let preludes = preludes. iter ( ) . map ( |& ( base_path, idents) | {
234
+ create_path_list ( base_path, idents)
235
+ } ) . collect ( ) ;
236
+
237
+ let ( crates, uses) = module. view_items . partitioned ( |x| {
238
+ match x. node {
239
+ ast:: ViewItemExternCrate ( ..) => true ,
240
+ _ => false ,
241
+ }
242
+ } ) ;
174
243
175
- let vis = ( vec ! ( vi2) ) . append ( module. view_items . as_slice ( ) ) ;
244
+ // add preludes after any `extern crate` but before any `use`
245
+ let mut view_items = crates;
246
+ view_items. push_all_move ( preludes) ;
247
+ view_items. push_all_move ( uses) ;
176
248
177
249
// FIXME #2543: Bad copy.
178
250
let new_module = ast:: Mod {
0 commit comments