Lints and suggestions for the Nix programming language
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

new lint: deprecated_to_path

Akshay 7457498e adacdb07

+102 -1
+6
bin/tests/data/deprecated_to_path.nix
··· 1 + [ 2 + (builtins.toPath x) 3 + (toPath x) 4 + (toPath "/abc/def") 5 + (builtins.toPath "/some/path") 6 + ]
+2 -1
bin/tests/main.rs
··· 62 62 deprecated_is_null, 63 63 empty_inherit, 64 64 faster_groupby => session_info!("2.5"), 65 - faster_zipattrswith => session_info!("2.6") 65 + faster_zipattrswith => session_info!("2.6"), 66 + deprecated_to_path => session_info!("2.4") 66 67 }
+34
bin/tests/snapshots/main__deprecated_to_path.snap
··· 1 + --- 2 + source: bin/tests/main.rs 3 + expression: "&out" 4 + 5 + --- 6 + [W17] Warning: Found usage of deprecated builtin toPath 7 + ╭─[data/deprecated_to_path.nix:2:4] 8 + 9 + 2 │ (builtins.toPath x) 10 + · ────────┬──────── 11 + · ╰────────── builtins.toPath is deprecated, see :doc builtins.toPath within the REPL for more 12 + ───╯ 13 + [W17] Warning: Found usage of deprecated builtin toPath 14 + ╭─[data/deprecated_to_path.nix:3:4] 15 + 16 + 3 │ (toPath x) 17 + · ────┬─── 18 + · ╰───── toPath is deprecated, see :doc builtins.toPath within the REPL for more 19 + ───╯ 20 + [W17] Warning: Found usage of deprecated builtin toPath 21 + ╭─[data/deprecated_to_path.nix:4:4] 22 + 23 + 4 │ (toPath "/abc/def") 24 + · ────────┬──────── 25 + · ╰────────── toPath is deprecated, see :doc builtins.toPath within the REPL for more 26 + ───╯ 27 + [W17] Warning: Found usage of deprecated builtin toPath 28 + ╭─[data/deprecated_to_path.nix:5:4] 29 + 30 + 5 │ (builtins.toPath "/some/path") 31 + · ──────────────┬───────────── 32 + · ╰─────────────── builtins.toPath is deprecated, see :doc builtins.toPath within the REPL for more 33 + ───╯ 34 +
+1
lib/src/lints.rs
··· 17 17 empty_inherit, 18 18 faster_groupby, 19 19 faster_zipattrswith, 20 + deprecated_to_path, 20 21 }
+59
lib/src/lints/deprecated_to_path.rs
··· 1 + use crate::{session::SessionInfo, Metadata, Report, Rule}; 2 + 3 + use if_chain::if_chain; 4 + use macros::lint; 5 + use rnix::{ 6 + types::{Apply, TypedNode}, 7 + NodeOrToken, SyntaxElement, SyntaxKind, 8 + }; 9 + 10 + /// ## What it does 11 + /// Checks for usage of the `toPath` function. 12 + /// 13 + /// ## Why is this bad? 14 + /// `toPath` is deprecated. 15 + /// 16 + /// ## Example 17 + /// 18 + /// ```nix 19 + /// builtins.toPath "/path" 20 + /// ``` 21 + /// 22 + /// Try these instead: 23 + /// 24 + /// ```nix 25 + /// # to convert the string to an absolute path: 26 + /// /. + "/path" 27 + /// # => /abc 28 + /// 29 + /// # to convert the string to a path relative to the current directory: 30 + /// ./. + "/bin" 31 + /// # => /home/np/statix/bin 32 + /// ``` 33 + #[lint( 34 + name = "deprecated_to_path", 35 + note = "Found usage of deprecated builtin toPath", 36 + code = 17, 37 + match_with = SyntaxKind::NODE_APPLY 38 + )] 39 + struct DeprecatedIsNull; 40 + 41 + static ALLOWED_PATHS: &[&str; 2] = &["builtins.toPath", "toPath"]; 42 + 43 + impl Rule for DeprecatedIsNull { 44 + fn validate(&self, node: &SyntaxElement, _sess: &SessionInfo) -> Option<Report> { 45 + if_chain! { 46 + if let NodeOrToken::Node(node) = node; 47 + if let Some(apply) = Apply::cast(node.clone()); 48 + let lambda_path = apply.lambda()?.to_string(); 49 + if ALLOWED_PATHS.iter().any(|&p| p == lambda_path.as_str()); 50 + then { 51 + let at = node.text_range(); 52 + let message = format!("`{}` is deprecated, see `:doc builtins.toPath` within the REPL for more", lambda_path); 53 + Some(self.report().diagnostic(at, message)) 54 + } else { 55 + None 56 + } 57 + } 58 + } 59 + }