use lang_parsing_substrate::{
dead_code_ranges_with_assumptions, posix_default_assumptions, PlatformAssumptions,
};
use tree_sitter::Node;
pub fn platform_assumptions() -> PlatformAssumptions {
posix_default_assumptions()
}
#[derive(Debug, Clone, Default)]
pub struct DeadRegions {
ranges: Vec<(usize, usize)>,
}
impl DeadRegions {
pub fn of(source: &str) -> Self {
let ranges = dead_code_ranges_with_assumptions(source, &platform_assumptions())
.into_iter()
.map(|r| (r.start_line, r.end_line))
.collect();
Self { ranges }
}
pub fn contains_line(&self, line: usize) -> bool {
self.ranges
.iter()
.any(|&(start, end)| line >= start && line <= end)
}
pub fn contains_node(&self, node: &Node) -> bool {
self.contains_line(node.start_position().row + 1)
}
}
#[cfg(test)]
mod tests {
use super::*;
const HOSTAP_COMMON_H: &str = "\
#ifdef _MSC_VER
typedef UINT16 u16;
#define WPA_TYPES_DEFINED
#endif /* _MSC_VER */
#ifdef __vxworks
typedef UINT16 u16;
#define WPA_TYPES_DEFINED
#endif /* __vxworks */
#ifndef WPA_TYPES_DEFINED
typedef uint16_t u16;
#define WPA_TYPES_DEFINED
#endif /* !WPA_TYPES_DEFINED */
";
#[test]
fn posix_profile_kills_msc_and_vxworks_arms_but_not_the_fallback() {
let dead = DeadRegions::of(HOSTAP_COMMON_H);
assert!(dead.contains_line(2), "_MSC_VER arm is dead");
assert!(dead.contains_line(7), "__vxworks arm is dead");
assert!(
!dead.contains_line(12),
"the #ifndef WPA_TYPES_DEFINED arm is the live one"
);
}
#[test]
fn build_config_macro_stays_neutral() {
let dead = DeadRegions::of(
"#ifdef WPA_TRACE\n#define os_strdup(s) trace_strdup(s)\n#else\n#define os_strdup(s) strdup(s)\n#endif\n",
);
assert!(
dead.ranges.is_empty(),
"no opinion on WPA_TRACE: {:?}",
dead
);
}
#[test]
fn local_define_overrides_the_assumption() {
let dead =
DeadRegions::of("#define _WIN32 1\n#ifdef _WIN32\nint a;\n#else\nint b;\n#endif\n");
assert!(!dead.contains_line(3));
assert!(dead.contains_line(5));
}
}