chore: enable more clippy restriction lints#10114
Merged
Merged
Conversation
✅ Deploy Preview for rolldown-rs canceled.
|
hyfdev
approved these changes
Jul 3, 2026
Member
Merge activity
|
Merging this PR will not alter performance
Comparing Footnotes
|
## Summary
Audited the entire clippy `restriction` group (~130 lints) plus the `cargo` group empirically — ran clippy once with all of them enabled across `--workspace --all-targets` and bucketed every warning by lint. The low end of that ranking is the signal: lints the code already satisfies, which can be locked in at ~zero cost.
`clippy::all`, `pedantic`, and `nursery` are already fully enabled, so there was nothing to add from those. `restriction` is opt-in per-lint by design (never enabled as a group), so all additions come from there.
Enables **18** additional `restriction` lints — 15 had **zero** violations (they codify a convention the codebase already follows 100%), 3 needed only trivial fixes:
**Correctness / safety**
- `float_cmp_const` — closes the constant-comparison gap that `float_cmp` (pedantic) intentionally skips
- `lossy_float_literal` — no float literals that silently lose precision
- `fn_to_numeric_cast_any` — catches `fn as usize`, which the on-by-default truncating variants ignore
- `mixed_read_write_in_expression` — no order-of-evaluation hazards
- `precedence_bits` — require parens around ambiguous bit ops
- `suspicious_xor_used_as_pow` — catch `^` mistaken for exponentiation
- `assertions_on_result_states` — `unwrap_err()` over `assert!(x.is_err())`
- `unused_result_ok` — `let _ =` over `.ok()` to silently drop a `Result`
**Consistency / readability**
- `as_underscore`, `deref_by_slicing`, `empty_enum_variants_with_brackets`, `pathbuf_init_then_push`, `pub_without_shorthand`, `self_named_module_files` (locks in `mod.rs` layout), `string_lit_chars_any`, `unnecessary_safety_doc`, `unnecessary_self_imports`
**Bloat guard**
- `large_include_file` — flag oversized `include_bytes!`/`include_str!` (relevant to the native `.node` size)
## Fixes for the enable+fix lints
- `resolve_utils.rs`: `use a::b::{self}` → `use a::b`
- `diagnostic.rs`: `write!(…).ok()` → `let _ = write!(…)`
- `string_wizard/tests/magic_string.rs`: `assert!(x.is_err())` → `x.unwrap_err()` (×3)
## Deliberately not enabled
- Anti-patterns `restriction` is not meant to blanket-enable (`implicit_return`, `missing_trait_methods`, `question_mark_used`, `min_ident_chars`, …).
- Lints conflicting with existing config or `avoid-breaking-exported-api = false` (`std_instead_of_core`, `absolute_paths`, `exhaustive_enums/structs`, …).
- Verified false positives: `mutex_atomic` (the `Mutex<usize>` in `defer_drop.rs` is paired with a `Condvar`), `verbose_file_reads` (read-modify-write on one handle), `empty_structs_with_brackets` (napi tuple-struct + intentional future-field placeholder).
- The `cargo` group (`cargo_common_metadata` wants metadata on 49 internal unpublished crates; `multiple_crate_versions` is transitive-dep noise).
## Possible follow-ups (real value, need dedicated work)
- `undocumented_unsafe_blocks` (37) + `multiple_unsafe_ops_per_block` (5) — safety-doc hygiene
- `missing_asserts_for_indexing` (5) — perf (elides bounds checks)
- `iter_over_hash_type` (123) — determinism guard
`cargo clippy --workspace --all-targets -- --deny warnings` passes.
graphite-app
Bot
force-pushed
the
chore/enable-more-clippy-lints
branch
from
July 3, 2026 08:52
1dfcba9 to
dd80936
Compare
Merged
shulaoda
added a commit
that referenced
this pull request
Jul 8, 2026
## [1.1.5] - 2026-07-08 ### 🚀 Features - detect top-level import-binding reads as execution-order sensitive (#10180) by @hyf0 - sourcemap_filenames: add a sourcemapFileNames option (#9271) by @V1OL3TF0X - binding: record plugin hook result kind in tracing spans (#10154) by @IWANABETHATGUY - linking: skip side-effect-free modules in per-entry reachability (#10111) by @IWANABETHATGUY - improve error message for unresolved virtual imports (#10156) by @sapphi-red - add descriptive metadata to plugin API (#10106) by @sapphi-red - add `--configLoader=native` option (#10118) by @sapphi-red ### 🐛 Bug Fixes - improve invalid annotation warnings (#10185) by @hyf0 - keep deduplicated asset filenames stable once they can be observed (#10191) by @shulaoda - sourcemap_filenames: use public option name in pattern errors (#10188) by @IWANABETHATGUY - sourcemap_filenames: hash prepared sourcemap content (#10178) by @hyf0 - tree-shake unused circular declarators exported via export list (#10166) by @IWANABETHATGUY - dev: don't panic when an HMR rebuild hits an unresolved import (#10162) by @shulaoda - propagate errors from output.globals function (#9880) by @shulaoda - dev: revert cache mutations when a partial scan fails (#10110) by @shulaoda - dev: update importer relationships of cached modules in incremental build (#10107) by @shulaoda - hmr: fall back to full reload when a changed module is not registered as executed (#10132) by @shulaoda - chunk-optimizer: follow entry facade edges in runtime placement cycle check (#10101) by @hyf0 - dev: ignore watcher events after close (#10113) by @hyf0 - emit async wrapper for TLA modules under onDemandWrapping (#10086) by @IWANABETHATGUY - gate sideEffects:false modules' side effects on body demand (#10080) by @IWANABETHATGUY - rolldown_plugin_vite_resolve: return empty object for `browser: false` mapped modules (#10082) by @sapphi-red - reset the word-boundary state on newline in Hires::Boundary sourcemaps (#10025) by @shulaoda - trim an emptied chunk's outro/intro instead of skipping past it (#10029) by @shulaoda - test each edited chunk's own start against indent exclude ranges (#10026) by @shulaoda - preserve sourcemap mappings for indented lines when a CJS module shares the chunk (#10074) by @hyf0 ### 🚜 Refactor - separate tree-shaking side effects from execution order sensitivity (#10168) by @hyf0 - type construct_vite_preload_call to take an ObjectPattern (#10135) by @shulaoda - treeshake: single-source the own-export classification shared with the lazy-barrel loader (#10098) by @IWANABETHATGUY - dev: reuse Vite's bundledDev server (#10081) by @h-a-n-a - clippy: ban std HashMap/HashSet in favour of FxHashMap/FxHashSet (#10108) by @Boshen - treeshake: make body demand a second module bit instead of a stmt multimap (#10097) by @IWANABETHATGUY - seal used_symbol_refs by construction after its last writer (#10091) by @hyf0 - treeshake: replace inclusion mutual recursion with a worklist engine (#10096) by @IWANABETHATGUY - treeshake: split include_statements.rs into focused modules (#10095) by @IWANABETHATGUY - drop redundant is_user_defined filter on partitioned entries (#10050) by @shulaoda - project the retained export interface out of used_symbol_refs (#10089) by @hyf0 - track used external symbols separately from used_symbol_refs (#10088) by @hyf0 - make module namespace inclusion an explicit linking metadata field (#10087) by @hyf0 - rename statement evaluation metadata (#10078) by @hyf0 ### 📚 Documentation - virtual modules user-facing id convention (#10155) by @sapphi-red - cli: clarify disabling boolean/object flags like codeSplitting (#10153) by @IWANABETHATGUY - chore: remove Vite+ alpha banner (#10105) by @mdong1909 - write down the used_symbol_refs contract (#10090) by @hyf0 - dev/lazy: update design and implementation (#10079) by @h-a-n-a ### ⚡ Performance - ast_scanner: stop order-sensitivity checks once a module is flagged (#10190) by @IWANABETHATGUY - return impl ExactSizeIterator from slice-backed accessors (#10133) by @Boshen - binding: box dev and watcher napi futures (#10103) by @Boshen ### 🧪 Testing - move string_wizard replace unit tests to the JS magic-string suite (#10176) by @IWANABETHATGUY - dev: assert incremental scan state matches a fresh full build after each HMR step (#10115) by @shulaoda - dev: restore runtime assertions of delete_file_not_used_anymore (#10112) by @shulaoda - dev: fix flaky dev server tests in CI (#10152) by @h-a-n-a - add regression test for #10099 (lazyBarrel drops default-import binding but keeps its property reads) (#10109) by @IWANABETHATGUY ### ⚙️ Miscellaneous Tasks - deploy website to Void via GitHub OIDC (#10192) by @Boshen - deps: update oxc to 0.139.0 (#10161) by @shulaoda - deps: update test262 submodule for tests (#10160) by @rolldown-guard[bot] - rolldown_plugin_utils: remove dead asset-url and css scaffolding (#10131) by @shulaoda - deps: revert vite-plus to v0.2.1 (#10148) by @shulaoda - deps: update github actions (#10141) by @renovate[bot] - deps: update dependency rust to v1.96.1 (#10145) by @renovate[bot] - deps: update npm packages (#10142) by @renovate[bot] - deps: update rust crates (#10143) by @renovate[bot] - deps: update napi to v3.10.3 (#10121) by @renovate[bot] - rolldown_utils: remove unused time module (#10138) by @shulaoda - remove dead CopyModulePlugin::is_active method (#10129) by @shulaoda - remove dead LazyCompilationContext::is_lazy_module method (#10128) by @shulaoda - remove dead BuildDiagnostic::downcast_ref method (#10127) by @shulaoda - deps: update dependency vite-plus to v0.2.2 (#10084) by @renovate[bot] - deps: update rust crate oxc_sourcemap to v8.1.0 (#10122) by @renovate[bot] - deps: update crate-ci/typos action to v1.48.0 (#10124) by @renovate[bot] - enable more clippy restriction lints (#10114) by @Boshen - deps: update rust dependencies (#10100) by @Boshen - deps: update oxc resolver to v11.23.0 (#10083) by @renovate[bot] ###◀️ Revert - Revert "chore(deps): revert vite-plus to v0.2.1" (#10157) by @h-a-n-a - "fix(hmr): fall back to full reload when a changed module is not registered as executed (#10132)" (#10151) by @shulaoda ### ❤️ New Contributors * @V1OL3TF0X made their first contribution in [#9271](#9271) Co-authored-by: shulaoda <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Audited the entire clippy
restrictiongroup (~130 lints) plus thecargogroup empirically — ran clippy once with all of them enabled across--workspace --all-targetsand bucketed every warning by lint. The low end of that ranking is the signal: lints the code already satisfies, which can be locked in at ~zero cost.clippy::all,pedantic, andnurseryare already fully enabled, so there was nothing to add from those.restrictionis opt-in per-lint by design (never enabled as a group), so all additions come from there.Enables 18 additional
restrictionlints — 15 had zero violations (they codify a convention the codebase already follows 100%), 3 needed only trivial fixes:Correctness / safety
float_cmp_const— closes the constant-comparison gap thatfloat_cmp(pedantic) intentionally skipslossy_float_literal— no float literals that silently lose precisionfn_to_numeric_cast_any— catchesfn as usize, which the on-by-default truncating variants ignoremixed_read_write_in_expression— no order-of-evaluation hazardsprecedence_bits— require parens around ambiguous bit opssuspicious_xor_used_as_pow— catch^mistaken for exponentiationassertions_on_result_states—unwrap_err()overassert!(x.is_err())unused_result_ok—let _ =over.ok()to silently drop aResultConsistency / readability
as_underscore,deref_by_slicing,empty_enum_variants_with_brackets,pathbuf_init_then_push,pub_without_shorthand,self_named_module_files(locks inmod.rslayout),string_lit_chars_any,unnecessary_safety_doc,unnecessary_self_importsBloat guard
large_include_file— flag oversizedinclude_bytes!/include_str!(relevant to the native.nodesize)Fixes for the enable+fix lints
resolve_utils.rs:use a::b::{self}→use a::bdiagnostic.rs:write!(…).ok()→let _ = write!(…)string_wizard/tests/magic_string.rs:assert!(x.is_err())→x.unwrap_err()(×3)Deliberately not enabled
restrictionis not meant to blanket-enable (implicit_return,missing_trait_methods,question_mark_used,min_ident_chars, …).avoid-breaking-exported-api = false(std_instead_of_core,absolute_paths,exhaustive_enums/structs, …).mutex_atomic(theMutex<usize>indefer_drop.rsis paired with aCondvar),verbose_file_reads(read-modify-write on one handle),empty_structs_with_brackets(napi tuple-struct + intentional future-field placeholder).cargogroup (cargo_common_metadatawants metadata on 49 internal unpublished crates;multiple_crate_versionsis transitive-dep noise).Possible follow-ups (real value, need dedicated work)
undocumented_unsafe_blocks(37) +multiple_unsafe_ops_per_block(5) — safety-doc hygienemissing_asserts_for_indexing(5) — perf (elides bounds checks)iter_over_hash_type(123) — determinism guardcargo clippy --workspace --all-targets -- --deny warningspasses.