Dogfood 'str_split_once() with compiler/
This commit is contained in:
parent
0f6f2d681b
commit
12db2225b6
7 changed files with 83 additions and 89 deletions
|
@ -28,6 +28,7 @@ Rust MIR: a lowered representation of Rust.
|
|||
#![feature(or_patterns)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(control_flow_enum)]
|
||||
#![feature(str_split_once)]
|
||||
#![recursion_limit = "256"]
|
||||
|
||||
#[macro_use]
|
||||
|
|
|
@ -148,23 +148,19 @@ impl DebugOptions {
|
|||
|
||||
if let Ok(env_debug_options) = std::env::var(RUSTC_COVERAGE_DEBUG_OPTIONS) {
|
||||
for setting_str in env_debug_options.replace(" ", "").replace("-", "_").split(',') {
|
||||
let mut setting = setting_str.splitn(2, '=');
|
||||
match setting.next() {
|
||||
Some(option) if option == "allow_unused_expressions" => {
|
||||
allow_unused_expressions = bool_option_val(option, setting.next());
|
||||
let (option, value) = match setting_str.split_once('=') {
|
||||
None => (setting_str, None),
|
||||
Some((k, v)) => (k, Some(v)),
|
||||
};
|
||||
if option == "allow_unused_expressions" {
|
||||
allow_unused_expressions = bool_option_val(option, value);
|
||||
debug!(
|
||||
"{} env option `allow_unused_expressions` is set to {}",
|
||||
RUSTC_COVERAGE_DEBUG_OPTIONS, allow_unused_expressions
|
||||
);
|
||||
}
|
||||
Some(option) if option == "counter_format" => {
|
||||
if let Some(strval) = setting.next() {
|
||||
counter_format = counter_format_option_val(strval);
|
||||
debug!(
|
||||
"{} env option `counter_format` is set to {:?}",
|
||||
RUSTC_COVERAGE_DEBUG_OPTIONS, counter_format
|
||||
);
|
||||
} else {
|
||||
} else if option == "counter_format" {
|
||||
match value {
|
||||
None => {
|
||||
bug!(
|
||||
"`{}` option in environment variable {} requires one or more \
|
||||
plus-separated choices (a non-empty subset of \
|
||||
|
@ -173,14 +169,20 @@ impl DebugOptions {
|
|||
RUSTC_COVERAGE_DEBUG_OPTIONS
|
||||
);
|
||||
}
|
||||
Some(val) => {
|
||||
counter_format = counter_format_option_val(val);
|
||||
debug!(
|
||||
"{} env option `counter_format` is set to {:?}",
|
||||
RUSTC_COVERAGE_DEBUG_OPTIONS, counter_format
|
||||
);
|
||||
}
|
||||
Some("") => {}
|
||||
Some(invalid) => bug!(
|
||||
};
|
||||
} else {
|
||||
bug!(
|
||||
"Unsupported setting `{}` in environment variable {}",
|
||||
invalid,
|
||||
option,
|
||||
RUSTC_COVERAGE_DEBUG_OPTIONS
|
||||
),
|
||||
None => {}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1296,8 +1296,10 @@ fn parse_output_types(
|
|||
if !debugging_opts.parse_only {
|
||||
for list in matches.opt_strs("emit") {
|
||||
for output_type in list.split(',') {
|
||||
let mut parts = output_type.splitn(2, '=');
|
||||
let shorthand = parts.next().unwrap();
|
||||
let (shorthand, path) = match output_type.split_once('=') {
|
||||
None => (output_type, None),
|
||||
Some((shorthand, path)) => (shorthand, Some(PathBuf::from(path))),
|
||||
};
|
||||
let output_type = OutputType::from_shorthand(shorthand).unwrap_or_else(|| {
|
||||
early_error(
|
||||
error_format,
|
||||
|
@ -1308,7 +1310,6 @@ fn parse_output_types(
|
|||
),
|
||||
)
|
||||
});
|
||||
let path = parts.next().map(PathBuf::from);
|
||||
output_types.insert(output_type, path);
|
||||
}
|
||||
}
|
||||
|
@ -1452,11 +1453,10 @@ fn parse_opt_level(
|
|||
let max_c = matches
|
||||
.opt_strs_pos("C")
|
||||
.into_iter()
|
||||
.flat_map(
|
||||
|(i, s)| {
|
||||
.flat_map(|(i, s)| {
|
||||
// NB: This can match a string without `=`.
|
||||
if let Some("opt-level") = s.splitn(2, '=').next() { Some(i) } else { None }
|
||||
},
|
||||
)
|
||||
})
|
||||
.max();
|
||||
if max_o > max_c {
|
||||
OptLevel::Default
|
||||
|
@ -1491,11 +1491,10 @@ fn select_debuginfo(
|
|||
let max_c = matches
|
||||
.opt_strs_pos("C")
|
||||
.into_iter()
|
||||
.flat_map(
|
||||
|(i, s)| {
|
||||
.flat_map(|(i, s)| {
|
||||
// NB: This can match a string without `=`.
|
||||
if let Some("debuginfo") = s.splitn(2, '=').next() { Some(i) } else { None }
|
||||
},
|
||||
)
|
||||
})
|
||||
.max();
|
||||
if max_g > max_c {
|
||||
DebugInfo::Full
|
||||
|
@ -1528,15 +1527,15 @@ fn parse_libs(
|
|||
.map(|s| {
|
||||
// Parse string of the form "[KIND=]lib[:new_name]",
|
||||
// where KIND is one of "dylib", "framework", "static".
|
||||
let mut parts = s.splitn(2, '=');
|
||||
let kind = parts.next().unwrap();
|
||||
let (name, kind) = match (parts.next(), kind) {
|
||||
(None, name) => (name, NativeLibKind::Unspecified),
|
||||
(Some(name), "dylib") => (name, NativeLibKind::Dylib),
|
||||
(Some(name), "framework") => (name, NativeLibKind::Framework),
|
||||
(Some(name), "static") => (name, NativeLibKind::StaticBundle),
|
||||
(Some(name), "static-nobundle") => (name, NativeLibKind::StaticNoBundle),
|
||||
(_, s) => {
|
||||
let (name, kind) = match s.split_once('=') {
|
||||
None => (s, NativeLibKind::Unspecified),
|
||||
Some((kind, name)) => {
|
||||
let kind = match kind {
|
||||
"dylib" => NativeLibKind::Dylib,
|
||||
"framework" => NativeLibKind::Framework,
|
||||
"static" => NativeLibKind::StaticBundle,
|
||||
"static-nobundle" => NativeLibKind::StaticNoBundle,
|
||||
s => {
|
||||
early_error(
|
||||
error_format,
|
||||
&format!(
|
||||
|
@ -1547,6 +1546,9 @@ fn parse_libs(
|
|||
);
|
||||
}
|
||||
};
|
||||
(name.to_string(), kind)
|
||||
}
|
||||
};
|
||||
if kind == NativeLibKind::StaticNoBundle
|
||||
&& !nightly_options::match_is_nightly_build(matches)
|
||||
{
|
||||
|
@ -1556,10 +1558,11 @@ fn parse_libs(
|
|||
accepted on the nightly compiler",
|
||||
);
|
||||
}
|
||||
let mut name_parts = name.splitn(2, ':');
|
||||
let name = name_parts.next().unwrap();
|
||||
let new_name = name_parts.next();
|
||||
(name.to_owned(), new_name.map(|n| n.to_owned()), kind)
|
||||
let (name, new_name) = match name.split_once(':') {
|
||||
None => (name, None),
|
||||
Some((name, new_name)) => (name.to_string(), Some(new_name.to_owned())),
|
||||
};
|
||||
(name, new_name, kind)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
@ -1580,20 +1583,13 @@ pub fn parse_externs(
|
|||
let is_unstable_enabled = debugging_opts.unstable_options;
|
||||
let mut externs: BTreeMap<String, ExternEntry> = BTreeMap::new();
|
||||
for arg in matches.opt_strs("extern") {
|
||||
let mut parts = arg.splitn(2, '=');
|
||||
let name = parts
|
||||
.next()
|
||||
.unwrap_or_else(|| early_error(error_format, "--extern value must not be empty"));
|
||||
let path = parts.next().map(|s| s.to_string());
|
||||
|
||||
let mut name_parts = name.splitn(2, ':');
|
||||
let first_part = name_parts.next();
|
||||
let second_part = name_parts.next();
|
||||
let (options, name) = match (first_part, second_part) {
|
||||
(Some(opts), Some(name)) => (Some(opts), name),
|
||||
(Some(name), None) => (None, name),
|
||||
(None, None) => early_error(error_format, "--extern name must not be empty"),
|
||||
_ => unreachable!(),
|
||||
let (name, path) = match arg.split_once('=') {
|
||||
None => (arg, None),
|
||||
Some((name, path)) => (name.to_string(), Some(path.to_string())),
|
||||
};
|
||||
let (options, name) = match name.split_once(':') {
|
||||
None => (None, name),
|
||||
Some((opts, name)) => (Some(opts), name.to_string()),
|
||||
};
|
||||
|
||||
let entry = externs.entry(name.to_owned());
|
||||
|
@ -1682,17 +1678,12 @@ fn parse_remap_path_prefix(
|
|||
matches
|
||||
.opt_strs("remap-path-prefix")
|
||||
.into_iter()
|
||||
.map(|remap| {
|
||||
let mut parts = remap.rsplitn(2, '='); // reverse iterator
|
||||
let to = parts.next();
|
||||
let from = parts.next();
|
||||
match (from, to) {
|
||||
(Some(from), Some(to)) => (PathBuf::from(from), PathBuf::from(to)),
|
||||
_ => early_error(
|
||||
.map(|remap| match remap.rsplit_once('=') {
|
||||
None => early_error(
|
||||
error_format,
|
||||
"--remap-path-prefix must contain '=' between FROM and TO",
|
||||
),
|
||||
}
|
||||
Some((from, to)) => (PathBuf::from(from), PathBuf::from(to)),
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#![feature(crate_visibility_modifier)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(or_patterns)]
|
||||
#![feature(str_split_once)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
|
|
|
@ -179,9 +179,10 @@ macro_rules! options {
|
|||
{
|
||||
let mut op = $defaultfn();
|
||||
for option in matches.opt_strs($prefix) {
|
||||
let mut iter = option.splitn(2, '=');
|
||||
let key = iter.next().unwrap();
|
||||
let value = iter.next();
|
||||
let (key, value) = match option.split_once('=') {
|
||||
None => (option, None),
|
||||
Some((k, v)) => (k.to_string(), Some(v)),
|
||||
};
|
||||
let option_to_lookup = key.replace("-", "_");
|
||||
let mut found = false;
|
||||
for &(candidate, setter, type_desc, _) in $stat {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#![feature(never_type)]
|
||||
#![feature(associated_type_bounds)]
|
||||
#![feature(exhaustive_patterns)]
|
||||
#![feature(str_split_once)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
|
|
@ -54,10 +54,7 @@ fn macos_deployment_target() -> (u32, u32) {
|
|||
let deployment_target = env::var("MACOSX_DEPLOYMENT_TARGET").ok();
|
||||
let version = deployment_target
|
||||
.as_ref()
|
||||
.and_then(|s| {
|
||||
let mut i = s.splitn(2, '.');
|
||||
i.next().and_then(|a| i.next().map(|b| (a, b)))
|
||||
})
|
||||
.and_then(|s| s.split_once('.'))
|
||||
.and_then(|(a, b)| a.parse::<u32>().and_then(|a| b.parse::<u32>().map(|b| (a, b))).ok());
|
||||
|
||||
version.unwrap_or((10, 7))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue