|
# Error Codes
|
|
|
|
## Error Code Reference
|
|
|
|
Error codes follow a prefixed numbering scheme. The prefix encodes the category and severity.
|
|
|
|
### General Errors (E0xxx)
|
|
|
|
| Code | Constant | Description | Triggered By |
|
|
|------|----------|-------------|-------------|
|
|
| `E0001` | `ErrUnexpectedToken` | Unexpected or unrecognizable character | Tokenizer encounter of non-ASCII, non-operator char |
|
|
| `E0002` | `ErrUnclosedString` | Unclosed string literal | Missing closing quote at EOF |
|
|
| `E0003` | `ErrUnclosedComment` | Unclosed block comment | Missing `*/`, `]#`, `#}` etc. at EOF |
|
|
| `E0004` | `ErrUnclosedBlock` | Unclosed block/control structure | Language-specific: unclosed `if`/`for`/`class`/etc. |
|
|
| `E0005` | `ErrMismatchedBracket` | Mismatched or unexpected closing bracket | `)` without `(`, `</div>` without `<div>` |
|
|
| `E0006` | `ErrUnclosedBracket` | Unclosed bracket at EOF | `validateBrackets()` finds remaining items on bracket stack |
|
|
| `E0007` | `ErrInvalidSyntax` | General invalid syntax | JSON parse error, TOML missing `=`, YAML empty key |
|
|
| `E0008` | `ErrUnexpectedEOF` | Unexpected end of file | Reserved for incomplete constructs not covered by other codes |
|
|
| `E0009` | `ErrEmptySource` | Source is empty (zero-length string) | `validate()` with `source.len == 0` |
|
|
| `E0010` | `ErrEncodingError` | Encoding error | Reserved for non-UTF-8 input |
|
|
| `E0011` | -- | File not found | `validateFile()` with non-existent path |
|
|
|
|
### Language-Specific Errors (E1xxx)
|
|
|
|
| Code | Constant | Description | Languages |
|
|
|------|----------|-------------|-----------|
|
|
| `E1001` | `ErrUnexpectedIndent` | Unexpected or inconsistent indentation | Python |
|
|
| `E1002` | `ErrMissingIndent` | Missing indentation after block opener | Python |
|
|
| `E1003` | `ErrDuplicateParam` | Duplicate parameter name | (reserved) |
|
|
| `E1004` | `ErrUndefinedVariable` | Reference to undefined variable | (reserved) |
|
|
| `E1005` | `ErrTypeMismatch` | Type mismatch | (reserved) |
|
|
| `E1006` | `ErrInvalidAssignment` | Invalid assignment target | (reserved) |
|
|
| `E1007` | `ErrMissingReturn` | Function missing return statement | (reserved) |
|
|
| `E1008` | `ErrInvalidDecorator` | Invalid decorator usage | Python |
|
|
| `E1009` | `ErrInvalidImport` | Invalid import statement | (reserved) |
|
|
|
|
### Template Errors (E2xxx)
|
|
|
|
| Code | Constant | Description | Languages |
|
|
|------|----------|-------------|-----------|
|
|
| `E2001` | `ErrUnclosedTemplateTag` | Unclosed template expression/block tag | Jinja |
|
|
| `E2002` | `ErrUnclosedBlockTag` | Unclosed block tag with no matching end tag | Jinja |
|
|
| `E2003` | `ErrInvalidFilter` | Invalid filter in template expression | Jinja |
|
|
|
|
### Info Codes (I0xxx)
|
|
|
|
| Code | Constant | Description |
|
|
|------|----------|-------------|
|
|
| `I0001` | `InfoLongLine` | Line exceeds recommended length |
|
|
| `I0002` | `InfoTrailingWhitespace` | Trailing whitespace detected |
|
|
|
|
### Warning Codes (W0xxx / W1xxx)
|
|
|
|
| Code | Constant | Description |
|
|
|------|----------|-------------|
|
|
| `W0001` | `WarnUnusedVariable` | Variable declared but never used |
|
|
| `W0002` | `WarnInconsistentNaming` | Naming convention inconsistency |
|
|
| `W0003` | `WarnMissingDoc` | Public symbol missing documentation |
|
|
| `W1001` | -- | Tab characters in YAML indentation |
|
|
|
|
### Internal Error
|
|
|
|
| Code | Description | Triggered By |
|
|
|------|-------------|-------------|
|
|
| `E9999` | Internal framework error (never-crash fallback) | Any unhandled `Exception` in `validate()` or `validateSource()` |
|
|
|
|
---
|
|
|
|
## IO Table: Supported Languages and Per-Language Errors
|
|
|
|
### Input/Output Contract
|
|
|
|
Every validation function follows the same contract:
|
|
|
|
| Input | Output |
|
|
|-------|--------|
|
|
| `source: string` (required) | `ValidationResult` with `valid: bool` |
|
|
| `flavor: LanguageFlavor = lfUnknown` | `ValidationResult.errors: seq[ValidationError]` |
|
|
| `options: ValidationOptions` (optional) | `ValidationResult.moduleInfo: ModuleInfo` |
|
|
| `sourcePath: string = ""` (optional) | `ValidationResult.durationMs: float` |
|
|
|
|
**Guarantees**:
|
|
- Never throws - all exceptions are caught and returned as `E9999` errors
|
|
- Empty source returns `E0009` (or `valid: true` for YAML/TOML where empty is valid)
|
|
- File not found returns `E0011`
|
|
- Unknown flavor with no detection possible returns an `E0007` error
|
|
- Every error has a `code`, `message`, `severity`, `position`, and optional `hint`
|
|
|
|
### Per-Language Tokenizer, Validator, and Error Table
|
|
|
|
#### Nim (`.nim`, `.nims`, `.nimble`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `nim_tokenizer.nim` - `NimTokenizer` |
|
|
| Validator | `nim_validator.nim` - `NimValidator` |
|
|
| Keywords | 80+ (addr, and, as, block, break, case, const, converter, defer, discard, elif, else, enum, except, export, finally, for, from, func, if, import, in, include, iterator, let, macro, method, mixin, mod, nil, not, object, of, or, proc, ptr, raise, ref, return, template, try, tuple, type, using, var, when, while, with, yield, etc.) |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0001` | Unexpected character (non-ASCII, unrecognizable) | `esWarning` | Shows hex `U+XXXX` value |
|
|
| `E0002` | Unclosed string (`"..."` at EOF) | `esError` | "Add a closing quote" |
|
|
| `E0002` | Unclosed multi-line string (`"""` at EOF) | `esError` | -- |
|
|
| `E0002` | Newline inside string literal | `esError` | -- |
|
|
| `E0002` | Unclosed raw string (`r"..."` at EOF) | `esError` | -- |
|
|
| `E0002` | Unclosed character literal (`'x` at EOF) | `esError` | -- |
|
|
| `E0003` | Unclosed block comment (`#[` without `]#`) | `esError` | "Add closing `]#`" |
|
|
| `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | "Add matching closing bracket" |
|
|
|
|
Structural extraction: imports (`from X import Y`), functions (`proc`, `func`, `method`, `template`, `macro`, `iterator`, `converter`), types (`type Foo`).
|
|
|
|
#### Bash / Shell (`.sh`, `.bash`, `.zsh`, `.fish`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `bash_tokenizer.nim` - `BashTokenizer` |
|
|
| Validator | `bash_validator.nim` - `BashValidator` |
|
|
| Keywords | 38+ (if, then, else, elif, fi, case, esac, for, while, until, do, done, in, function, select, time, return, break, continue, exit, declare, local, export, readonly, unset, eval, exec, let, source, shift, trap, type, typeset, ulimit, umask, alias, read, echo) |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0002` | Unclosed single-quoted string | `esError` | -- |
|
|
| `E0002` | Unclosed double-quoted string | `esError` | -- |
|
|
| `E0004` | Unclosed `${var}` expansion | `esError` | -- |
|
|
| `E0004` | Unclosed `$()` command substitution | `esError` | -- |
|
|
| `E0004` | Unclosed `if` block (`if` without matching `fi`) | `esError` | "Add missing 'fi'" |
|
|
| `E0004` | Unclosed loop (`for`/`while`/`until` without `done`) | `esError` | "Add missing 'done'" |
|
|
| `E0004` | Unclosed `case` block (`case` without `esac`) | `esError` | "Add missing 'esac'" |
|
|
| `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | -- |
|
|
|
|
Special features: shebang detection (`#!`), heredoc detection (`<<EOF`), variable expansion (`$var`, `${var}`), backtick command substitution, arithmetic expansion (`(( ))`).
|
|
|
|
#### Python (`.py`, `.pyw`, `.pyx`, `.pxd`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `python_tokenizer.nim` - `PythonTokenizer` |
|
|
| Validator | `python_validator.nim` - `PythonValidator` |
|
|
| Keywords | 33 (False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield) |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0002` | Unclosed string (`"..."` or `'...'` at EOF) | `esError` | -- |
|
|
| `E0002` | Unclosed triple-quoted string (`"""` or `'''` at EOF) | `esError` | -- |
|
|
| `E0002` | Unclosed f-string (`f"..."` at EOF) | `esError` | -- |
|
|
| `E0002` | Newline inside string literal | `esError` | -- |
|
|
| `E1001` | Indentation mismatch at block boundary | `esError` | -- |
|
|
| `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | -- |
|
|
|
|
Special features: f-string interpolation with nested braces, indentation tracking (INDENT/DEDENT tokens), decorator detection (`@`), line continuation (`\`).
|
|
|
|
Structural extraction: imports (`import X`, `from X import Y`), functions (`def`), classes (`class`).
|
|
|
|
#### JavaScript / TypeScript (`.js`, `.mjs`, `.cjs`, `.ts`, `.tsx`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `javascript_tokenizer.nim` - `JavaScriptTokenizer` |
|
|
| Validator | `javascript_validator.nim` - `JavaScriptValidator` |
|
|
| Keywords | 60+ (async, await, break, case, catch, class, const, continue, debugger, default, delete, do, else, export, extends, false, finally, for, function, if, import, in, instanceof, let, new, null, of, return, super, switch, static, this, throw, true, try, typeof, var, void, while, with, yield + TypeScript: interface, type, declare, module, namespace, abstract, readonly, as, any, boolean, number, string, never, keyof, infer, unknown) |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0002` | Unclosed string (`"..."` or `'...'` at EOF) | `esError` | -- |
|
|
| `E0002` | Unclosed template literal (`` `...` `` at EOF) | `esError` | -- |
|
|
| `E0002` | Newline inside string literal | `esError` | -- |
|
|
| `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | -- |
|
|
|
|
Special features: template literals with `${}` interpolation nesting, regex literal detection, arrow function detection (`=>`), ESM import/export.
|
|
|
|
Structural extraction: imports/exports, functions (`function`, `async`), classes.
|
|
|
|
#### PHP (`.php`, `.phtml`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `php_tokenizer.nim` - `PHPTokenizer` |
|
|
| Validator | `php_validator.nim` - `PHPValidator` |
|
|
| Mode switching | Tracks `inPhpMode` flag - toggles on `<?php`/`<?` and `?>` |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0002` | Unclosed string | `esError` | -- |
|
|
| `E0006` | Unclosed bracket (`(`, `[`, `{` at EOF) | `esError` | -- |
|
|
|
|
Special features: PHP/HTML mode switching, `<?php`, `<?=`, `?>` detection, variable names (`$var`, `$obj->prop`).
|
|
|
|
Structural extraction: functions (`function`, `fn`), classes (`class`), imports/requires (`include`, `require`, `use`, `namespace`).
|
|
|
|
#### HTML / XML (`.html`, `.htm`, `.xhtml`, `.xml`, `.svg`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `html_tokenizer.nim` - `HTMLTokenizer` |
|
|
| Validator | `html_validator.nim` - `HTMLValidator` |
|
|
| Void elements | 14: area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0003` | Unclosed HTML comment (`<!--` without `-->`) | `esError` | -- |
|
|
| `E0004` | Unclosed HTML tag (e.g., `<div>` without `</div>`) | `esError` | "Add closing `</tagname>`" |
|
|
| `E0005` | Unexpected closing tag (mismatched nesting) | `esWarning` | "Check that tags are properly nested" |
|
|
|
|
Special features: tag stack balancing, void element awareness (no closing tag needed for self-closing elements), attribute parsing with quoted values, `<!DOCTYPE>`, `<?xml?>` directives.
|
|
|
|
#### Jinja2 (`.jinja`, `.jinja2`, `.j2`, `.html.j2`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Tokenizer | `jinja_tokenizer.nim` - `JinjaTokenizer` |
|
|
| Validator | `jinja_validator.nim` - `JinjaValidator` |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0003` | Unclosed Jinja comment (`{#` without `#}`) | `esError` | -- |
|
|
| `E2001` | Unclosed expression tag (`{{` without `}}`) | Implicit via tokenizer | -- |
|
|
| `E2001` | Unclosed block tag (`{%` without `%}`) | Implicit via tokenizer | -- |
|
|
| `E2002` | Unclosed `for` block (no matching `endfor`) | `esError` | "Add `{% endfor %}`" |
|
|
| `E2002` | Unclosed `if` block (no matching `endif`) | `esError` | "Add `{% endif %}`" |
|
|
| `E2002` | Unclosed `block` (no matching `endblock`) | `esError` | "Add `{% endblock %}`" |
|
|
| `E2002` | Unclosed `macro`, `filter`, `raw`, `autoescape`, `call`, `with` | `esError` | "Add matching `end{tag}`" |
|
|
|
|
Special features: tracks 12 block tag types (`for`, `if`, `block`, `macro`, `filter`, `raw`, `autoescape`, `call`, `with`), validates matching end tags, handles content between template syntax and plain text.
|
|
|
|
#### JSON (`.json`, `.jsonc`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Validator | `config_validators.nim` - `JSONValidator` |
|
|
| Method | Uses Nim's built-in `parseJson()` for full validation |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0007` | JSON parse error (any `JsonParsingError`) | `esError` | Error message from parser |
|
|
| `E0007` | Any other exception during parse | `esError` | "JSON error: {message}" |
|
|
| `E0009` | Empty JSON source | `esError` | -- |
|
|
|
|
#### YAML (`.yaml`, `.yml`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Validator | `config_validators.nim` - `YAMLValidator` |
|
|
| Method | Line-by-line structural analysis |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0007` | Empty mapping key (no key before `:`) | `esError` | -- |
|
|
| `E0007` | General YAML structural error | `esError` | -- |
|
|
| `E0009` | No content after stripping comments/blanks | `esError` | -- |
|
|
| `W1001` | Tab characters used for indentation | `esWarning` | "Use spaces for YAML indentation" |
|
|
|
|
Note: Empty YAML (only whitespace/comments) is `valid: true`.
|
|
|
|
#### TOML (`.toml`)
|
|
|
|
| Aspect | Details |
|
|
|--------|---------|
|
|
| Validator | `config_validators.nim` - `TOMLValidator` |
|
|
| Method | Line-by-line structural analysis |
|
|
|
|
| Error Code | Condition | Severity | Hint |
|
|
|------------|-----------|----------|------|
|
|
| `E0007` | Missing `=` in key-value pair | `esError` | "TOML uses `key = value` format" |
|
|
| `E0007` | Missing key before `=` | `esError` | -- |
|
|
| `E0007` | General TOML structural error | `esError` | -- |
|
|
| `E0009` | No content after stripping comments/blanks | `esError` | -- |
|
|
|