diff options
author | Aleksey Kladov <[email protected]> | 2021-06-13 10:33:08 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2021-06-13 11:13:26 +0100 |
commit | 546be18e3a91e4844b0dacc76c9f055397b6d89e (patch) | |
tree | 020b9667f0f723b06ee7fb6948efaa9e6b135f68 /xtask | |
parent | 0eafc88079fb5ddb1931e59860a4e064743e113a (diff) |
internal: check that coverage marks are always paired
Diffstat (limited to 'xtask')
-rw-r--r-- | xtask/src/tidy.rs | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/xtask/src/tidy.rs b/xtask/src/tidy.rs index 9447d463d..e6fa5868d 100644 --- a/xtask/src/tidy.rs +++ b/xtask/src/tidy.rs | |||
@@ -1,4 +1,7 @@ | |||
1 | use std::path::{Path, PathBuf}; | 1 | use std::{ |
2 | collections::HashSet, | ||
3 | path::{Path, PathBuf}, | ||
4 | }; | ||
2 | 5 | ||
3 | use xshell::{cmd, pushd, pushenv, read_file}; | 6 | use xshell::{cmd, pushd, pushenv, read_file}; |
4 | 7 | ||
@@ -81,6 +84,7 @@ Please adjust docs/dev/lsp-extensions.md. | |||
81 | #[test] | 84 | #[test] |
82 | fn rust_files_are_tidy() { | 85 | fn rust_files_are_tidy() { |
83 | let mut tidy_docs = TidyDocs::default(); | 86 | let mut tidy_docs = TidyDocs::default(); |
87 | let mut tidy_marks = TidyMarks::default(); | ||
84 | for path in rust_files() { | 88 | for path in rust_files() { |
85 | let text = read_file(&path).unwrap(); | 89 | let text = read_file(&path).unwrap(); |
86 | check_todo(&path, &text); | 90 | check_todo(&path, &text); |
@@ -88,8 +92,10 @@ fn rust_files_are_tidy() { | |||
88 | check_trailing_ws(&path, &text); | 92 | check_trailing_ws(&path, &text); |
89 | deny_clippy(&path, &text); | 93 | deny_clippy(&path, &text); |
90 | tidy_docs.visit(&path, &text); | 94 | tidy_docs.visit(&path, &text); |
95 | tidy_marks.visit(&path, &text); | ||
91 | } | 96 | } |
92 | tidy_docs.finish(); | 97 | tidy_docs.finish(); |
98 | tidy_marks.finish(); | ||
93 | } | 99 | } |
94 | 100 | ||
95 | #[test] | 101 | #[test] |
@@ -408,6 +414,39 @@ fn is_exclude_dir(p: &Path, dirs_to_exclude: &[&str]) -> bool { | |||
408 | .any(|it| dirs_to_exclude.contains(&it)) | 414 | .any(|it| dirs_to_exclude.contains(&it)) |
409 | } | 415 | } |
410 | 416 | ||
417 | #[derive(Default)] | ||
418 | struct TidyMarks { | ||
419 | hits: HashSet<String>, | ||
420 | checks: HashSet<String>, | ||
421 | } | ||
422 | |||
423 | impl TidyMarks { | ||
424 | fn visit(&mut self, _path: &Path, text: &str) { | ||
425 | for line in text.lines() { | ||
426 | if let Some(mark) = find_mark(line, "hit") { | ||
427 | self.hits.insert(mark.to_string()); | ||
428 | } | ||
429 | if let Some(mark) = find_mark(line, "check") { | ||
430 | self.checks.insert(mark.to_string()); | ||
431 | } | ||
432 | if let Some(mark) = find_mark(line, "check_count") { | ||
433 | self.checks.insert(mark.to_string()); | ||
434 | } | ||
435 | } | ||
436 | } | ||
437 | |||
438 | fn finish(self) { | ||
439 | assert!(!self.hits.is_empty()); | ||
440 | |||
441 | let diff: Vec<_> = | ||
442 | self.hits.symmetric_difference(&self.checks).map(|it| it.as_str()).collect(); | ||
443 | |||
444 | if !diff.is_empty() { | ||
445 | panic!("unpaired marks: {:?}", diff) | ||
446 | } | ||
447 | } | ||
448 | } | ||
449 | |||
411 | #[allow(deprecated)] | 450 | #[allow(deprecated)] |
412 | fn stable_hash(text: &str) -> u64 { | 451 | fn stable_hash(text: &str) -> u64 { |
413 | use std::hash::{Hash, Hasher, SipHasher}; | 452 | use std::hash::{Hash, Hasher, SipHasher}; |
@@ -417,3 +456,11 @@ fn stable_hash(text: &str) -> u64 { | |||
417 | text.hash(&mut hasher); | 456 | text.hash(&mut hasher); |
418 | hasher.finish() | 457 | hasher.finish() |
419 | } | 458 | } |
459 | |||
460 | fn find_mark<'a>(text: &'a str, mark: &'static str) -> Option<&'a str> { | ||
461 | let idx = text.find(mark)?; | ||
462 | let text = text[idx + mark.len()..].strip_prefix("!(")?; | ||
463 | let idx = text.find(|c: char| !(c.is_alphanumeric() || c == '_'))?; | ||
464 | let text = &text[..idx]; | ||
465 | Some(text) | ||
466 | } | ||