Sistema de Errores e Internos de Diagnóstico
Archivo: src/error.rs
Forja implementa un motor de diagnóstico educativo diseñado para asistir activamente al estudiante o desarrollador. En lugar de limitarse a abortar la compilación con mensajes crípticos, localiza con precisión el origen y ofrece soluciones directas en español.
💡 Filosofía Educativa: Los errores son clasificados bajo nombres tradicionales o educativos (como "Ortografía" para errores léxicos, o "Gramática" para errores sintácticos) para suavizar la curva de aprendizaje de compiladores.
Módulo color
Proporciona formateo de salida ANSI para la terminal, facilitando la legibilidad de los reportes coloreados.
rojo,verde,amarillo,azul,magenta,cyan,gris,negrita: Funciones auxiliares que envuelven un string con los códigos ANSI de escape correspondientes y añaden el reset al final.- ¿Por qué?: Para no repetir secuencias de escape ANSI por todo el compilador y garantizar que la terminal se limpie automáticamente.
- ¿Cómo?: Concatena el string de entrada entre la constante del color y la constante de reseteo (
RESET = "\x1b[0m"). - ¿Para qué?: Colorear secciones clave del error en la salida CLI estándar.
Enumeración ErrorTipo
Representa las categorías fundamentales de errores en el ciclo de vida del compilador:
| Variante | Categoría Educativa | Fase de Origen | Propósito |
|---|---|---|---|
ErrorLexico | Ortografía | Lexer | Caracteres extraños, cadenas o comentarios sin cerrar. |
ErrorSintactico | Gramática | Parser | Incumplimiento de la gramática formal del lenguaje. |
ErrorDePropiedad | Pertenencia | Borrow Checker | Violación de reglas de ciclo de vida u ownership. |
ErrorDeTipo | Tipos de datos | Type Checker | Incompatibilidad semántica de tipos en asignaciones o llamadas. |
ErrorSemantico | Significado | Semántica | Variables no declaradas, ámbitos rotos o variables duplicadas. |
ErrorInterno | Interno | Cualquiera | Fallas no recuperables de la VM, IO o bugs del compilador. |
Estructura principal ErrorForja
Definición de ErrorForja
pub struct ErrorForja {
pub tipo: ErrorTipo,
pub linea: usize,
pub columna: usize,
pub mensaje: String,
pub sugerencia: String,
} Desglose de Funciones de ErrorForja
pub fn new(tipo: ErrorTipo, linea: usize, columna: usize, mensaje: &str, sugerencia: &str) -> Self
- ¿Por qué?: Constructor simplificado para instanciar estructuras de error uniformes en cualquier parte del pipeline.
- ¿Cómo?: Convierte las referencias de string en
Stringcon asignación en heap y devuelve el objetoErrorForja. - ¿Para qué?: Usado por el Lexer, Parser y Type Checker para instanciar y lanzar errores.
pub fn mostrar_con_contexto(&self, source: &str) -> String
- ¿Por qué?: Facilita la comprensión visual del error mostrando la línea exacta del código fuente que falló, junto con la línea anterior y posterior para dar contexto al usuario.
- ¿Cómo?:
- Divide el código fuente en líneas usando
source.lines(). - Identifica el índice correspondiente restando 1 a
self.linea. - Si existe una línea anterior, la agrega con formato
[NroLínea] │ [Texto]. - Agrega la línea del error apuntando con un cursor
↑ [Mensaje]desplazado espacialmente según la columna. - Si existe una línea posterior, la concatena para completar el bloque visual.
- Añade el emoji representativo y la sugerencia de corrección formateada al pie del error.
- Divide el código fuente en líneas usando
- ¿Para qué?: Generar el reporte contextualizado que se imprime en consola al fallar la compilación o transpilación en la terminal.
pub fn to_json(&self) -> String
- ¿Por qué?: Permite integraciones sencillas con extensiones de editores (como VS Code) u otros servicios web sin añadir dependencias pesadas de serialización.
- ¿Cómo?: Formatea manualmente un string crudo interpolando las propiedades del error. Llama internamente a
escape_jsonpara asegurar la validez sintáctica del JSON final. - ¿Para qué?: Formatear la salida de errores en JSON cuando se ejecuta con la bandera
--json-errors.
fn escape_json(&self, s: &str) -> String
- ¿Por qué?: Para prevenir inyecciones JSON accidentales o de sintaxis cuando el mensaje de error contiene caracteres de control o comillas dobles.
- ¿Cómo?: Recorre cada carácter del string de entrada en un loop. Si encuentra caracteres especiales (
\,", salto de línea, retorno de carro, tabulación), los reemplaza por su secuencia de escape JSON correspondiente. Los caracteres de control no estándar se convierten a secuencias unicode hexadecimales. - ¿Para qué?: Garantizar la robustez sintáctica de la cadena producida por
to_json().
Funciones del Módulo Asociadas
pub fn emoji_para(tipo: &ErrorTipo) -> &'static str
- ¿Por qué?: Brinda un identificador visual rápido para que el usuario asocie la naturaleza del error de inmediato.
- ¿Cómo?: Mapea cada variante de
ErrorTipoa un emoji representativo (por ejemplo, 🏷️ para errores de propiedad/ownership o 🧠 para semántica). - ¿Para qué?: Proporcionar el emoji impreso al renderizar el error.
pub fn categoria_educativa(tipo: &ErrorTipo) -> &'static str
- ¿Por qué?: Traducir jerga técnica de compiladores a términos comunes de lectoescritura.
- ¿Cómo?: Usa un match para mapear
ErrorLexicoa "Ortografía",ErrorSintacticoa "Gramática",ErrorDePropiedada "Pertenencia", etc. - ¿Para qué?: Encabezado del reporte impreso en terminal o consumido en los diagnósticos del IDE.