Files
superwork/vscode/src/codeReader/editor/documentMessage.ts
T

40 lines
1.5 KiB
TypeScript

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<CodeReaderRegistry, 'languageFor' | 'translatorsFor' | 'selectedTranslator'>,
runtime: Pick<TreeSitterRuntime, 'parse'>,
): Promise<DocumentMessage> {
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) }
}
}