🐛 fix(vscode): Rust 连着写的行注释合成一块注释,和别的语言走同一套拆块

This commit is contained in:
cruldra committed 2026-10-08 07:17:25 +08:00
1 parent 51da724e68
commit 2f610e9cb8
11 files changed
+233 -121

No files matched your search

+92 -2
View File
@@ -25,6 +25,10 @@ function card(list: BlockView[], kind: string): BlockView {
return found
}
function markdown(block: BlockView | undefined): string | undefined {
return block && 'translation' in block && 'markdown' in block.translation ? block.translation.markdown : undefined
}
describe('rust 语言卡片', () => {
it('use、结构体、枚举、实现、函数、特质', async () => {
expect(viewLines(await views(sample))).toEqual([
@@ -139,13 +143,14 @@ describe('rust 语言卡片', () => {
expect(mod?.kind).toBe('module')
expect(list.some(block => block.kind === 'statement' && block.code.includes('const LIMIT'))).toBe(false)
expect(list.filter(block => block.kind === 'statement').map(block => block.code)).toEqual(['mod other;'])
expect(mod?.children.map(block => block.kind)).toEqual(['import', 'const', 'variable', 'function', 'function', 'statement', 'statement'])
expect(mod?.children.map(block => block.kind)).toEqual(['comment', 'import', 'const', 'variable', 'function', 'function', 'statement', 'statement'])
expect(viewLines(mod ? [mod] : [])).toEqual([
'module 1',
' 名称: platform',
' 说明: 平台相关。',
' 可见性: 公开',
' import 3',
' comment 3: 读入。',
' import 4',
' 来源: std::io',
' 导入项: 1 个',
' Read | —',
@@ -180,3 +185,88 @@ describe('rust 语言卡片', () => {
expect(viewLines(inner ? [inner] : []).join('\n')).toMatch(/类型: u8|值: 2/)
})
})
describe('rust 注释', () => {
it('连着写的 // 合成一块注释,空的 // 是分段,预览是去掉 // 的 Markdown;后面的 use 照常是导入', async () => {
const list = await views(readFixture('rustComments.rs'))
expect(list.map(block => [block.kind, block.startLine + 1, block.endLine + 1])).toEqual([['comment', 1, 9], ['import', 11, 11]])
expect(markdown(list[0])).toBe([
'apps/desktop/src-tauri/src/credentials.rs',
'',
'设备凭证按账号分开存 (键见 `device::account_key`: 后端地址 + 用户 id, 值为凭证 JSON)。',
'执行器重启或同账号重登后拿它直接重连, 平台上还是同一台设备: 不必重新注册, 设备列表',
'不多出一条, 应用的工作区也不因"换了设备"被重建。',
'',
'正式版存系统钥匙串 (macOS 钥匙串 / Windows 凭据管理器 / Linux Secret Service)。开发版',
'存执行器数据目录下的文件: macOS 钥匙串按程序的确切构建认"谁能读", 没有苹果开发者身份的',
'程序每重编一次就被当成新程序, 反复弹授权框。',
].join('\n'))
})
it('隔着空行、隔着语句的注释各是一块,行尾的 // 不单独成块', async () => {
const source = [
'// 第一段',
'// 缩进四格的代码',
'',
'// 第二段',
'use std::io; // 读写',
'// 第三段',
'const N: u8 = 1;',
'',
].join('\n')
const list = await views(source)
expect(list.map(block => [block.kind, block.startLine + 1, block.endLine + 1])).toEqual([
['comment', 1, 2],
['comment', 4, 4],
['import', 5, 5],
['comment', 6, 6],
['const', 7, 7],
])
expect(markdown(list[0])).toBe('第一段\n 缩进四格的代码')
})
it('/// 并进下一个函数当说明,//! 连着几行合成一块,// 和 /// 不合在一起', async () => {
const source = [
'//! 本模块管凭证。',
'//!',
'//! 第二段。',
'',
'// 普通注释',
'/// 读出这个账号的凭证。',
'/// 没存过时是 None。',
'#[inline]',
'pub fn load() -> Option<String> { None }',
'',
].join('\n')
const list = await views(source)
expect(list.map(block => [block.kind, block.startLine + 1, block.endLine + 1])).toEqual([
['comment', 1, 3],
['comment', 5, 5],
['function', 6, 9],
])
expect(markdown(list[0])).toBe('本模块管凭证。\n\n第二段。')
expect(viewLines([list[2]!])).toContain(' 说明: 读出这个账号的凭证。')
})
it('在 mod、impl 身体里同一套', async () => {
const source = [
'mod store {',
' // 一',
' // 二',
' fn a() {}',
'}',
'impl Store {',
' // 三',
' //',
' // 四',
' fn b(&self) {}',
'}',
'',
].join('\n')
const list = await views(source)
const mod = list.find(block => block.kind === 'module')
const impl = list.find(block => block.kind === 'rust.impl')
expect(markdown(mod?.children[0])).toBe('一\n二')
expect(markdown(impl?.children.find(block => block.kind === 'comment'))).toBe('三\n\n四')
})
})