|
# Architecture
|
|
|
|
Nimcheck uses a four-layer pipeline architecture. Each layer is independent and communicates through well-defined interfaces.
|
|
|
|
```
|
|
Source Code (string or file)
|
|
|
|
|
v
|
|
+-------------------+
|
|
| Detector | LanguageFlavor from extension, shebang, or content analysis
|
|
+-------------------+
|
|
|
|
|
v
|
|
+-------------------+
|
|
| Tokenizer | Converts raw source into a seq[Token] stream
|
|
+-------------------+
|
|
|
|
|
v
|
|
+-------------------+
|
|
| Validator | Analyzes token stream for syntax errors and structure
|
|
+-------------------+
|
|
|
|
|
v
|
|
+-------------------+
|
|
| Reporting | Formats errors as human-readable text or structured JSON
|
|
+-------------------+
|
|
|
|
|
v
|
|
ValidationResult
|
|
```
|
|
|
|
### Layer 1: Detector (`src/nimcheck/core/detector.nim`)
|
|
|
|
Language auto-detection with cascading priority:
|
|
|
|
| Priority | Method | Source | Confidence |
|
|
|----------|--------|--------|------------|
|
|
| 1 (highest) | Explicit | User-provided `LanguageFlavor` | 1.0 |
|
|
| 2 | File extension | 70+ extension-to-flavor mappings | 0.9 |
|
|
| 3 | Shebang line | `#!` line interpreter matching (bash, python, node, ruby, lua, swift) | 0.95 |
|
|
| 4 | Content analysis | Keyword scoring, structural patterns, bracket usage | 0.6-0.9 |
|
|
|
|
The `detectFlavor()` function returns a `(LanguageFlavor, FlavorDetectionMethod, confidence: float)` tuple.
|
|
|
|
### Layer 2: Tokenizer (`src/nimcheck/core/tokenizerbase.nim`, per-language impls)
|
|
|
|
Each tokenizer converts raw source into a `seq[Token]`. Tokenizers track:
|
|
|
|
- **Position**: line, column, and byte offset for every token
|
|
- **Bracket stack**: `(`, `[`, `{`, `<` pushed and popped with position tracking
|
|
- **String context**: escape sequences, multi-line delimiters, interpolation
|
|
- **Comment context**: line comments, block comments with nesting support
|
|
|
|
Tokenizers emit errors for:
|
|
- Unclosed strings (`ErrUnclosedString`)
|
|
- Unclosed comments (`ErrUnclosedComment`)
|
|
- Unexpected characters (`ErrUnexpectedToken`)
|
|
- Unclosed block constructs (language-specific, e.g., `${}`, `$()`)
|
|
|
|
### Layer 3: Validator (`src/nimcheck/core/validatorbase.nim`, per-language impls)
|
|
|
|
Each validator:
|
|
|
|
1. Creates its tokenizer and runs `tokenize()`
|
|
2. Collects tokenizer errors
|
|
3. Runs `analyzeTokens()` - language-specific structural analysis
|
|
4. Runs `buildModuleInfo()` - populates `ModuleInfo` with imports, functions, classes
|
|
5. Computes validity, warning/info counts, duration
|
|
|
|
Validators register themselves via a factory pattern at import time. The registry maps flavor strings (e.g., `"python"`, `"bash"`) to constructors.
|
|
|
|
### Layer 4: Reporting (`src/nimcheck/reporting/errors.nim`)
|
|
|
|
Produces:
|
|
- **Human-readable reports**: `formatReport()` with position, severity, code, message, source context with carets, and hints
|