Linter

Ejecuta wippy lint para comprobar los tipos y analizar estáticamente las entradas Lua.

Uso

wippy lint                        # Check all Lua entries
wippy lint --level hint           # Show all diagnostics including hints
wippy lint --json                 # Output in JSON format
wippy lint --ns app               # Check only the app namespace
wippy lint --summary              # Group results by error code

Que se Verifica

El linter valida todos los tipos de entradas Lua:

  • function.lua - Funciones
  • library.lua - Bibliotecas
  • process.lua - Procesos
  • workflow.lua - Workflows

Las entradas de bytecode contienen bytecode compilado (fs/path/hash), no fuente, por lo que no pueden ser parseadas ni verificadas en tipos; el linter solo revisa entradas Lua con fuente (sus variantes .bc se omiten, aunque pueden seguir apareciendo en el conteo total de entradas).

Cada entrada es analizada, verificada en tipos y examinada en busca de problemas de correccion.

Niveles de Severidad

Los diagnosticos tienen tres niveles de severidad:

Nivel Descripcion
error Errores de tipo y problemas de correccion que deben corregirse
warning Posibles bugs o patrones problematicos
hint Sugerencias de estilo y notas informativas

Controla que niveles aparecen con --level:

wippy lint --level error          # Errors only
wippy lint --level warning        # Warnings and errors (default)
wippy lint --level hint           # Everything

Codigos de Error

Errores de Analisis

Codigo Descripcion
P0001 Error de sintaxis Lua - el codigo fuente no puede ser analizado

Errores de Verificacion de Tipos (serie E)

Los errores del verificador de tipos (E0001+) reportan problemas encontrados por el sistema de tipos: incompatibilidades de tipos, variables no definidas, operaciones invalidas y problemas de correccion similares. Siempre se reportan como errores.

local x: number = "hello"         -- E: string not assignable to number

local function add(a: number, b: number): number
    return a + b
end

add("one", "two")                  -- E: string not assignable to number

Requires No Declarados

Un require("name") con literal de cadena cuyo modulo no esta ni en las declaraciones imports/modules de la entrada ni es un builtin ambiental falla con:

require("name") is not declared in _index.yaml imports or modules

Esta verificacion se ejecuta siempre (no esta condicionada por --rules) y se reporta como error. Declara el modulo para satisfacerla:

imports:
  json: wippy.stdlib:json    # alias -> registry id
modules:
  - funcs                    # bare module name

Los requires dinámicos (require(variable)) no se inspeccionan. El linter y el runtime comparten el conjunto de módulos ambientales, que incluye módulos disponibles sin declaración, como process en los tipos ejecutables.

Advertencias de Reglas de Lint (Serie W)

Las reglas de lint proporcionan verificaciones de estilo y calidad. Activalas con --rules:

wippy lint --rules
Codigo Regla Descripcion
W0001 no-empty-blocks Bloques de sentencias vacios
W0002 no-global-assign Asignacion a variables globales
W0003 no-self-compare Comparacion de un valor consigo mismo
W0004 no-unused-vars Variables locales sin usar
W0005 no-unused-params Parametros de funcion sin usar
W0006 no-unused-imports Importaciones sin usar
W0007 no-shadowed-vars Variable oculta el ambito externo

Sin --rules, solo se realiza la verificacion de tipos (codigos P y E).

Filtrado

Por Namespace

Verifica namespaces especificos usando --ns:

wippy lint --ns app               # Exact namespace match
wippy lint --ns "app.*"           # All under app
wippy lint --ns app --ns lib      # Multiple namespaces

Las dependencias de las entradas seleccionadas se cargan para la verificacion de tipos pero sus diagnosticos no se reportan.

Por Codigo de Error

Filtra diagnosticos por codigo:

wippy lint --code E0001
wippy lint --code E0001 --code E0004

Por Cantidad

Limita la cantidad de diagnosticos mostrados:

wippy lint --limit 10             # Show first 10 issues

Formatos de Salida

Formato Tabla (Por Defecto)

Cada diagnostico se muestra con contexto del codigo fuente, ubicacion del archivo y el mensaje de error. Los resultados se ordenan por entrada, severidad y numero de linea.

Una linea de resumen muestra los totales:

Checked 42 entries: 5 errors, 12 warnings

Formato Resumen

Agrupa diagnosticos por namespace y codigo de error:

wippy lint --summary
By namespace:

  app                              15 issues (5 errors, 10 warnings)
  lib                               2 issues (2 warnings)

By error code:

  E0001      [error  ]    5 occurrences
  E0004      [error  ]    3 occurrences

Checked 42 entries: 5 errors, 12 warnings

Formato JSON

Salida legible por maquinas para integracion CI/CD:

wippy lint --json
{
  "diagnostics": [
    {
      "entry_id": "app:handler",
      "code": "E0001",
      "severity": "error",
      "message": "string not assignable to number",
      "line": 10,
      "column": 5
    }
  ],
  "total_entries": 42,
  "error_count": 5,
  "warning_count": 12,
  "hint_count": 0
}

Cache

El linter almacena resultados en cache para acelerar ejecuciones repetidas. Las claves de cache se basan en el hash del codigo fuente, nombre del metodo, dependencias y configuracion del sistema de tipos.

Limpia el cache si los resultados parecen desactualizados:

wippy lint --cache-reset

Integración CI/CD

En los modos tabla y resumen, el comando termina con un código distinto de cero cuando el resultado filtrado contiene errores. Las advertencias y sugerencias no afectan al código de salida, incluso cuando --level warning o --level hint las muestran.

El modo JSON es diferente: después de codificar correctamente el resultado, wippy lint --json termina con código 0 aunque error_count no sea cero. Un trabajo de CI que use JSON debe analizar por sí mismo error_count. Para usar el estado de salida del comando como puerta, ejecuta una invocación sin JSON:

wippy lint --level error

Puedes generar un informe por separado sin tratar su código de salida como resultado del lint:

wippy lint --json --level error > lint-results.json

Ejemplo de paso en GitHub Actions:

- name: Lint
  run: wippy lint --level warning

Referencia de Flags

Flag Corto Por Defecto Descripcion
--level warning Nivel minimo de severidad (error, warning, hint)
--json false Salida en formato JSON
--ns Filtrar por patrones de namespace
--code Filtrar por codigos de error
--limit 0 Maximo de diagnosticos a mostrar (0 = ilimitado)
--summary false Agrupar por codigo de error
--no-color false Desactivar salida con colores
--rules false Activar reglas de lint (verificaciones de estilo/calidad serie W)
--cache-reset false Limpiar cache antes del analisis
--profile Aplicar un perfil del workspace desde la configuración combinada del runtime; se puede repetir para aplicar perfiles en orden
--set Sobrescribir un valor de configuración combinada como section.path=value; se puede repetir para varias sobrescrituras
--lock-file -l wippy.lock Ruta al archivo de bloqueo
--profile Aplicar un perfil de workspace desde la configuracion de runtime combinada (repetible, aplicado en orden)
--set Sobrescribir un valor de la configuracion de runtime combinada (section.path=value, repetible)

Ver Tambien

  • CLI - Referencia completa del CLI
  • Tipos - Documentación del sistema de tipos
  • LSP - Integración con editores con diagnósticos en vivo