Skip to main content

miniextendr_lint/
rules.rs

1//! Lint rule implementations.
2//!
3//! Each submodule contains one or more related lint checks. All rules operate
4//! on the shared [`CrateIndex`] and produce
5//! [`Diagnostic`] values.
6
7pub mod doc_pkg_links;
8pub mod export_attrs;
9pub mod ffi_unchecked;
10pub mod fn_visibility;
11pub mod impl_validation;
12pub mod no_constructor;
13pub mod nonapi_attrib;
14pub mod r_reserved_params;
15pub mod raw_r_eval;
16pub mod rf_error;
17pub mod s4_method_prefix;
18pub mod vctrs_self_ctor;
19pub mod vec_into_sexp;
20
21use crate::crate_index::CrateIndex;
22use crate::diagnostic::Diagnostic;
23
24/// Run all lint rules against the crate index, collecting diagnostics.
25pub fn run_all_rules(index: &CrateIndex) -> Vec<Diagnostic> {
26    let mut diagnostics = Vec::new();
27
28    // Per-file impl validation (MXL008)
29    impl_validation::check(index, &mut diagnostics);
30
31    // Per-file: function visibility (MXL106)
32    fn_visibility::check(index, &mut diagnostics);
33
34    // Per-file: export attr redundancy (MXL203)
35    export_attrs::check(index, &mut diagnostics);
36
37    // Per-file: doc links into undeclared R packages (MXL204)
38    doc_pkg_links::check(index, &mut diagnostics);
39
40    // Per-file: R reserved words as parameter names (MXL110)
41    r_reserved_params::check(index, &mut diagnostics);
42
43    // Per-file: direct Rf_error/Rf_errorcall usage (MXL300)
44    rf_error::check(index, &mut diagnostics);
45
46    // Per-file: sys::*_unchecked() usage (MXL301)
47    ffi_unchecked::check(index, &mut diagnostics);
48
49    // Per-file: into_sexp() inside a vec!/array literal (MXL302)
50    vec_into_sexp::check(index, &mut diagnostics);
51
52    // Per-file: non-API ATTRIB / SET_ATTRIB usage (MXL304)
53    nonapi_attrib::check(index, &mut diagnostics);
54
55    // Per-file: raw R evaluation (Rf_eval, R_CheckUserInterrupt, ...) in a #[miniextendr] body (MXL305)
56    raw_r_eval::check(index, &mut diagnostics);
57
58    // Per-file: s4_* method name on #[miniextendr(s4)] impl (MXL111)
59    s4_method_prefix::check(index, &mut diagnostics);
60
61    // Per-file: vctrs ctor returns Self / instance receiver on vctrs impl (MXL120)
62    vctrs_self_ctor::check(index, &mut diagnostics);
63
64    // Crate-wide: a class R code can never create (MXL121)
65    no_constructor::check(index, &mut diagnostics);
66
67    // Sort by path and line for deterministic output
68    diagnostics.sort_by(|a, b| {
69        a.path
70            .cmp(&b.path)
71            .then(a.line.cmp(&b.line))
72            .then(a.code.cmp(&b.code))
73    });
74
75    diagnostics
76}