Перейти к основному содержимому

LSP-сервер CodeGraph

Настройка диагностики, hover, CodeLens и быстрых исправлений на основе CPG в LSP-клиенте. См. примеры и проверки перед применением.

Руководства

Языковой сервер CodeGraph передаёт LSP-клиенту информацию о коде из графа. Он читает существующий DuckDB CPG под управлением GoCPG, но не строит и не обновляет этот граф.

Предварительные условия

Перед запуском:

  1. Установите CodeGraph вместе с консольной командой codegraph-lsp и её LSP-зависимостями.
  2. Постройте или обновите CPG целевого проекта поддерживаемым способом.
  3. Зафиксируйте базу на время сессии редактора и используйте её как единственный источник диагностики.
  4. Храните путь к базе внутри одобренной рабочей области заказчика.

Проверка команды

codegraph-lsp --help

Запустите транспорт standard input/output с существующим графом:

codegraph-lsp --db <cpg.duckdb>

В checkout исходного кода также работает совместимая команда python -m codegraph_lsp, но в конфигурации установленного клиента лучше использовать консольную точку входа.

Поддерживаемые параметры

Поддерживаемые параметры
Параметр Назначение
--db <cpg.duckdb> Обязательный путь к CPG под управлением GoCPG.
--complexity-threshold <integer> Порог диагностики сложности; по умолчанию 10.
--transport stdio|tcp Транспорт LSP; по умолчанию stdio.
--host <address> Адрес TCP; по умолчанию 127.0.0.1.
--port <integer> Порт TCP; по умолчанию 2087.
--log-level debug|info|warning|error Уровень журнала; по умолчанию info.

TCP предназначен для локальной или защищённой сетевой границы:

codegraph-lsp --db <cpg.duckdb> --transport tcp --host 127.0.0.1 --port 2087 --log-level info

Сервер не добавляет аутентификацию и TLS к TCP-транспорту. Не привязывайте его к недоверенному интерфейсу без одобренного защитного слоя.

Пример для OpenCode

OpenCode направляет файлы в LSP-сервер по расширениям. Адаптируйте команду и набор файлов к установленному окружению:

{
  "lsp": {
    "codegraph": {
      "command": ["codegraph-lsp", "--db", "<cpg.duckdb>"],
      "extensions": [".py", ".go", ".js", ".ts", ".java", ".c", ".cpp"]
    }
  }
}

Путь в угловых скобках — обозначение, а не готовая конфигурация JSON. Замените его точным одобренным путём к CPG заказчика.

Заявленные возможности

Сервер обрабатывает открытие, сохранение и закрытие документа. Сейчас он предоставляет:

  • textDocument/hover с метриками метода;
  • textDocument/codeLens с числом callers/callees и доступной подсказкой о taint flow;
  • textDocument/codeAction для поддерживаемых быстрых исправлений;
  • диагностику после открытия или сохранения документа.

Диагностика может включать результаты security-правил, мёртвые методы, цикломатическую сложность и остальные pattern findings. Результат зависит от таблиц и столбцов выбранного CPG. Ошибка запроса может привести к пустому ответу. Чистоту кода подтверждают результаты проверки; отсутствие сообщения требует проверить ошибку запроса.

Hover, CodeLens и быстрые исправления

Hover читает сложность метода, fan-in, fan-out, callers, LOC, число параметров, признаки и количество security findings, если это позволяет текущая схема.

CodeLens показывает callers и callees и может добавить путь taint из edges_reaching_def.

Быстрое исправление предлагается только тогда, когда сохранённое match_data диагностики содержит значение fix. Проверяйте правку до сохранения: сервер возвращает записанную замену. Семантическую корректность всей программы проверьте тестами и ревью.

Свежесть и сопоставление путей

LSP-сервер открывает CPG на чтение и преобразует URI файлов в относительные пути workspace с прямыми слэшами. Если редактор ничего не показывает:

  1. Проверьте журнал сервера на ошибки запуска и запросов.
  2. Убедитесь, что граф относится к открытому репозиторию.
  3. Обновите CPG поддерживаемым процессом проекта.
  4. Сохраните или заново откройте файл, чтобы запросить диагностику.
  5. Проверьте сопоставимость имён файлов в графе с относительными путями редактора.

Не исправляйте устаревший граф прямым редактированием DuckDB. Перед обслуживанием остановите writer или согласуйте работу с его владельцем.

Работа соединений

Сервер создаёт небольшой пул запросов и освобождает соединение после каждого обращения. Исчерпанный или заблокированный пул обычно означает параллельный writer, долгий запрос, недоступный граф или прерванный клиент. Перезапуск LSP может очистить оборванную сессию, но не исправит устаревший или некорректный CPG.

Поддерживаемые источники

  • pyproject.toml регистрирует консольную точку входа codegraph-lsp.
  • integrations/opencode/codegraph_lsp/__main__.py определяет параметры CLI и выбор транспорта.
  • integrations/opencode/codegraph_lsp/server.py определяет возможности LSP и обработчики запросов.
  • integrations/opencode/codegraph_lsp/diagnostics.py, hover.py, codelens.py и codeaction.py определяют текущие результаты.

Если статья расходится с установленной ревизией, авторитетны исходный код и вывод codegraph-lsp --help.