--- description: Ejecuta clang-tidy en archivos C++ y analiza los resultados --- # Lint clang-tidy Command Ejecuta análisis estático con clang-tidy en archivos C++ específicos, analiza los resultados inteligentemente, e identifica issues reales vs falsos positivos. ## Propósito clang-tidy detecta: - Oportunidades de modernización C++ (auto, range-for, etc.) - Problemas de legibilidad del código - Potenciales bugs y memory leaks - Optimizaciones de performance - Violaciones de mejores prácticas ## Workflow de Ejecución 1. **Solicitar archivos al usuario** (si no se especifican) - Pedir rutas de archivos `.cpp` o `.hpp` a analizar - Validar que los archivos existen 2. **Verificar build directory** - Confirmar que `build/compile_commands.json` existe - Si no existe, informar al usuario que debe compilar primero 3. **Ejecutar clang-tidy (sin --fix)** ```bash tools/linter/run_clang-tidy.sh archivo1.cpp archivo2.hpp ``` 4. **Capturar y analizar salida** - Parsear mensajes de error/warning - Clasificar por categoría (modernize, readability, performance, bugprone, etc.) - Identificar falsos positivos conocidos 5. **Presentar resumen al usuario** - Agrupar por tipo de issue - Separar "Críticos" vs "Recomendaciones" vs "Falsos Positivos" - Mostrar líneas de código afectadas con contexto 6. **Ofrecer acciones** - Preguntar si aplicar `--fix` automáticamente - Si el usuario acepta, ejecutar con `--fix` y recompilar ## Falsos Positivos Conocidos Ignorar o marcar como "Opcional" estos casos: ### `readability-magic-numbers` / `cppcoreguidelines-avoid-magic-numbers` - **Contexto:** Game constants (block sizes, velocities, timers) - **Ejemplo:** `const int BLOCK = 16;`, `player.vx = 3.0F;` - **Acción:** Marcar como "Opcional - Game constant" ### `modernize-use-trailing-return-type` - **Contexto:** Funciones con tipos de retorno simples - **Ejemplo:** `int getValue() { return x_; }` - **Acción:** Marcar como "Opcional - Style preference" ### Errores en `defaults.hpp` - **Contexto:** Archivos de constantes del juego - **Acción:** Ignorar completamente, mencionar al usuario que es conocido ### `readability-identifier-length` - **Contexto:** Variables cortas comunes en loops o coordenadas (`x`, `y`, `i`, `j`) - **Acción:** Marcar como "Opcional - Common convention" ## Categorización de Issues ### 🔴 Críticos (Requieren atención) - `bugprone-*`: Potenciales bugs - `cert-*`: Security issues - Memory leaks y null pointer dereferences - Undefined behavior ### 🟡 Recomendados (Mejoran calidad) - `modernize-*`: C++20 modernization - `performance-*`: Optimizaciones - `readability-*`: Mejoras de legibilidad (excepto magic-numbers) ### ⚪ Opcionales (A criterio) - `readability-magic-numbers` en game constants - `modernize-use-trailing-return-type` - `readability-identifier-length` para `x`, `y`, `i`, `j` ### ⚫ Ignorar (Falsos positivos) - Errores en `defaults.hpp` - Issues en carpeta `external/` - Warnings en headers del sistema ## Formato de Reporte al Usuario ``` === clang-tidy Analysis Results === 📁 Archivos analizados: - source/game/entities/player.cpp - source/game/entities/player.hpp 🔴 Críticos (2): player.cpp:145 [bugprone-use-after-move] - Uso de variable después de std::move() player.cpp:230 [cert-err58-cpp] - Excepción en inicialización estática 🟡 Recomendados (5): player.cpp:67 [modernize-use-auto] - Puede usar 'auto' en lugar de tipo explícito player.cpp:102 [performance-unnecessary-copy-initialization] - Copia innecesaria player.hpp:23 [readability-redundant-access-specifiers] - Especificador de acceso redundante ⚪ Opcionales (3): player.cpp:88 [readability-magic-numbers] - Magic number '16' (Game constant: BLOCK size) player.cpp:120 [modernize-use-trailing-return-type] - Style preference ✅ Total: 10 issues (2 críticos, 5 recomendados, 3 opcionales) --- 💡 Recomendaciones: 1. Corregir los 2 issues críticos manualmente 2. Aplicar --fix para 5 recomendaciones (revisa cambios antes de commitear) 3. Los opcionales son aceptables en código de juego ¿Deseas aplicar fixes automáticos para los issues recomendados? (y/n) ``` ## Aplicar Fixes Automáticos Si el usuario acepta: 1. **Ejecutar con --fix** ```bash tools/linter/run_clang-tidy.sh --fix archivo1.cpp archivo2.hpp ``` 2. **Informar cambios** - Listar archivos modificados - Recomendar revisión manual 3. **Recompilar** ```bash cmake --build build ``` 4. **Verificar compilación exitosa** - Si falla, informar errores - Sugerir revertir cambios si es necesario ## Notas Importantes - **Siempre analizar sin --fix primero** para revisar cambios propuestos - **Requiere build/compile_commands.json** - el usuario debe haber compilado antes - **Contexto importa** - Game code tiene patrones legítimos que linters marcan como issues - **No aplicar --fix ciegamente** - Algunos fixes pueden romper lógica del juego - **Archivos específicos** - Siempre analizar archivos concretos, no todo el proyecto ## Integración con Otros Comandos Este comando puede ser llamado desde: - `/refactor-class` - Después de refactorizar una clase - Manualmente por el usuario para análisis ad-hoc - Antes de commits importantes --- **Uso:** ``` /lint-clang-tidy (El comando preguntará qué archivos analizar) O especificar directamente: /lint-clang-tidy source/game/entities/player.cpp ```