internal: Allow minicore flags specification to be order independent
This commit is contained in:
parent
476d043874
commit
28c21bc8a8
@ -61,6 +61,8 @@
|
||||
//! "
|
||||
//! ```
|
||||
|
||||
use std::iter;
|
||||
|
||||
use rustc_hash::FxHashMap;
|
||||
use stdx::trim_indent;
|
||||
|
||||
@ -259,7 +261,7 @@ fn parse(line: &str) -> MiniCore {
|
||||
if res.has_flag(entry) {
|
||||
panic!("duplicate minicore flag: {:?}", entry);
|
||||
}
|
||||
res.activated_flags.push(entry.to_string());
|
||||
res.activated_flags.push(entry.to_owned());
|
||||
}
|
||||
|
||||
res
|
||||
@ -273,35 +275,34 @@ pub fn source_code(mut self) -> String {
|
||||
let raw_mini_core = include_str!("./minicore.rs");
|
||||
let mut lines = raw_mini_core.split_inclusive('\n');
|
||||
|
||||
let mut parsing_flags = false;
|
||||
let mut implications = Vec::new();
|
||||
|
||||
// Parse `//!` preamble and extract flags and dependencies.
|
||||
for line in lines.by_ref() {
|
||||
let line = match line.strip_prefix("//!") {
|
||||
Some(it) => it,
|
||||
None => {
|
||||
assert!(line.trim().is_empty());
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
if parsing_flags {
|
||||
let (flag, deps) = line.split_once(':').unwrap();
|
||||
let flag = flag.trim();
|
||||
self.valid_flags.push(flag.to_string());
|
||||
for dep in deps.split(", ") {
|
||||
let dep = dep.trim();
|
||||
if !dep.is_empty() {
|
||||
self.assert_valid_flag(dep);
|
||||
implications.push((flag, dep));
|
||||
}
|
||||
}
|
||||
let trim_doc: fn(&str) -> Option<&str> = |line| match line.strip_prefix("//!") {
|
||||
Some(it) => Some(it),
|
||||
None => {
|
||||
assert!(line.trim().is_empty(), "expected empty line after minicore header");
|
||||
None
|
||||
}
|
||||
};
|
||||
for line in lines
|
||||
.by_ref()
|
||||
.map_while(trim_doc)
|
||||
.skip_while(|line| !line.contains("Available flags:"))
|
||||
.skip(1)
|
||||
{
|
||||
let (flag, deps) = line.split_once(':').unwrap();
|
||||
let flag = flag.trim();
|
||||
|
||||
if line.contains("Available flags:") {
|
||||
parsing_flags = true;
|
||||
}
|
||||
self.valid_flags.push(flag.to_string());
|
||||
implications.extend(
|
||||
iter::repeat(flag)
|
||||
.zip(deps.split(", ").map(str::trim).filter(|dep| !dep.is_empty())),
|
||||
);
|
||||
}
|
||||
|
||||
for (_, dep) in &implications {
|
||||
self.assert_valid_flag(dep);
|
||||
}
|
||||
|
||||
for flag in &self.activated_flags {
|
||||
@ -332,7 +333,7 @@ pub fn source_code(mut self) -> String {
|
||||
}
|
||||
if let Some(region) = trimmed.strip_prefix("// endregion:") {
|
||||
let prev = active_regions.pop().unwrap();
|
||||
assert_eq!(prev, region);
|
||||
assert_eq!(prev, region, "unbalanced region pairs");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -8,36 +8,36 @@
|
||||
//! We then strip all the code marked with other flags.
|
||||
//!
|
||||
//! Available flags:
|
||||
//! sized:
|
||||
//! unsize: sized
|
||||
//! coerce_unsized: unsize
|
||||
//! slice:
|
||||
//! range:
|
||||
//! deref: sized
|
||||
//! deref_mut: deref
|
||||
//! index: sized
|
||||
//! fn:
|
||||
//! try:
|
||||
//! pin:
|
||||
//! future: pin
|
||||
//! option:
|
||||
//! result:
|
||||
//! iterator: option
|
||||
//! iterators: iterator, fn
|
||||
//! default: sized
|
||||
//! hash:
|
||||
//! clone: sized
|
||||
//! copy: clone
|
||||
//! from: sized
|
||||
//! eq: sized
|
||||
//! ord: eq, option
|
||||
//! derive:
|
||||
//! fmt: result
|
||||
//! bool_impl: option, fn
|
||||
//! add:
|
||||
//! as_ref: sized
|
||||
//! bool_impl: option, fn
|
||||
//! clone: sized
|
||||
//! coerce_unsized: unsize
|
||||
//! copy: clone
|
||||
//! default: sized
|
||||
//! deref_mut: deref
|
||||
//! deref: sized
|
||||
//! derive:
|
||||
//! drop:
|
||||
//! eq: sized
|
||||
//! fmt: result
|
||||
//! fn:
|
||||
//! from: sized
|
||||
//! future: pin
|
||||
//! generator: pin
|
||||
//! hash:
|
||||
//! index: sized
|
||||
//! iterator: option
|
||||
//! iterators: iterator, fn
|
||||
//! option:
|
||||
//! ord: eq, option
|
||||
//! pin:
|
||||
//! range:
|
||||
//! result:
|
||||
//! sized:
|
||||
//! slice:
|
||||
//! try:
|
||||
//! unsize: sized
|
||||
|
||||
pub mod marker {
|
||||
// region:sized
|
||||
@ -584,7 +584,7 @@ fn next(&mut self) -> Option<B> {
|
||||
}
|
||||
}
|
||||
}
|
||||
pub use self::adapters::{Take, FilterMap};
|
||||
pub use self::adapters::{FilterMap, Take};
|
||||
|
||||
mod sources {
|
||||
mod repeat {
|
||||
|
Loading…
Reference in New Issue
Block a user