✨ feat(vscode): 代码阅读加 Celery 库规则,定时任务表里的任务名能跳到任务函数

This commit is contained in:
cruldra committed 2026-09-26 19:41:07 +08:00
1 parent 905d7845b5
commit 68104e2cba
22 files changed
+2228 -139

No files matched your search

+17 -2
View File
@@ -1,19 +1,24 @@
import type { ExtensionContext, Uri } from 'vscode'
import type { CodeReaderApi } from './contract'
import type { CodeReaderApi, RuleLocation, RuleReference } from './contract'
import { commands, window, workspace } from 'vscode'
import { logger } from '../logging/logger'
import { BlockFilter } from './editor/blockFilter'
import { PREVIEW_VIEW_TYPE, PreviewEditorProvider } from './editor/previewEditor'
import { showPreview, showSource } from './editor/switchEditor'
import { FileTreeProvider } from './explorer/fileTree'
import { createPythonAdapter } from './languages/python'
import { createTypeScriptAdapter } from './languages/typescript'
import { resolveReference } from './libraryRules'
import { registerNoteCommands } from './notes/commands'
import { FileNotes } from './notes/fileNotes'
import { CodeReaderRegistry } from './registry'
import { celeryRule } from './rules/celery'
import { sqlalchemyRule } from './rules/sqlalchemy'
import { bundledWasmDir, TreeSitterRuntime } from './runtime'
import { pythonZhTranslator } from './translators/pythonZh'
import { typescriptZhTranslator } from './translators/typescriptZh'
import { workspaceIndexHost } from './workspaceFiles'
import { WorkspaceIndexes } from './workspaceIndex'
/** 当前语言插件覆盖的 languageId,给 editor/title 的 when 子句判断要不要显示「预览」。 */
const LANGUAGE_IDS_CONTEXT = 'superpowers.codeReader.languageIds'
@@ -47,12 +52,21 @@ async function openFile(uri: Uri, registry: CodeReaderRegistry): Promise<void> {
export function registerCodeReader(context: ExtensionContext): CodeReaderApi {
const registry = new CodeReaderRegistry(context.globalState)
const runtime = new TreeSitterRuntime(bundledWasmDir())
const previews = new PreviewEditorProvider(context.extensionUri, registry, runtime, new BlockFilter(context.workspaceState))
const report = (message: string): void => logger.add({ level: 'warn', source: 'codeReader', message })
const indexes = new WorkspaceIndexes(workspaceIndexHost(async (languageId, source) => {
const adapter = registry.languageFor(languageId)
if (!adapter)
throw new Error(`没有「${languageId}」的语言插件`)
return runtime.parse(adapter, languageId, source)
}, report))
const resolve = (reference: RuleReference): Promise<RuleLocation[]> => resolveReference(reference, registry.libraryRules(), indexes, report)
const previews = new PreviewEditorProvider(context.extensionUri, registry, runtime, new BlockFilter(context.workspaceState), resolve)
const notes = new FileNotes()
const files = new FileTreeProvider(OPEN_COMMAND, notes)
context.subscriptions.push(
notes,
indexes,
registerNoteCommands(notes),
registry.onDidChange(() => {
void commands.executeCommand('setContext', LANGUAGE_IDS_CONTEXT, registry.languageIds())
@@ -76,6 +90,7 @@ export function registerCodeReader(context: ExtensionContext): CodeReaderApi {
api.registerTranslator(typescriptZhTranslator),
api.registerTranslator(pythonZhTranslator),
api.registerLibraryRule(sqlalchemyRule),
api.registerLibraryRule(celeryRule),
)
return api
}