语言插件按和语言无关的 id 报块属性(通用的由宿主从 facts 推),翻译插件起名,webview 只按 id 筛; 筛选整个工作区共用、记在 workspaceState;JavaScript 不再显示「抽象:否」「仅类型:否」
64 lines
2.8 KiB
TypeScript
64 lines
2.8 KiB
TypeScript
/**
|
||
* 代码阅读预览与扩展之间的消息,与 webview 端 `webview-ui/src/codeReader/types.ts` 同构,两边手动保持一致。
|
||
*/
|
||
|
||
import type { FileAttribute } from '../attributes'
|
||
import type { BlockView } from '../blockView'
|
||
import type { Excluded } from './blockFilter'
|
||
|
||
export type { Excluded }
|
||
|
||
export interface TranslatorOption { id: string, label: string }
|
||
|
||
/**
|
||
* 让预览滚到包含 line 的块。definition 只在跳到定义时有:定义处那个名字在源码里的下标(Segment.offset),
|
||
* 预览展开把它折叠住的块和属性行,再让就是这处定义的那一块或属性表里那一行闪几下。
|
||
*/
|
||
export interface Reveal {
|
||
line: number
|
||
definition?: number
|
||
}
|
||
|
||
export interface DocumentMessage {
|
||
type: 'document'
|
||
/** TextDocument.version:webview 靠它判断是不是新一份文档 */
|
||
version: number
|
||
languageId: string
|
||
blocks: BlockView[]
|
||
/** 这份文件里出现过的筛选属性和值(带显示名、块数),按筛选栏的先后排,见 fileAttributes */
|
||
attributes: FileAttribute[]
|
||
translators: TranslatorOption[]
|
||
translatorId: string
|
||
error?: string
|
||
/** 新预览只在第一份 document 里带:从文本编辑器切过来时是它顶部那一行,跳到定义时是定义处 */
|
||
reveal?: Reveal
|
||
}
|
||
|
||
/**
|
||
* reveal:已经开着的预览滚到某处(同 DocumentMessage.reveal)
|
||
* definitionProbed:id 那次 probeDefinition 的回答,found 表示 VS Code 查得到定义
|
||
* filter:整个工作区共用的块筛选;ready 后先于第一份文档发一次,之后任何一个预览改了都发给所有预览
|
||
*/
|
||
export type ExtensionToWebview
|
||
= | DocumentMessage
|
||
| ({ type: 'reveal' } & Reveal)
|
||
| { type: 'definitionProbed', id: number, found: boolean }
|
||
| { type: 'filter', excluded: Excluded }
|
||
|
||
/**
|
||
* edit:把 startLine..endLine 这几行整行替换成 text(扩展端给每行补回原来的缩进)
|
||
* visibleLine:预览视口顶部那块的起始行,切回文本编辑器时把这行放到顶部
|
||
* probeDefinition:按住 ⌘ / Ctrl 指到带下标的名字上,问源码 offset 处有没有定义;id 标出是哪一次问,回答带回去;
|
||
* version 是这份下标所属的文档版本
|
||
* goToDefinition:⌘ / Ctrl + 点击,跳到 offset 处名字的定义
|
||
* setFilter:改块筛选(整份替换),扩展端记下后发 filter 给所有预览
|
||
*/
|
||
export type WebviewToExtension
|
||
= | { type: 'ready' }
|
||
| { type: 'setFilter', excluded: Excluded }
|
||
| { type: 'edit', startLine: number, endLine: number, text: string }
|
||
| { type: 'selectTranslator', id: string }
|
||
| { type: 'visibleLine', line: number }
|
||
| { type: 'probeDefinition', id: number, version: number, offset: number }
|
||
| { type: 'goToDefinition', version: number, offset: number }
|