()
| 207 | |
| 208 | |
| 209 | def main(): |
| 210 | import argparse |
| 211 | |
| 212 | parser = argparse.ArgumentParser( |
| 213 | description="Find and fix files using FL_HAS_INCLUDE without including fl/stl/has_include.h" |
| 214 | ) |
| 215 | parser.add_argument( |
| 216 | "--fix", |
| 217 | action="store_true", |
| 218 | help="Automatically add missing includes (default: dry-run mode)", |
| 219 | ) |
| 220 | parser.add_argument( |
| 221 | "--macro", |
| 222 | default="FL_HAS_INCLUDE", |
| 223 | help="Macro to search for (default: FL_HAS_INCLUDE)", |
| 224 | ) |
| 225 | parser.add_argument( |
| 226 | "--include", |
| 227 | default="fl/stl/has_include.h", |
| 228 | help="Include path to check/add (default: fl/stl/has_include.h)", |
| 229 | ) |
| 230 | |
| 231 | args = parser.parse_args() |
| 232 | |
| 233 | print(f"🔍 Searching for files using {args.macro}...") |
| 234 | files_with_macro = find_files_using_macro(args.macro) |
| 235 | print(f" Found {len(files_with_macro)} files using {args.macro}") |
| 236 | |
| 237 | print(f"\n🔍 Checking which files include {args.include}...") |
| 238 | files_with_include = { |
| 239 | f for f in files_with_macro if check_has_include(f, args.include) |
| 240 | } |
| 241 | print(f" {len(files_with_include)} files already include {args.include}") |
| 242 | |
| 243 | print(f"\n📊 Finding files missing the include...") |
| 244 | files_missing_include = files_with_macro - files_with_include |
| 245 | |
| 246 | if not files_missing_include: |
| 247 | print(f" ✅ All files using {args.macro} include {args.include}!") |
| 248 | return 0 |
| 249 | |
| 250 | print(f" ⚠️ {len(files_missing_include)} files are missing the include:\n") |
| 251 | |
| 252 | for file_path in sorted(files_missing_include): |
| 253 | relative = file_path.relative_to(PROJECT_ROOT) |
| 254 | print(f" • {relative}") |
| 255 | |
| 256 | if args.fix: |
| 257 | print(f"\n🔧 Adding missing includes...") |
| 258 | fixed_count = 0 |
| 259 | for file_path in sorted(files_missing_include): |
| 260 | relative = file_path.relative_to(PROJECT_ROOT) |
| 261 | print(f"\n {relative}:") |
| 262 | if add_include(file_path, args.include, dry_run=False): |
| 263 | fixed_count += 1 |
| 264 | |
| 265 | print(f"\n✅ Fixed {fixed_count}/{len(files_missing_include)} files") |
| 266 | return 0 |
no test coverage detected