aboutsummaryrefslogtreecommitdiff
path: root/src/makefile
diff options
context:
space:
mode:
Diffstat (limited to 'src/makefile')
-rw-r--r--src/makefile/mod.rs98
1 files changed, 38 insertions, 60 deletions
diff --git a/src/makefile/mod.rs b/src/makefile/mod.rs
index 138d612..d55238e 100644
--- a/src/makefile/mod.rs
+++ b/src/makefile/mod.rs
@@ -130,15 +130,12 @@ impl CommandLine {
if let Token::Text(text) = line.first_token_mut() {
let mut text_chars = text.chars().peekable();
- loop {
- match text_chars.peek() {
- Some('-') | Some('@') | Some('+') => match text_chars.next() {
- Some('-') => ignore_errors = true,
- Some('@') => silent = true,
- Some('+') => always_execute = true,
- _ => unreachable!(),
- },
- _ => break,
+ while let Some(x) = text_chars.next_if(|x| matches!(x, '-' | '@' | '+')) {
+ match x {
+ '-' => ignore_errors = true,
+ '@' => silent = true,
+ '+' => always_execute = true,
+ _ => unreachable!(),
}
}
*text = text_chars.collect();
@@ -247,18 +244,14 @@ impl Makefile {
}
for r#macro in args.macros() {
- let pieces = r#macro.splitn(2, '=').collect::<Vec<_>>();
- match *pieces {
- [name, value] => {
- macros.insert(
- name.into(),
- (
- MacroSource::CommandLineOrMAKEFLAGS,
- TokenString::text(value),
- ),
- );
- }
- _ => {}
+ if let [name, value] = *r#macro.splitn(2, '=').collect::<Vec<_>>() {
+ macros.insert(
+ name.into(),
+ (
+ MacroSource::CommandLineOrMAKEFLAGS,
+ TokenString::text(value),
+ ),
+ );
}
}
@@ -281,27 +274,17 @@ impl Makefile {
pub fn and_read(&mut self, source: impl BufRead) -> &mut Makefile {
let mut lines_iter = source.lines().enumerate().peekable();
- while lines_iter.peek().is_some() {
- let (line_number, line) = match lines_iter.next() {
- Some(x) => x,
- // fancy Rust trick: break-with-an-argument to return a value from a
- // `loop` expression
- None => break,
- };
+ while let Some((line_number, line)) = lines_iter.next() {
// TODO handle I/O errors at all
let mut line = line.expect("failed to read line of makefile!");
// handle escaped newlines
- while line.ends_with(r"\") {
- let next_line = match lines_iter.next() {
- Some((_, x)) => x,
- None => Ok("".into()),
- };
- let next_line = next_line.expect("failed to read line of makefile!");
- let next_line = next_line.trim_start();
+ while line.ends_with('\\') {
line.pop();
line.push(' ');
- line.push_str(next_line);
+ if let Some((_, x)) = lines_iter.next() {
+ line.push_str(x.expect("failed to read line of makefile!").trim_start())
+ }
}
// handle comments
@@ -339,8 +322,8 @@ impl Makefile {
fn get_line_type(line_tokens: &TokenString) -> LineType {
for token in line_tokens.tokens() {
if let Token::Text(text) = token {
- let colon_idx = text.find(":");
- let equals_idx = text.find("=");
+ let colon_idx = text.find(':');
+ let equals_idx = text.find('=');
match (colon_idx, equals_idx) {
(Some(_), None) => {
return LineType::Rule;
@@ -369,12 +352,12 @@ impl Makefile {
let targets = self.expand_macros(&targets, None);
let targets = targets
.split_whitespace()
- .map(|x| x.into())
+ .map(Into::into)
.collect::<Vec<String>>();
let (prerequisites, mut commands) = match not_targets.split_once(';') {
Some((prerequisites, mut command)) => {
- while command.ends_with(r"\") && lines_iter.peek().is_some() {
- command.strip_suffix(r"\");
+ while command.ends_with("\\") && lines_iter.peek().is_some() {
+ command.strip_suffix("\\");
command
.extend(tokenize(&lines_iter.next().unwrap().1.unwrap()));
}
@@ -388,13 +371,15 @@ impl Makefile {
.map(|x| x.into())
.collect::<Vec<String>>();
- while lines_iter
- .peek()
- .and_then(|(_, x)| x.as_ref().ok())
- .map_or(false, |line| line.starts_with('\t') || line.is_empty())
- {
- let line = lines_iter.next().unwrap().1.unwrap();
- let mut line: String = line.strip_prefix("\t").unwrap_or(&line).into();
+ while let Some((_, x)) = lines_iter.next_if(|(_, x)| {
+ x.as_ref()
+ .ok()
+ .map_or(false, |line| line.starts_with('\t') || line.is_empty())
+ }) {
+ let mut line = x.unwrap();
+ if !line.is_empty() {
+ line.remove(0);
+ }
if line.is_empty() {
continue;
}
@@ -432,7 +417,7 @@ impl Makefile {
let special_target_match = SPECIAL_TARGET.captures(&targets[0]);
let inference_rule = targets.len() == 1
- && prerequisites.len() == 0
+ && prerequisites.is_empty()
&& inference_match.is_some()
&& special_target_match.is_none();
if inference_rule {
@@ -559,7 +544,7 @@ impl Makefile {
match targets.get(target) {
Some(target) => {
let target = target.borrow();
- target.prerequisites.len() == 0 || target.prerequisites.contains(&name.into())
+ target.prerequisites.is_empty() || target.prerequisites.iter().any(|e| e == name)
}
None => false,
}
@@ -765,7 +750,7 @@ impl Makefile {
}
}
}
- return result;
+ result
}
}
@@ -787,10 +772,8 @@ impl fmt::Display for Makefile {
writeln!(f)?;
header(f, "Targets")?;
- let targets = self.targets.borrow();
- for (_, target) in &*targets {
- let target = target.borrow();
- writeln!(f, "{}", target)?;
+ for target in self.targets.borrow().values() {
+ writeln!(f, "{}", target.borrow())?;
}
Ok(())
@@ -920,8 +903,3 @@ fn builtin_targets() -> Vec<Target> {
already_updated: Cell::new(false),
}]
}
-
-#[cfg(test)]
-mod test {
- use super::*;
-}