Skip to content

Commit 58ffa4b

Browse files
committed
Add pluggable parsers architecture
1 parent 9bfc073 commit 58ffa4b

11 files changed

Lines changed: 544 additions & 362 deletions

File tree

ARCHITECTURE.md

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ codegraph/
1414
│ ├── __init__.py # Package init, version definition
1515
│ ├── main.py # CLI entry point (click-based)
1616
│ ├── core.py # Core graph building logic
17-
│ ├── parser.py # Python source code parser
17+
│ ├── parser.py # Python token parser (legacy, used by PythonParser)
18+
│ ├── parsers/ # Pluggable language parsers
19+
│ │ ├── base.py # Parser interface
20+
│ │ ├── python_parser.py # Python parser implementation
21+
│ │ ├── rust_parser.py # Rust parser stub
22+
│ │ ├── registry.py # Parser registry / discovery
1823
│ ├── utils.py # Utility functions
1924
│ └── vizualyzer.py # Visualization (D3.js + matplotlib)
2025
├── tests/ # Test suite
@@ -30,10 +35,28 @@ codegraph/
3035

3136
## Core Components
3237

33-
### 1. Parser (`codegraph/parser.py`)
38+
### 1. Parser Layer (`codegraph/parsers/`)
39+
40+
Parser implementations are pluggable via a registry. Each parser exposes:
41+
- `get_source_files()` for language-specific file discovery
42+
- `parse_files()` to produce module objects
43+
- `usage_graph()` to build dependencies
44+
- `get_entity_metadata()` for entity stats
45+
46+
This allows adding new languages without changing core graph orchestration.
47+
48+
#### Python Parser (`codegraph/parsers/python_parser.py`)
49+
50+
Uses the legacy token-based parser in `codegraph/parser.py` to extract classes,
51+
functions, imports, and line ranges.
3452

3553
The parser uses Python's `tokenize` module to extract code structure from source files.
3654

55+
#### Rust Parser (`codegraph/parsers/rust_parser.py`)
56+
57+
Currently a stub to establish extension points. The intent is to parse `.rs` files,
58+
extract functions/structs/impl blocks, and build dependency edges using a Rust-aware parser.
59+
3760
**Key Classes:**
3861
- `_Object` - Base class for all parsed objects (lineno, endno, name, parent)
3962
- `Function` - Represents a function definition
@@ -52,16 +75,15 @@ The parser uses Python's `tokenize` module to extract code structure from source
5275

5376
### 2. Core (`codegraph/core.py`)
5477

55-
The core module builds the dependency graph from parsed data.
78+
The core module orchestrates parsing and visualization by delegating language-specific
79+
work to the selected parser.
5680

5781
**Key Classes:**
5882
- `CodeGraph` - Main class that orchestrates graph building
5983

6084
**Key Functions:**
61-
- `get_code_objects(paths_list)` - Parse all files and return dict of module → objects
62-
- `get_imports_and_entities_lines()` - Extract imports and entity line ranges
63-
- `collect_entities_usage_in_modules()` - Find where entities are used
64-
- `search_entity_usage()` - Check if entity is used in a line
85+
- `usage_graph()` - Delegates to the active parser
86+
- `get_entity_metadata()` - Delegates to the active parser
6587

6688
**Data Flow:**
6789
```

SUGGESTIONS.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Предложения по доработке и расширению CodeGraph
2+
3+
Ниже — идеи по развитию проекта, опираясь на текущую архитектуру и кодовую базу.
4+
5+
## 1) Точность анализа и качество графа
6+
- **Перейти на `ast`/`libcst` для разбора**: токенизация ломается на сложных кейсах (f-строки, переносы, декораторы, match/case). AST даст корректные границы сущностей, типы, базовые классы и вызовы.
7+
- **Поддержать относительные импорты**: `from . import x`, `from ..pkg import y`. Сейчас `get_imports_and_entities_lines` работает только с абсолютными именами.
8+
- **Разрешение алиасов и импортов**: хранить карту `alias -> full.module` и подставлять при поиске зависимостей (сейчас глобальный `aliases` рискованен при многомодульном анализе).
9+
- **Улучшить поиск использования сущностей**: вместо простого `name + "("` анализировать вызовы/атрибуты (`ast.Call`, `ast.Attribute`), чтобы уменьшить ложные срабатывания.
10+
- **Связи "module -> module" отдельно от "entity -> entity"**: сейчас модульные связи строятся через `_`, что усложняет трактовку; можно выделить явный тип связи.
11+
12+
## 2) Производительность и масштабирование
13+
- **Параллельный разбор файлов**: `get_code_objects` можно распараллелить (ProcessPool), особенно на больших репозиториях.
14+
- **Кэширование результатов**: сохранять AST/объекты по хэшу файла для инкрементального анализа.
15+
- **Фильтрация файлов**: опции CLI для исключения `tests/`, `migrations/`, `__pycache__` и т.п.
16+
17+
## 3) Расширение форматов и интеграций
18+
- **Экспорт в DOT/GraphML/JSON**: добавить форматы, чтобы легко импортировать в Gephi, Neo4j, yEd.
19+
- **CLI-вывод для CI**: режим `--json` или `--report` для автоматических проверок связности/циклов.
20+
- **Плагинная архитектура визуализаторов**: единый интерфейс `Visualizer` + регистрация (D3, matplotlib, webview).
21+
22+
## 4) Визуализация и UX
23+
- **Группировка по пакетам**: кластеризация по папкам/пакетам, возможность свернуть директорию.
24+
- **Фильтры по типам связей**: переключатели module/module, entity/entity, external.
25+
- **Подсветка циклов**: детект циклических зависимостей и отдельная визуальная маркировка.
26+
- **Панель статистики**: топ-узлов по degree, число циклов, изолированные модули.
27+
28+
## 5) Надежность и тестирование
29+
- **Тесты на сложные импорты и алиасы**: `from pkg import a as b`, `import pkg.sub as s`, относительные импорты.
30+
- **Снапшот-тесты на D3 JSON**: фиксировать структуру узлов/связей для регрессий.
31+
- **Отдельные тесты на performance**: большие наборы файлов, ограничение по времени.
32+
33+
## 6) Архитектурные улучшения
34+
- **Убрать глобальное состояние**: `aliases` как состояние внутри `CodeGraph`.
35+
- **Четкая модель данных**: dataclasses для узлов/ребер + типы связей; сейчас используется разнородный dict.
36+
- **Единая карта модулей**: хранить `module_path -> module_name` и обратное соответствие для устойчивых ссылок.
37+
38+
---
39+
40+
Если нужно, могу предложить приоритетный roadmap (MVP улучшений + быстрые wins) или подготовить первые PR-изменения.

0 commit comments

Comments
 (0)