aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/linters/no_std_collections_maps.rb
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-11 19:45:17 +0900
committernsfisis <nsfisis@gmail.com>2026-05-11 19:45:17 +0900
commit24cc697a9cd0dcac854359d65b8265f02f483b72 (patch)
treec9693dbf3136d840157609161a3a5695828e853b /scripts/linters/no_std_collections_maps.rb
parent2aceeb116150b6d6e6d3f371c2af509902ceafea (diff)
downloadphp-mozart-24cc697a9cd0dcac854359d65b8265f02f483b72.tar.gz
php-mozart-24cc697a9cd0dcac854359d65b8265f02f483b72.tar.zst
php-mozart-24cc697a9cd0dcac854359d65b8265f02f483b72.zip
chore(lint): add Ruby linter scripts and apply rules
Adds scripts/lint with linters for mod.rs naming, contiguous use blocks, use-as aliasing, sorted Cargo dependencies, std::collections maps, and workspace dependency requirements. Renames mod.rs files, reorders use statements, drops unnecessary import aliases, and sorts Cargo.toml entries to satisfy the new rules.
Diffstat (limited to 'scripts/linters/no_std_collections_maps.rb')
-rw-r--r--scripts/linters/no_std_collections_maps.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/scripts/linters/no_std_collections_maps.rb b/scripts/linters/no_std_collections_maps.rb
new file mode 100644
index 0000000..b80ef07
--- /dev/null
+++ b/scripts/linters/no_std_collections_maps.rb
@@ -0,0 +1,48 @@
+def no_std_collections_maps(root_dir)
+ pattern = root_dir.join('crates', '**', '*.rs').to_s
+ errors = Dir.glob(pattern).sort.flat_map do |path|
+ relative = Pathname.new(path).relative_path_from(root_dir).to_s
+ find_std_map_usages(path, relative)
+ end
+
+ return true if errors.empty?
+
+ puts 'Found uses of `std::collections::{HashMap, HashSet, BTreeMap, BTreeSet}`.'
+ puts 'Use `indexmap::IndexMap` / `indexmap::IndexSet` instead:'
+ errors.each do |err|
+ puts " #{err}"
+ end
+ false
+end
+
+BANNED_MAP_NAMES = %w[HashMap HashSet BTreeMap BTreeSet].freeze
+
+def find_std_map_usages(path, relative)
+ errors = []
+
+ File.readlines(path).each_with_index do |raw, idx|
+ code = raw.split('//', 2).first || raw
+
+ code.scan(/\bstd::collections::(HashMap|HashSet|BTreeMap|BTreeSet)\b/) do |m|
+ errors << "#{relative}:#{idx + 1}: use of `std::collections::#{m[0]}` (use `indexmap::#{indexmap_replacement(m[0])}` instead)"
+ end
+
+ code.scan(/\bstd::collections::\{([^}]*)\}/) do |m|
+ m[0].split(',').each do |entry|
+ name = entry.strip.split(/\s+as\s+/).first
+ next unless BANNED_MAP_NAMES.include?(name)
+
+ errors << "#{relative}:#{idx + 1}: import of `std::collections::#{name}` (use `indexmap::#{indexmap_replacement(name)}` instead)"
+ end
+ end
+ end
+
+ errors.uniq
+end
+
+def indexmap_replacement(name)
+ case name
+ when 'HashMap', 'BTreeMap' then 'IndexMap'
+ when 'HashSet', 'BTreeSet' then 'IndexSet'
+ end
+end