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 ...@@ -907,7 +907,35 @@ Error: Missing closing brace
--> main.ct:15:1 --> 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 @@ ...@@ -17,6 +17,7 @@
- **Error handling**`try/except/finally/throw/defer` - **Error handling**`try/except/finally/throw/defer`
- **String interpolation**`"Hello, {name}!"` - **String interpolation**`"Hello, {name}!"`
- **@awk functions** — compile to AWK for ~300x speedup on string/numeric operations - **@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 - **Optimized output** - no unnecessary subshells, inlined methods
## Installation ## Installation
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
- **Обработка ошибок**`try/except/finally/throw/defer` - **Обработка ошибок**`try/except/finally/throw/defer`
- **Строковая интерполяция**`"Привет, {name}!"` - **Строковая интерполяция**`"Привет, {name}!"`
- **@awk функции** — компиляция в AWK для ускорения ~300x на строковых/числовых операциях - **@awk функции** — компиляция в AWK для ускорения ~300x на строковых/числовых операциях
- **Проверка методов при компиляции** — выявление несуществующих методов до запуска
- **Оптимизированный вывод** — без лишних subshell, инлайнинг методов - **Оптимизированный вывод** — без лишних subshell, инлайнинг методов
## Установка ## Установка
......
...@@ -20,18 +20,28 @@ class CompileError: ...@@ -20,18 +20,28 @@ class CompileError:
class ErrorCollector: class ErrorCollector:
def __init__ (self): def __init__ (self):
self.errors: List[CompileError] = [] 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): 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): def add_error (self, message: str, filename: str, line: int, column: int, hint: str = None):
self.errors.append (CompileError ( key = self._error_key(message, filename, line, column)
message=message, if key not in self._seen:
filename=filename, self._seen.add(key)
line=line, self.errors.append (CompileError (
column=column, message=message,
hint=hint filename=filename,
)) line=line,
column=column,
hint=hint
))
def has_errors (self) -> bool: def has_errors (self) -> bool:
return len (self.errors) > 0 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