Skip to content

Межфайловый анализ

Описание проблемы

В ранних реализациях check_files_with_diagnostics создавал независимый Compiler для каждого файла, что делало невозможным обнаружение межфайловых ссылок. Функция pub, определённая в fileA, не могла быть распознана в fileB.

Решение

Использование общего TypeEnvironment, проверка всех модулей в порядке зависимостей.

Процесс реализации

text
1. Параллельный парсинг всех .yx файлов → Vec<(PathBuf, ModuleId, AST)>
2. Построение графа зависимостей с помощью ModuleDependencyGraph::build_from_ast
3. detect_cycles() проверяет циклические зависимости → сообщение об ошибке
4. topological_sort() получает порядок компиляции
5. Проверка типов в порядке:
   a. Создание общего TypeEnvironment (включая std модуль)
   b. Для каждого модуля: регистрация его экспортов в общей среде → проверка типов
   c. Сбор диагностической информации
6. Возврат CheckResult

Изоляция пространства имён

Использование формата module_name.symbol_name для хранения экспортируемых символов позволяет избежать конфликтов между одноимёнными символами разных модулей.

Известные ограничения

  • traits/ заглушка реализации (coherence/impl_check/object_safety/resolution) не завершена
  • check_single_module всё ещё создаёт независимый Compiler для каждого модуля (передача информации о типах через общую среду ещё не полностью реализована)

Будущая работа

  • T8: Сквозной тест для межфайловой проверки типов
  • A4: Совместное использование trait_table и native_signatures