From 8bff2cf4cc2644a841ea38d04ec13a13858e6dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Mon, 3 Mar 2025 15:30:17 +0100 Subject: [PATCH] Get a half working example working MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- .gitignore | 1 + dylint_driver/Cargo.lock | 378 +++++++++++++++++++++++++++ dylint_driver/Cargo.toml | 9 + dylint_driver/src/main.rs | 13 + flake.nix | 19 +- lib/cargo-dylint-driver.nix | 27 ++ lib/cargo-dylint-patch-rustup.patch | 82 ++++++ lib/cargo-dylint.nix | 52 ++-- lib/default.nix | 1 + rust-toolchain.toml | 1 + tests/example_lint_target/Cargo.lock | 7 + tests/example_lint_target/Cargo.toml | 6 + tests/example_lint_target/src/lib.rs | 16 ++ 13 files changed, 595 insertions(+), 17 deletions(-) create mode 100644 dylint_driver/Cargo.lock create mode 100644 dylint_driver/Cargo.toml create mode 100644 dylint_driver/src/main.rs create mode 100644 lib/cargo-dylint-driver.nix create mode 100644 lib/cargo-dylint-patch-rustup.patch create mode 100644 tests/example_lint_target/Cargo.lock create mode 100644 tests/example_lint_target/Cargo.toml create mode 100644 tests/example_lint_target/src/lib.rs diff --git a/.gitignore b/.gitignore index 2bbdbfe..5516773 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .direnv result +target/ diff --git a/dylint_driver/Cargo.lock b/dylint_driver/Cargo.lock new file mode 100644 index 0000000..df1ece8 --- /dev/null +++ b/dylint_driver/Cargo.lock @@ -0,0 +1,378 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "dylint_driver" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4db7cd0e98997a1717c2efae76cb301835cc1a224bad4274837e23fc89846103" +dependencies = [ + "anyhow", + "dylint_internal", + "libc", + "libloading", + "log", + "rustversion", + "serde_json", +] + +[[package]] +name = "dylint_driver-nix" +version = "0.1.0" +dependencies = [ + "anyhow", + "dylint_driver", + "env_logger", +] + +[[package]] +name = "dylint_internal" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89499236f169dc57ad3c6c8e85eea213efcf743c5a9856ab82522e62512bcff" +dependencies = [ + "anyhow", + "log", + "once_cell", + "regex", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" + +[[package]] +name = "libc" +version = "0.2.170" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets", +] + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + +[[package]] +name = "ryu" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" + +[[package]] +name = "serde" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.218" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/dylint_driver/Cargo.toml b/dylint_driver/Cargo.toml new file mode 100644 index 0000000..aeae764 --- /dev/null +++ b/dylint_driver/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "dylint_driver-nix" +version = "0.1.0" +edition = "2018" + +[dependencies] +anyhow = "1.0" +env_logger = "0.11" +dylint_driver = "4.0.0" diff --git a/dylint_driver/src/main.rs b/dylint_driver/src/main.rs new file mode 100644 index 0000000..9970347 --- /dev/null +++ b/dylint_driver/src/main.rs @@ -0,0 +1,13 @@ +#![feature(rustc_private)] + +use anyhow::Result; +use std::env; +use std::ffi::OsString; + +pub fn main() -> Result<()> { + env_logger::init(); + let args: Vec<_> = env::args().map(OsString::from).collect(); + dylint_driver::dylint_driver(&args) +} + + diff --git a/flake.nix b/flake.nix index 071f9c9..1e9bdd0 100644 --- a/flake.nix +++ b/flake.nix @@ -23,7 +23,16 @@ ]; }; - rustTarget = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; + rustTarget = pkgs.rust-bin.nightly."2025-02-20".default.override { + extensions = [ + "rust-src" + "rust-std" + "cargo" + "rustc" + "rustc-dev" + "llvm-tools" + ]; + }; craneLib = (inputs.crane.mkLib pkgs).overrideToolchain rustTarget; lib = import ./lib { @@ -38,11 +47,17 @@ packages = lib // { inherit craneLib; rust = rustTarget; + drivers = pkgs.runCommandLocal "dylint-drivers" {} '' + mkdir -p $out/nightly-nix + ln -s ${lib.cargo-dylint-driver}/bin/dylint_driver-nix $out/nightly-nix/dylint-driver + ''; }; devShells.default = pkgs.mkShell { + RUSTUP_TOOLCHAIN = "nightly-nix"; nativeBuildInputs = [ - pkgs.rust-bin.nightly.latest.default + rustTarget + lib.cargo-dylint ]; }; } diff --git a/lib/cargo-dylint-driver.nix b/lib/cargo-dylint-driver.nix new file mode 100644 index 0000000..74f9f1c --- /dev/null +++ b/lib/cargo-dylint-driver.nix @@ -0,0 +1,27 @@ +{ + craneLib, +}: + +let + pname = "cargo-dylint-driver"; + version = "4.0.0"; + + src = ../dylint_driver; + + commonArgs = { + inherit pname version src; + + strictDeps = true; + + RUSTUP_TOOLCHAIN = "nightly-nix"; + }; +in + +craneLib.buildPackage ( + commonArgs + // { + cargoArtifacts = craneLib.buildDepsOnly commonArgs; + + doNotRemoveReferencesToRustToolchain = true; + } +) diff --git a/lib/cargo-dylint-patch-rustup.patch b/lib/cargo-dylint-patch-rustup.patch new file mode 100644 index 0000000..6c5ac97 --- /dev/null +++ b/lib/cargo-dylint-patch-rustup.patch @@ -0,0 +1,82 @@ +diff --git a/dylint/build.rs b/dylint/build.rs +index f96b676f..297d2dcf 100644 +--- a/dylint/build.rs ++++ b/dylint/build.rs +@@ -31,7 +31,7 @@ fn write_dylint_driver_manifest_dir() { + { + "None".to_owned() + } else { +- let path_buf = dylint_manifest_dir.join("../driver"); ++ let path_buf = Path::new("@DRIVER_DIR@"); + + // smoelius: Ensure the path exists at build time. + assert!(path_buf.is_dir(), "{path_buf:?} is not a directory"); +diff --git a/internal/src/cargo.rs b/internal/src/cargo.rs +index 8532d68c..4e7f715c 100644 +--- a/internal/src/cargo.rs ++++ b/internal/src/cargo.rs +@@ -14,16 +14,7 @@ use std::{ + pub use home::cargo_home; + + static STABLE_CARGO: Lazy = Lazy::new(|| { +- let mut command = Command::new("rustup"); +- // smoelius: Rustup 1.27.1 doesn't properly handle the case where the toolchain is specified via +- // both the `RUSTUP_TOOLCHAIN` environment variable and the command line (e.g., `+stable`). This +- // bug is fixed in Rustup's `master` branch, though. +- command.env_remove("RUSTUP_TOOLCHAIN"); +- command.args(["+stable", "which", "cargo"]); +- let output = command.logged_output(true).unwrap(); +- assert!(output.status.success()); +- let stdout = String::from_utf8(output.stdout).unwrap(); +- PathBuf::from(stdout.trim_end()) ++ PathBuf::from("@STABLE_CARGO@") + }); + + bitflags! { +diff --git a/internal/src/rustup.rs b/internal/src/rustup.rs +index fb72a3fa..9b320670 100644 +--- a/internal/src/rustup.rs ++++ b/internal/src/rustup.rs +@@ -15,7 +15,7 @@ impl SanitizeEnvironment for Command { + fn sanitize_environment(&mut self) -> &mut Self { + self.env_remove(env::CARGO); + self.env_remove(env::RUSTC); +- self.env_remove(env::RUSTUP_TOOLCHAIN); ++ // self.env_remove(env::RUSTUP_TOOLCHAIN); + self + } + } +@@ -23,31 +23,11 @@ impl SanitizeEnvironment for Command { + // smoelius: Consider carefully whether you need to call this function! In most cases, the toolchain + // you want is not the one returned by rustup. + pub fn active_toolchain(path: &Path) -> Result { +- let output = Command::new("rustup") +- .sanitize_environment() +- .current_dir(path) +- .args(["show", "active-toolchain"]) +- .logged_output(true)?; +- let stdout = std::str::from_utf8(&output.stdout)?; +- stdout +- .split_once(' ') +- .map(|(s, _)| s.to_owned()) +- .ok_or_else(|| anyhow!("Could not determine active toolchain")) ++ Ok(String::from("@RUST_TOOLCHAIN@")) + } + + pub fn toolchain_path(path: &Path) -> Result { +- let output = Command::new("rustup") +- .sanitize_environment() +- .current_dir(path) +- .args(["which", "rustc"]) +- .logged_output(true)?; +- let stdout = std::str::from_utf8(&output.stdout)?; +- let path = PathBuf::from(stdout); +- // smoelius: `path` should end with `/bin/rustc`. +- path.ancestors() +- .nth(2) +- .map(Into::into) +- .ok_or_else(|| anyhow!("Could not get ancestor")) ++ Ok(PathBuf::from("@RUST_TOOLCHAIN_PATH@")) + } + + pub fn is_rustc + ?Sized>(arg: &T) -> bool { diff --git a/lib/cargo-dylint.nix b/lib/cargo-dylint.nix index d85a549..1e75c70 100644 --- a/lib/cargo-dylint.nix +++ b/lib/cargo-dylint.nix @@ -4,6 +4,8 @@ pkg-config, openssl, + + cargo-dylint-driver, }: let @@ -16,24 +18,44 @@ let tag = "v${version}"; sha256 = "sha256-Z8uuewp7Buoadayc0oTafmfvwNT36KukWKiHxL/mQfI="; }; + + commonArgs = { + inherit pname version src; + + buildInputs = [ + openssl + ]; + + nativeBuildInputs = [ + pkg-config + ]; + + RUSTUP_TOOLCHAIN = "nightly-nix"; + + doCheck = false; + }; + cargoArtifacts = craneLib.buildDepsOnly commonArgs; in -craneLib.buildPackage { - inherit - pname - version - src - ; +craneLib.buildPackage ( + commonArgs + // { + inherit cargoArtifacts; - buildInputs = [ - openssl - ]; + patches = [ ./cargo-dylint-patch-rustup.patch ]; - nativeBuildInputs = [ - pkg-config - ]; + postPatch = '' + substituteInPlace dylint/build.rs \ + --replace-fail @DRIVER_DIR@ ${src}/driver - RUSTUP_TOOLCHAIN = craneLib.rustc.version; + substituteInPlace internal/src/cargo.rs \ + --replace-fail @STABLE_CARGO@ ${craneLib.cargo}/bin/cargo - doCheck = false; -} + substituteInPlace internal/src/rustup.rs \ + --replace-fail @RUST_TOOLCHAIN@ "nightly-nix" \ + --replace-fail @RUST_TOOLCHAIN_PATH@ ${craneLib.rustc} + ''; + + doNotRemoveReferencesToRustToolchain = true; + } +) diff --git a/lib/default.nix b/lib/default.nix index ef77125..df49067 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -9,6 +9,7 @@ let callPackage = pkgs.lib.callPackageWith (pkgs // packages // { inherit inputs craneLib; }); packages = { cargo-dylint = callPackage ./cargo-dylint.nix { }; + cargo-dylint-driver = callPackage ./cargo-dylint-driver.nix { }; }; in diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 168d4fd..9b1b31a 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,3 @@ [toolchain] channel = "nightly-2025-03-01" +components = ["rust-src", "rustc-dev", "llvm-tools-preview"] diff --git a/tests/example_lint_target/Cargo.lock b/tests/example_lint_target/Cargo.lock new file mode 100644 index 0000000..2ac4612 --- /dev/null +++ b/tests/example_lint_target/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "example_lint_target" +version = "0.1.0" diff --git a/tests/example_lint_target/Cargo.toml b/tests/example_lint_target/Cargo.toml new file mode 100644 index 0000000..f1becdf --- /dev/null +++ b/tests/example_lint_target/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "example_lint_target" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/tests/example_lint_target/src/lib.rs b/tests/example_lint_target/src/lib.rs new file mode 100644 index 0000000..1aff2da --- /dev/null +++ b/tests/example_lint_target/src/lib.rs @@ -0,0 +1,16 @@ +#![allow(unused)] + +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +}