Literally all type systems could be described as “a static analyzer” that tries to assign and validate properties over the code it’s analyzing.
All compilers also rely on the results of that static analysis to direct codegen.
Rust’s type system implements substructural typing, and the borrow checker is an integral element of that type system.