X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fissues.rs;h=ad7babca118109a3278f94880bf0c98afb64b761;hb=fc3ea494ac73aee782a903849c09bb011fe18e37;hp=be30ff2d86eb0cf1afc81c18e33cda13a8653ede;hpb=be959667c15db7275cfa72100bb7e55ff577a3a0;p=rust.git diff --git a/src/issues.rs b/src/issues.rs index be30ff2d86e..ad7babca118 100644 --- a/src/issues.rs +++ b/src/issues.rs @@ -14,17 +14,15 @@ use std::fmt; -pub use config::ReportTactic; +use config::ReportTactic; -const TO_DO_CHARS: &'static [char] = &['T', 'O', 'D', 'O']; -const FIX_ME_CHARS: &'static [char] = &['F', 'I', 'X', 'M', 'E']; +const TO_DO_CHARS: &[char] = &['t', 'o', 'd', 'o']; +const FIX_ME_CHARS: &[char] = &['f', 'i', 'x', 'm', 'e']; // Enabled implementation detail is here because it is // irrelevant outside the issues module -impl ReportTactic { - fn is_enabled(&self) -> bool { - *self != ReportTactic::Never - } +fn is_enabled(report_tactic: ReportTactic) -> bool { + report_tactic != ReportTactic::Never } #[derive(Clone, Copy)] @@ -90,11 +88,15 @@ pub fn new(report_todo: ReportTactic, report_fixme: ReportTactic) -> BadIssueSee todo_idx: 0, fixme_idx: 0, }, - report_todo: report_todo, - report_fixme: report_fixme, + report_todo, + report_fixme, } } + pub fn is_disabled(&self) -> bool { + !is_enabled(self.report_todo) && !is_enabled(self.report_fixme) + } + // Check whether or not the current char is conclusive evidence for an // unnumbered TO-DO or FIX-ME. pub fn inspect(&mut self, c: char) -> Option { @@ -127,49 +129,50 @@ pub fn inspect(&mut self, c: char) -> Option { } fn inspect_issue(&mut self, c: char, mut todo_idx: usize, mut fixme_idx: usize) -> Seeking { - // FIXME: Should we also check for lower case characters? - if self.report_todo.is_enabled() && c == TO_DO_CHARS[todo_idx] { - todo_idx += 1; - if todo_idx == TO_DO_CHARS.len() { - return Seeking::Number { - issue: Issue { - issue_type: IssueType::Todo, - missing_number: if let ReportTactic::Unnumbered = self.report_todo { - true - } else { - false + if let Some(lower_case_c) = c.to_lowercase().next() { + if is_enabled(self.report_todo) && lower_case_c == TO_DO_CHARS[todo_idx] { + todo_idx += 1; + if todo_idx == TO_DO_CHARS.len() { + return Seeking::Number { + issue: Issue { + issue_type: IssueType::Todo, + missing_number: if let ReportTactic::Unnumbered = self.report_todo { + true + } else { + false + }, }, - }, - part: NumberPart::OpenParen, - }; - } - fixme_idx = 0; - } else if self.report_fixme.is_enabled() && c == FIX_ME_CHARS[fixme_idx] { - // Exploit the fact that the character sets of todo and fixme - // are disjoint by adding else. - fixme_idx += 1; - if fixme_idx == FIX_ME_CHARS.len() { - return Seeking::Number { - issue: Issue { - issue_type: IssueType::Fixme, - missing_number: if let ReportTactic::Unnumbered = self.report_fixme { - true - } else { - false + part: NumberPart::OpenParen, + }; + } + fixme_idx = 0; + } else if is_enabled(self.report_fixme) && lower_case_c == FIX_ME_CHARS[fixme_idx] { + // Exploit the fact that the character sets of todo and fixme + // are disjoint by adding else. + fixme_idx += 1; + if fixme_idx == FIX_ME_CHARS.len() { + return Seeking::Number { + issue: Issue { + issue_type: IssueType::Fixme, + missing_number: if let ReportTactic::Unnumbered = self.report_fixme { + true + } else { + false + }, }, - }, - part: NumberPart::OpenParen, - }; + part: NumberPart::OpenParen, + }; + } + todo_idx = 0; + } else { + todo_idx = 0; + fixme_idx = 0; } - todo_idx = 0; - } else { - todo_idx = 0; - fixme_idx = 0; } Seeking::Issue { - todo_idx: todo_idx, - fixme_idx: fixme_idx, + todo_idx, + fixme_idx, } } @@ -190,26 +193,29 @@ fn inspect_number( } match part { - NumberPart::OpenParen => if c != '(' { - return IssueClassification::Bad(issue); - } else { - part = NumberPart::Pound; - }, - NumberPart::Pound => if c == '#' { - part = NumberPart::Number; - }, - NumberPart::Number => if c >= '0' && c <= '9' { - part = NumberPart::CloseParen; - } else { - return IssueClassification::Bad(issue); - }, + NumberPart::OpenParen => { + if c != '(' { + return IssueClassification::Bad(issue); + } else { + part = NumberPart::Pound; + } + } + NumberPart::Pound => { + if c == '#' { + part = NumberPart::Number; + } + } + NumberPart::Number => { + if c >= '0' && c <= '9' { + part = NumberPart::CloseParen; + } else { + return IssueClassification::Bad(issue); + } + } NumberPart::CloseParen => {} } - self.state = Seeking::Number { - part: part, - issue: issue, - }; + self.state = Seeking::Number { part, issue }; IssueClassification::None } @@ -221,13 +227,13 @@ fn check_fail(text: &str, failing_pos: usize) { let mut seeker = BadIssueSeeker::new(ReportTactic::Unnumbered, ReportTactic::Unnumbered); assert_eq!( Some(failing_pos), - text.chars().position(|c| seeker.inspect(c).is_some()) + text.find(|c| seeker.inspect(c).is_some()) ); } fn check_pass(text: &str) { let mut seeker = BadIssueSeeker::new(ReportTactic::Unnumbered, ReportTactic::Unnumbered); - assert_eq!(None, text.chars().position(|c| seeker.inspect(c).is_some())); + assert_eq!(None, text.find(|c| seeker.inspect(c).is_some())); } check_fail("TODO\n", 4); @@ -262,12 +268,24 @@ fn is_bad_issue(text: &str, report_todo: ReportTactic, report_fixme: ReportTacti ReportTactic::Always, )); + assert!(!is_bad_issue( + "Todo: mixed case\n", + ReportTactic::Never, + ReportTactic::Always, + )); + assert!(is_bad_issue( "This is a FIXME(#1)\n", ReportTactic::Never, ReportTactic::Always, )); + assert!(is_bad_issue( + "This is a FixMe(#1) mixed case\n", + ReportTactic::Never, + ReportTactic::Always, + )); + assert!(!is_bad_issue( "bad FIXME\n", ReportTactic::Always,