Commit ec4a018f authored by Roman Alifanov's avatar Roman Alifanov

Add compile-time method validation

parent 2aab914d
......@@ -907,7 +907,35 @@ Error: Missing closing brace
--> main.ct:15:1
```
Показывает все ошибки сразу.
### Проверка методов
Компилятор проверяет существование методов при компиляции:
```
Error: Unknown method 'nonexistent' for type 'array'. Available: filter, get, join, len, map, pop, push, set, shift, slice
--> main.ct:5:1
Error: Unknown method 'badMethod' for type 'fs'. Available: append, exists, list, mkdir, open, read, remove, write
--> main.ct:10:8
```
Проверяются методы для:
- **Массивов**`filter`, `get`, `join`, `len`, `map`, `pop`, `push`, `set`, `shift`, `slice`
- **Словарей**`del`, `get`, `has`, `keys`, `set`
- **Строк**`charAt`, `contains`, `ends`, `index`, `len`, `lower`, `replace`, `split`, `starts`, `substr`, `trim`, `upper`
- **Файловых дескрипторов**`close`, `read`, `readline`, `write`, `writeln`
- **Stdlib namespaces**:
- `fs``append`, `exists`, `list`, `mkdir`, `open`, `read`, `remove`, `write`
- `http``delete`, `get`, `post`, `put`
- `json``parse`, `stringify`
- `logger``debug`, `error`, `info`, `warn`
- `regex``extract`, `match`
- `args``count`, `get`
- `shell``capture`, `exec`, `source`
- `time``ms`, `now`
- `math``abs`, `add`, `div`, `max`, `min`, `mod`, `mul`, `sub`
Показывает все ошибки сразу (без дубликатов).
---
......
......@@ -17,6 +17,7 @@
- **Error handling**`try/except/finally/throw/defer`
- **String interpolation**`"Hello, {name}!"`
- **@awk functions** — compile to AWK for ~300x speedup on string/numeric operations
- **Compile-time method validation** — catches unknown methods before runtime
- **Optimized output** - no unnecessary subshells, inlined methods
## Installation
......
......@@ -17,6 +17,7 @@
- **Обработка ошибок**`try/except/finally/throw/defer`
- **Строковая интерполяция**`"Привет, {name}!"`
- **@awk функции** — компиляция в AWK для ускорения ~300x на строковых/числовых операциях
- **Проверка методов при компиляции** — выявление несуществующих методов до запуска
- **Оптимизированный вывод** — без лишних subshell, инлайнинг методов
## Установка
......
......@@ -20,18 +20,28 @@ class CompileError:
class ErrorCollector:
def __init__ (self):
self.errors: List[CompileError] = []
self._seen: set = set()
def _error_key(self, msg: str, filename: str, line: int, column: int) -> tuple:
return (msg, filename, line, column)
def add (self, error: CompileError):
self.errors.append (error)
key = self._error_key(error.message, error.filename, error.line, error.column)
if key not in self._seen:
self._seen.add(key)
self.errors.append(error)
def add_error (self, message: str, filename: str, line: int, column: int, hint: str = None):
self.errors.append (CompileError (
message=message,
filename=filename,
line=line,
column=column,
hint=hint
))
key = self._error_key(message, filename, line, column)
if key not in self._seen:
self._seen.add(key)
self.errors.append (CompileError (
message=message,
filename=filename,
line=line,
column=column,
hint=hint
))
def has_errors (self) -> bool:
return len (self.errors) > 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment