✨ feat(vscode): 代码阅读预览 Rust 的语言卡片
This commit is contained in:
1 parent
4480f936f3
commit
6d58b681cf
15 files changed
+1016
-6
No files matched your search
@@ -0,0 +1,112 @@
|
||||
import type { BlockView } from '../blockView'
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { toBlockViews } from '../blockView'
|
||||
import { blockMarks } from '../diff/viewDiff'
|
||||
import { rustImplRule } from '../rules/rustImpl'
|
||||
import { readFixture, viewLines, WASM_DIR, withBlocks } from '../testSupport'
|
||||
import { rustZhTranslator } from '../translators/rustZh'
|
||||
import { createRustAdapter } from './rust'
|
||||
|
||||
const adapter = createRustAdapter(WASM_DIR)
|
||||
const sample = readFixture('rustLang.rs')
|
||||
|
||||
function views(source: string): Promise<BlockView[]> {
|
||||
return withBlocks(adapter, 'rust', source, blocks =>
|
||||
toBlockViews(blocks, { source, language: adapter, markers: [] }, rustZhTranslator, {
|
||||
rules: [rustImplRule],
|
||||
report: () => {},
|
||||
}))
|
||||
}
|
||||
|
||||
function card(list: BlockView[], kind: string): BlockView {
|
||||
const found = list.find(block => block.kind === kind)
|
||||
if (!found)
|
||||
throw new Error(`没有 ${kind}`)
|
||||
return found
|
||||
}
|
||||
|
||||
describe('rust 语言卡片', () => {
|
||||
it('use、结构体、枚举、实现、函数、特质', async () => {
|
||||
expect(viewLines(await views(sample))).toEqual([
|
||||
'import 1',
|
||||
' 来源: serde',
|
||||
' 导入项: 1 个',
|
||||
' Serialize | —',
|
||||
'import 2',
|
||||
' 来源: std::sync',
|
||||
' 导入项: 1 个',
|
||||
' Arc | —',
|
||||
'import 3',
|
||||
' 来源: foo',
|
||||
' 导入项: 2 个',
|
||||
' Bar | Baz',
|
||||
' Qux | —',
|
||||
'class 5',
|
||||
' 名称: AgentRow',
|
||||
' 说明: 桌面端列表里的一行代理。',
|
||||
' 可见性: 公开',
|
||||
' 字段: 2 个',
|
||||
' id | Uuid | 公开',
|
||||
' name | String | 本模块',
|
||||
'class 12',
|
||||
' 名称: CrateOnly',
|
||||
' 可见性: 本 crate',
|
||||
' 字段: 1 个',
|
||||
' up | u8 | 父模块',
|
||||
'enum 16',
|
||||
' 名称: AgentState',
|
||||
' 说明: 这个代理现在处在哪一步。',
|
||||
' 变体: 3 个',
|
||||
' Idle | —',
|
||||
' Running | { pid: u32 }',
|
||||
' Failed | String',
|
||||
'rust.impl 23',
|
||||
' 名称: AgentRow 的方法',
|
||||
' 方法: 1 个',
|
||||
' rename | &mut self, name: String | ()',
|
||||
' function 24',
|
||||
' 名称: rename',
|
||||
' 可见性: 本模块',
|
||||
' 参数: 2 个',
|
||||
' self | &mut self',
|
||||
' name | String',
|
||||
' 返回: ()',
|
||||
'function 27',
|
||||
' 名称: start_server',
|
||||
' 说明: 在本机拉起接口服务。',
|
||||
' 异步: 是',
|
||||
' 可见性: 公开',
|
||||
' 输入参数: 1 个',
|
||||
' addr | SocketAddr',
|
||||
' 返回: Result<(), StartError>',
|
||||
' 分情况: 2 支',
|
||||
' Ok(listener) | 记下监听地址',
|
||||
' Err(err) | 返回 StartError',
|
||||
'trait 41',
|
||||
' 名称: Store',
|
||||
' 说明: 按 id 读写代理。',
|
||||
' 方法: 2 个',
|
||||
' get | &self, id: Uuid | Result<AgentRow, StoreError>',
|
||||
' save | &mut self, row: AgentRow | Result<(), StoreError>',
|
||||
])
|
||||
})
|
||||
|
||||
it('实现的方法放进方法表那一行', async () => {
|
||||
const impl = card(await views(sample), 'rust.impl')
|
||||
const [method] = impl.children
|
||||
expect(method?.slot).toEqual({ row: 1, item: 0 })
|
||||
})
|
||||
|
||||
it('给结构体加一个字段,多出来的那一行标成新增', async () => {
|
||||
const before = 'pub struct AgentRow {\n name: String,\n}\n'
|
||||
const after = 'pub struct AgentRow {\n name: String,\n id: Uuid,\n}\n'
|
||||
const [oldCard] = await views(before)
|
||||
const [newCard] = await views(after)
|
||||
const marks = oldCard && newCard ? blockMarks(oldCard, newCard) : undefined
|
||||
const field = newCard && 'properties' in newCard ? newCard.properties.findIndex(row => row.label === '字段') : -1
|
||||
expect(field).toBeGreaterThanOrEqual(0)
|
||||
expect(marks?.rows?.changed[field]).toEqual({
|
||||
items: { changed: { 1: { added: true } }, removed: [] },
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in new issue
Block a user