Skip to content

Commit da42064

Browse files
committed
prelude experiment
TODO: prelude docs (macro?)
1 parent e332287 commit da42064

File tree

1 file changed

+95
-23
lines changed

1 file changed

+95
-23
lines changed

src/librustc/front/std_inject.rs

+95-23
Original file line numberDiff line numberDiff line change
@@ -148,31 +148,103 @@ impl<'a> fold::Folder for PreludeInjector<'a> {
148148
}
149149

150150
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+
};
166163

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+
});
174243

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);
176248

177249
// FIXME #2543: Bad copy.
178250
let new_module = ast::Mod {

0 commit comments

Comments
 (0)