import type { CodeReaderRegistry } from '../registry' import type { TreeSitterRuntime } from '../runtime' import type { DocumentMessage } from './messages' import { readBlockViews } from '../blockView' /** 生成预览数据要读的那点文档信息(TextDocument 的子集)。 */ export interface DocumentSnapshot { languageId: string version: number getText: () => string } /** 当前文档 → 发给预览的 document 消息;语言不支持或解析失败时带 error,blocks 为空。 */ export async function documentMessage( document: DocumentSnapshot, registry: Pick, runtime: Pick, ): Promise { const { languageId, version } = document const source = document.getText() const translator = registry.selectedTranslator(languageId) const message: DocumentMessage = { type: 'document', version, languageId, blocks: [], translators: registry.translatorsFor(languageId).map(({ id, label }) => ({ id, label })), translatorId: translator?.id ?? '', } const adapter = registry.languageFor(languageId) if (!adapter) return { ...message, error: `代码阅读还不支持「${languageId}」这种语言` } try { return { ...message, blocks: await readBlockViews(runtime, adapter, translator, languageId, source) } } catch (err) { return { ...message, error: err instanceof Error ? err.message : String(err) } } }