scancscode 1.0.31 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.trae/specs/fix-doc-comment-boundary/checklist.md +7 -0
  2. package/.trae/specs/fix-doc-comment-boundary/spec.md +52 -0
  3. package/.trae/specs/fix-doc-comment-boundary/tasks.md +34 -0
  4. package/.trae/specs/fix-interpolated-string-nested-literals/checklist.md +7 -0
  5. package/.trae/specs/fix-interpolated-string-nested-literals/spec.md +55 -0
  6. package/.trae/specs/fix-interpolated-string-nested-literals/tasks.md +25 -0
  7. package/.trae/specs/fix-remaining-interpolated-string-index/checklist.md +9 -0
  8. package/.trae/specs/fix-remaining-interpolated-string-index/spec.md +59 -0
  9. package/.trae/specs/fix-remaining-interpolated-string-index/tasks.md +41 -0
  10. package/.trae/specs/fix-return-interpolated-string/checklist.md +8 -0
  11. package/.trae/specs/fix-return-interpolated-string/spec.md +60 -0
  12. package/.trae/specs/fix-return-interpolated-string/tasks.md +39 -0
  13. package/.trae/specs/handle-anonymous-function-strings/checklist.md +11 -0
  14. package/.trae/specs/handle-anonymous-function-strings/spec.md +137 -0
  15. package/.trae/specs/handle-anonymous-function-strings/tasks.md +65 -0
  16. package/.trae/specs/handle-interpolated-string-double-braces/checklist.md +9 -0
  17. package/.trae/specs/handle-interpolated-string-double-braces/spec.md +61 -0
  18. package/.trae/specs/handle-interpolated-string-double-braces/tasks.md +41 -0
  19. package/.trae/specs/handle-return-statement/checklist.md +11 -0
  20. package/.trae/specs/handle-return-statement/spec.md +76 -0
  21. package/.trae/specs/handle-return-statement/tasks.md +44 -0
  22. package/.trae/specs/handle-special-string-characters/checklist.md +13 -0
  23. package/.trae/specs/handle-special-string-characters/spec.md +94 -0
  24. package/.trae/specs/handle-special-string-characters/tasks.md +74 -0
  25. package/.trae/specs/unify-return-statement-string-extraction/checklist.md +10 -0
  26. package/.trae/specs/unify-return-statement-string-extraction/spec.md +70 -0
  27. package/.trae/specs/unify-return-statement-string-extraction/tasks.md +54 -0
  28. package/bin/scanliterals.js +3 -3
  29. package/bin/slimlangs.js +3 -3
  30. package/dist/debug-arg.js +30 -0
  31. package/dist/debug-args.js +34 -0
  32. package/dist/debug-comment-5.js +25 -0
  33. package/dist/debug-comment-strings.js +24 -0
  34. package/dist/debug-full.js +14 -0
  35. package/dist/debug-template-issue.js +33 -0
  36. package/dist/debug-test-5.js +23 -0
  37. package/dist/debug-test.js +21 -0
  38. package/dist/debug.js +15 -0
  39. package/dist/simple-debug.js +27 -0
  40. package/dist/simple-test.js +61 -0
  41. package/dist/src/CSharpStringExtractor.js +1791 -358
  42. package/dist/src/CmdExecutor.js +6 -8
  43. package/dist/temp-original-source.js +1 -0
  44. package/dist/test/CSharpStringExtractor.test.js +1587 -207
  45. package/dist/test-logic.js +79 -0
  46. package/dist/test-regex.js +13 -0
  47. package/docs/CSharpStringExtractor/344/273/243/347/240/201/347/224/237/346/210/220/346/217/220/347/244/272/350/257/215.txt +73 -0
  48. package/jest.config.js +9 -9
  49. package/package.json +1 -1
  50. package/src/CSCodeScanner.ts +305 -305
  51. package/src/CSVUtils.ts +181 -181
  52. package/src/CSharpStringExtractor.ts +2058 -479
  53. package/src/CmdExecutor.ts +107 -106
  54. package/src/LiteralCollector.ts +143 -143
  55. package/src/RunConvert.ts +3 -3
  56. package/src/RunSlimLangs.ts +3 -3
  57. package/src/TableScanner.ts +92 -92
  58. package/test/CSharpStringExtractor.test.ts +1673 -208
  59. package/test/KeeperDialog.cs +114 -0
  60. package/test/TestSpecialString.cs +24 -0
  61. package/tsconfig.json +109 -109
@@ -0,0 +1,7 @@
1
+ - [x] 检查是否只修改了 extractCommentStrings、extractClassMemberStrings、extractObjectInitializerStrings、processObjectInitializerStringsOnly 等相关代码
2
+ - [x] 检查是否正确识别并跳过了三个或更多连续 / 开头的文档注释
3
+ - [x] 检查是否保持对两个 / 开头的普通注释的正常处理
4
+ - [x] 检查 "should handle doc comment boundary for class/method/members" 测试是否通过
5
+ - [x] 检查所有其他 98 个测试是否保持通过
6
+ - [x] 检查代码是否遵循 TypeScript 语言语法,没有使用 HTML 实体字符
7
+ - [x] 检查是否没有使用 "arguments" 等保留字段作为局部变量名
@@ -0,0 +1,52 @@
1
+ # 修复文档注释字符串提取 - Product Requirement Document
2
+
3
+ ## Overview
4
+ - **Summary**: 修复 `extractCommentStrings` 方法,使其忽略 C# 文档注释(三个或更多连续 / 开头的注释)中的字符串
5
+ - **Purpose**: 解决测试用例 "should handle doc comment boundary for class and method" 失败的问题
6
+ - **Target Users**: 使用该 C# 字符串提取和国际化工具的开发者
7
+
8
+ ## Goals
9
+ - 修复 extractCommentStrings 方法,使其忽略三个或更多连续 / 开头的文档注释
10
+ - 确保测试用例 "should handle doc comment boundary for class and method" 能够通过
11
+ - 保持其他所有现有测试的通过状态
12
+
13
+ ## Non-Goals (Out of Scope)
14
+ - 不修改文档注释以外的其他注释处理逻辑
15
+ - 不添加新的功能特性
16
+
17
+ ## Background & Context
18
+ - 当前问题:extractCommentStrings 方法正在提取三个或更多连续 / 开头的文档注释中的字符串
19
+ - 测试明确要求:类注释、方法注释、属性/字段注释都不应参与字符串表达式提取
20
+
21
+ ## Functional Requirements
22
+ - **FR-1**: 正确识别并忽略三个或更多连续 / 开头的文档注释
23
+ - **FR-2**: 正常处理两个 / 开头的普通注释
24
+
25
+ ## Non-Functional Requirements
26
+ - **NFR-1**: 修复后不影响其他 98 个测试的通过状态
27
+ - **NFR-2**: 保持代码的类型安全和可读性
28
+
29
+ ## Constraints
30
+ - **Technical**: 必须使用 TypeScript,遵循项目现有代码风格
31
+ - **Business**: 必须保持与现有代码的兼容性
32
+
33
+ ## Assumptions
34
+ - 现有代码的其他部分功能正常
35
+ - 测试用例 "should handle doc comment boundary for class and method" 是正确的预期行为
36
+
37
+ ## Acceptance Criteria
38
+
39
+ ### AC-1: 测试用例 "should handle doc comment boundary for class and method" 成功通过
40
+ - **Given**: 存在该测试用例测试文档注释边界问题
41
+ - **When**: 运行该测试用例
42
+ - **Then**: 测试用例成功通过
43
+ - **Verification**: `programmatic`
44
+
45
+ ### AC-2: 其他所有测试保持通过
46
+ - **Given**: 修复后的代码
47
+ - **When**: 运行所有 Jest 测试
48
+ - **Then**: 所有其他 98 个测试保持通过
49
+ - **Verification**: `programmatic`
50
+
51
+ ## Open Questions
52
+ - 无
@@ -0,0 +1,34 @@
1
+ # 修复文档注释字符串提取 - The Implementation Plan (Decomposed and Prioritized Task List)
2
+
3
+ ## [x] Task 1: 修改 extractCommentStrings 方法,忽略文档注释(三个或更多连续 /)
4
+ - **Priority**: P0
5
+ - **Depends On**: None
6
+ - **Description**:
7
+ - 在 extractCommentStrings 方法中,检查是否是三个或更多连续 / 开头的文档注释
8
+ - 如果是文档注释,直接跳过,不处理该注释中的任何字符串
9
+ - 保持对两个 / 开头的普通注释的正常处理
10
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2]
11
+ - **Test Requirements**:
12
+ - `programmatic` TR-1.1: 确保 "should handle doc comment boundary for class and method" 测试通过 ✓
13
+ - `programmatic` TR-1.2: 确保所有其他 98 个现有测试保持通过 ✓
14
+ - **Notes**: 主要修改在检测到注释时,检查是否是三个连续 / 或更多
15
+
16
+ ## [x] Task 2: 在其他提取方法中添加注释跳过逻辑
17
+ - **Priority**: P0
18
+ - **Depends On**: Task 1
19
+ - **Description**:
20
+ - 在 extractClassMemberStrings、extractObjectInitializerStrings、processObjectInitializerStringsOnly 方法中都添加对注释的检测和跳过逻辑
21
+ - 在处理每个字符前先检查当前是否在注释中,如果是就跳过
22
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2]
23
+ - **Test Requirements**:
24
+ - `programmatic` TR-2.1: 确保所有 99 个测试都通过 ✓
25
+
26
+ ## [x] Task 3: 验证修复是否完整
27
+ - **Priority**: P1
28
+ - **Depends On**: Task 2
29
+ - **Description**:
30
+ - 运行所有测试,确保没有引入新问题
31
+ - 验证修复是否完全符合测试用例的预期
32
+ - **Acceptance Criteria Addressed**: [AC-2]
33
+ - **Test Requirements**:
34
+ - `programmatic` TR-3.1: 运行完整的 Jest 测试套件并确保 100% 通过 ✓
@@ -0,0 +1,7 @@
1
+ - [x] 检查修复是否只修改了 processStringTemplates 方法中的相关代码
2
+ - [x] 检查在查找内插表达式 {…} 时是否正确处理了字符串字面量
3
+ - [x] 检查 "should handle fix interpolated string nested literals" 测试是否通过
4
+ - [x] 检查所有其他 96 个测试是否保持通过
5
+ - [x] 检查生成的 convertedCode 是否与测试预期一致
6
+ - [x] 检查代码是否遵循 TypeScript 语言语法,没有使用 HTML 实体字符
7
+ - [x] 检查是否没有使用 "arguments" 等保留字段作为局部变量名
@@ -0,0 +1,55 @@
1
+ # 修复内插字符串处理 - Product Requirement Document
2
+
3
+ ## Overview
4
+ - **Summary**: 修复 `CSharpStringExtractor` 中处理内插字符串($"")时,当内插表达式内部包含字符串字面量导致的解析错误问题
5
+ - **Purpose**: 解决测试用例 "should handle complex string 3" 失败的问题,该测试验证 C# 字符串表达式中递归内嵌字符串表达式的情况是否能被正确转换
6
+ - **Target Users**: 使用该 C# 字符串提取和国际化工具的开发者
7
+
8
+ ## Goals
9
+ - 修复 `processStringTemplates` 方法,使其能够正确处理内插字符串内部包含字符串字面量的情况
10
+ - 确保测试用例 "should handle complex string 3" 能够通过
11
+ - 保持其他现有测试的通过状态
12
+
13
+ ## Non-Goals (Out of Scope)
14
+ - 不修改其他与内插字符串处理无关的功能
15
+ - 不添加新的功能特性,仅修复现有问题
16
+
17
+ ## Background & Context
18
+ - 当前问题:当处理包含嵌套字符串字面量的内插字符串时,例如 `$"是否暴击: [b]{(_damageInfo.IsCritical ? "[color=#00B000]是[/color]" : "否")}[/b]\n"`,解析器会过早终止匹配,导致转换结果错误
19
+ - 根本原因:1) 模板正则表达式在匹配内容时没有正确处理嵌套的引号;2) 在提取内插表达式 `{...}` 时没有忽略内部字符串字面量中的 `{` 和 `}` 字符
20
+
21
+ ## Functional Requirements
22
+ - **FR-1**: 正确匹配包含嵌套字符串字面量的内插字符串
23
+ - **FR-2**: 在提取内插表达式变量时,正确处理内部的字符串引号
24
+ - **FR-3**: 生成正确的 `Tr.Format()` 转换结果
25
+
26
+ ## Non-Functional Requirements
27
+ - **NFR-1**: 修复后不影响其他 96 个测试的通过状态
28
+ - **NFR-2**: 保持代码的类型安全和可读性
29
+
30
+ ## Constraints
31
+ - **Technical**: 必须使用 TypeScript,遵循项目现有代码风格
32
+ - **Business**: 必须保持与现有代码的兼容性
33
+ - **Dependencies**: 无额外依赖,仅修改现有代码
34
+
35
+ ## Assumptions
36
+ - 现有代码的其他部分功能正常
37
+ - 测试用例 "should handle complex string 3" 是正确的预期行为
38
+
39
+ ## Acceptance Criteria
40
+
41
+ ### AC-1: 测试用例 "should handle complex string 3" 成功通过
42
+ - **Given**: 存在测试用例测试包含嵌套字符串字面量的内插字符串
43
+ - **When**: 运行该测试用例
44
+ - **Then**: 测试用例成功通过
45
+ - **Verification**: `programmatic`
46
+ - **Notes**: 确保 convertedCode 正确生成,literals 正确提取
47
+
48
+ ### AC-2: 其他所有测试保持通过
49
+ - **Given**: 修复后的代码
50
+ - **When**: 运行所有 Jest 测试
51
+ - **Then**: 所有 96 个测试保持通过
52
+ - **Verification**: `programmatic`
53
+
54
+ ## Open Questions
55
+ - 无
@@ -0,0 +1,25 @@
1
+ # 修复内插字符串处理 - The Implementation Plan (Decomposed and Prioritized Task List)
2
+
3
+ ## [x] Task 1: 修复 processStringTemplates 方法中的变量表达式解析逻辑
4
+ - **Priority**: P0
5
+ - **Depends On**: None
6
+ - **Description**:
7
+ - 在提取内插表达式 `{...}` 时,添加对内部字符串字面量的处理逻辑
8
+ - 在查找匹配的右括号时,跳过字符串字面量内部的内容
9
+ - 实现方法:在查找 `{}` 时,添加字符串状态跟踪(inString, escapeNext, stringDelimiter)
10
+ - 同时修复了查找内插字符串结束引号的问题,确保忽略内部单引号
11
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2]
12
+ - **Test Requirements**:
13
+ - `programmatic` TR-1.1: 确保 "should handle complex string 3" 测试通过 ✓
14
+ - `programmatic` TR-1.2: 确保所有 96 个现有测试保持通过 ✓
15
+ - **Notes**: 从当前的 braceDepth 循环开始,添加字符串处理逻辑
16
+
17
+ ## [x] Task 2: 验证修复是否完整
18
+ - **Priority**: P1
19
+ - **Depends On**: Task 1
20
+ - **Description**:
21
+ - 运行所有测试,确保没有引入新问题
22
+ - 验证修复是否完全符合测试用例的预期
23
+ - **Acceptance Criteria Addressed**: [AC-2]
24
+ - **Test Requirements**:
25
+ - `programmatic` TR-2.1: 运行完整的 Jest 测试套件并确保 100% 通过 ✓
@@ -0,0 +1,9 @@
1
+
2
+ # 修复剩余内插字符串测试用例 - Verification Checklist
3
+
4
+ - [x] `should handle special characters in string expression 5` 测试用例成功通过
5
+ - [x] `should handle special characters in string expression 6` 测试用例成功通过
6
+ - [x] 所有 80 个现有测试用例继续通过,无回归问题
7
+ - [x] 对象初始化器中的内插字符串 originalIndex 计算正确
8
+ - [x] 函数调用参数中的内插字符串 originalIndex 计算正确
9
+
@@ -0,0 +1,59 @@
1
+
2
+ # 修复剩余内插字符串测试用例 - Product Requirement Document
3
+
4
+ ## Overview
5
+ - **Summary**: 修复剩余的内插字符串测试用例失败问题,特别是 `should handle special characters in string expression 5` 和 `should handle special characters in string expression 6`
6
+ - **Purpose**: 解决测试用例中内插字符串的 originalIndex 不正确的问题,确保所有 80 个测试用例都能通过
7
+ - **Target Users**: 使用 CSharpStringExtractor 工具来扫描和提取 C# 代码中字符串字面量的开发者
8
+
9
+ ## Goals
10
+ - 修复 `should handle special characters in string expression 5` 测试用例的失败问题
11
+ - 修复 `should handle special characters in string expression 6` 测试用例的失败问题
12
+ - 确保所有内插字符串的 originalIndex 计算正确
13
+ - 保持所有现有测试用例的通过状态
14
+
15
+ ## Non-Goals (Out of Scope)
16
+ - 改变工具的整体架构或 API 接口
17
+ - 添加超出内插字符串索引计算之外的新功能
18
+
19
+ ## Background & Context
20
+ - 当前已经修复了内插字符串中 `{{` 和 `}}` 转义序列的处理问题
21
+ - 但是还有几个测试用例失败,问题是 originalIndex 计算不正确(相差 1 个字符)
22
+ - 需要检查索引计算的逻辑,可能与字符串提取过程中的位置计算有关
23
+
24
+ ## Functional Requirements
25
+ - **FR-1**: 工具必须正确计算所有内插字符串的 originalIndex
26
+ - **FR-2**: 工具必须正确处理对象初始化器中的内插字符串
27
+ - **FR-3**: 工具必须正确处理函数调用参数中的内插字符串
28
+
29
+ ## Non-Functional Requirements
30
+ - **NFR-1**: 所有 80 个现有测试用例必须继续通过
31
+ - **NFR-2**: 修复不能降低工具的性能
32
+ - **NFR-3**: 代码必须遵循 TypeScript 语言规范
33
+
34
+ ## Constraints
35
+ - **Technical**: 必须使用 TypeScript 编写,保持现有代码风格和架构
36
+ - **Dependencies**: 不添加任何新的依赖库
37
+
38
+ ## Assumptions
39
+ - 问题与索引计算相关,相差 1 个字符通常是因为前导空白或换行符的处理
40
+ - 用户期望的行为符合 C# 语言规范
41
+
42
+ ## Acceptance Criteria
43
+
44
+ ### AC-1: 剩余内插字符串测试用例通过
45
+ - **Given**: 包含内插字符串的测试用例
46
+ - **When**: 运行所有测试用例
47
+ - **Then**: `should handle special characters in string expression 5` 和 `should handle special characters in string expression 6` 测试用例应该成功通过
48
+ - **Verification**: `programmatic`
49
+
50
+ ### AC-2: 所有现有测试继续通过
51
+ - **Given**: 完整的测试套件
52
+ - **When**: 运行所有测试用例
53
+ - **Then**: 所有 80 个现有测试用例应该继续通过
54
+ - **Verification**: `programmatic`
55
+ - **Notes**: 保持向后兼容性
56
+
57
+ ## Open Questions
58
+ - 无
59
+
@@ -0,0 +1,41 @@
1
+
2
+ # 修复剩余内插字符串测试用例 - The Implementation Plan (Decomposed and Prioritized Task List)
3
+
4
+ ## [x] 任务 1: 分析索引计算错误的原因
5
+ - **Priority**: P0
6
+ - **Depends On**: None
7
+ - **Description**:
8
+ - 查看对象初始化器和函数调用参数中字符串提取的索引计算逻辑
9
+ - 分析为什么 originalIndex 相差 1 个字符
10
+ - 检查 `extractObjectInitializerStrings` 和 `processObjectInitializerStringsOnly` 方法的实现
11
+ - **Acceptance Criteria Addressed**: [AC-1]
12
+ - **Test Requirements**:
13
+ - `programmatic` TR-1.1: 定位索引计算错误的具体代码位置 ✓
14
+ - `human-judgement` TR-1.2: 理解为什么索引相差 1 个字符 ✓
15
+ - **Notes**: 重点关注对象初始化器和函数调用参数中的字符串索引计算
16
+
17
+ ## [x] 任务 2: 修复索引计算问题
18
+ - **Priority**: P0
19
+ - **Depends On**: 任务 1
20
+ - **Description**:
21
+ - 修复对象初始化器中内插字符串的 originalIndex 计算
22
+ - 修复函数调用参数中内插字符串的 originalIndex 计算
23
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2]
24
+ - **Test Requirements**:
25
+ - `programmatic` TR-2.1: 修复后 `should handle special characters in string expression 5` 测试用例必须通过 ✓
26
+ - `programmatic` TR-2.2: 修复后 `should handle special characters in string expression 6` 测试用例必须通过 ✓
27
+ - `programmatic` TR-2.3: 所有其他测试用例继续通过,无回归 ✓
28
+ - **Notes**: 确保修改不会影响其他类型字符串的索引计算
29
+ - **Modifications**: 在 `extractObjectInitializerStrings` 和 `processObjectInitializerStringsOnly` 方法中添加了对 `$"`, `$@"`, `@$"` 内插字符串的支持
30
+
31
+ ## [x] 任务 3: 运行所有测试确保没有回归
32
+ - **Priority**: P0
33
+ - **Depends On**: 任务 2
34
+ - **Description**:
35
+ - 运行完整的测试套件,确保所有测试用例都能通过
36
+ - 检查是否有任何测试出现回归
37
+ - **Acceptance Criteria Addressed**: [AC-2]
38
+ - **Test Requirements**:
39
+ - `programmatic` TR-3.1: 运行 `npm test` 命令,所有 80 个测试用例必须通过 ✓
40
+ - **Notes**: 确保修复不会破坏任何现有功能
41
+
@@ -0,0 +1,8 @@
1
+
2
+ # 修复 return 语句中的内插字符串处理 - Verification Checklist
3
+
4
+ - [ ] `should handle special characters in string expression 7` 测试用例成功通过
5
+ - [ ] 所有 82 个现有测试用例继续通过,无回归问题
6
+ - [ ] return 语句中的内插字符串能够被正确识别和处理
7
+ - [ ] return 语句中的内插字符串能够被正确转换为 Tr.Format 调用
8
+
@@ -0,0 +1,60 @@
1
+
2
+ # 修复 return 语句中的内插字符串处理 - Product Requirement Document
3
+
4
+ ## Overview
5
+ - **Summary**: 修复 return 语句中内插字符串的处理问题,确保 return 语句中的内插字符串能够被正确提取和转换
6
+ - **Purpose**: 解决测试用例 `should handle special characters in string expression 7` 的失败问题,问题是 return 语句中的内插字符串没有被正确处理,导致 convertedCode 变成了错误的 "yz`-=[]" 片段
7
+ - **Target Users**: 使用 CSharpStringExtractor 工具来扫描和提取 C# 代码中字符串字面量的开发者
8
+
9
+ ## Goals
10
+ - 修复 `should handle special characters in string expression 7` 测试用例的失败问题
11
+ - 确保 return 语句中的内插字符串能够被正确识别和处理
12
+ - 确保 return 语句中的内插字符串能够被正确转换为 Tr.Format 调用
13
+ - 保持所有现有测试用例的通过状态
14
+
15
+ ## Non-Goals (Out of Scope)
16
+ - 改变工具的整体架构或 API 接口
17
+ - 添加超出 return 语句处理之外的新功能
18
+
19
+ ## Background & Context
20
+ - 当前已经修复了对象初始化器和函数调用参数中内插字符串的处理问题
21
+ - 但是 return 语句中的内插字符串还有问题,测试 7 失败
22
+ - 问题可能出在 `processStatementAndExtractValue` 方法中处理 return 语句的部分
23
+
24
+ ## Functional Requirements
25
+ - **FR-1**: 工具必须正确处理 return 语句中的内插字符串
26
+ - **FR-2**: 工具必须正确提取 return 语句中的内插字符串
27
+ - **FR-3**: 工具必须正确将 return 语句中的内插字符串转换为 Tr.Format 调用
28
+
29
+ ## Non-Functional Requirements
30
+ - **NFR-1**: 所有 82 个现有测试用例必须继续通过
31
+ - **NFR-2**: 修复不能降低工具的性能
32
+ - **NFR-3**: 代码必须遵循 TypeScript 语言规范
33
+
34
+ ## Constraints
35
+ - **Technical**: 必须使用 TypeScript 编写,保持现有代码风格和架构
36
+ - **Dependencies**: 不添加任何新的依赖库
37
+
38
+ ## Assumptions
39
+ - 问题出在 processStatementAndExtractValue 方法的 return 语句处理部分
40
+ - 用户期望的行为符合 C# 语言规范
41
+
42
+ ## Acceptance Criteria
43
+
44
+ ### AC-1: Return 语句内插字符串测试通过
45
+ - **Given**: 包含 return 语句和内插字符串的测试用例
46
+ - **When**: 运行 `should handle special characters in string expression 7` 测试
47
+ - **Then**: 该测试用例应该成功通过,不出现任何错误
48
+ - **Verification**: `programmatic`
49
+ - **Notes**: 确保 return 语句中的内插字符串被正确转换为 Tr.Format 调用
50
+
51
+ ### AC-2: 所有现有测试继续通过
52
+ - **Given**: 完整的测试套件
53
+ - **When**: 运行所有测试用例
54
+ - **Then**: 所有 82 个现有测试用例应该继续通过
55
+ - **Verification**: `programmatic`
56
+ - **Notes**: 保持向后兼容性
57
+
58
+ ## Open Questions
59
+ - 无
60
+
@@ -0,0 +1,39 @@
1
+
2
+ # 修复 return 语句中的内插字符串处理 - The Implementation Plan (Decomposed and Prioritized Task List)
3
+
4
+ ## [/] 任务 1: 分析 return 语句中内插字符串处理的问题
5
+ - **Priority**: P0
6
+ - **Depends On**: None
7
+ - **Description**:
8
+ - 查看 `processStatementAndExtractValue` 方法中处理 return 语句的逻辑
9
+ - 分析为什么 convertedCode 变成了 "yz`-=[]" 而不是正确的 Tr.Format 调用
10
+ - 检查当 return 语句中的字符串被 processStringTemplates 处理后,后续的提取逻辑是否正确
11
+ - **Acceptance Criteria Addressed**: [AC-1]
12
+ - **Test Requirements**:
13
+ - `programmatic` TR-1.1: 定位 return 语句中内插字符串处理错误的具体代码位置
14
+ - `human-judgement` TR-1.2: 理解为什么提取错误的 "yz`-=[]" 片段
15
+ - **Notes**: 重点关注 processStatementAndExtractValue 方法中的 return 语句处理
16
+
17
+ ## [ ] 任务 2: 修复 return 语句中的内插字符串处理
18
+ - **Priority**: P0
19
+ - **Depends On**: 任务 1
20
+ - **Description**:
21
+ - 修复 `processStatementAndExtractValue` 方法中处理 return 语句的逻辑
22
+ - 确保当 processStringTemplates 处理完内插字符串后,后续的 value 提取逻辑能正确地获取完整的 Tr.Format 调用
23
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2]
24
+ - **Test Requirements**:
25
+ - `programmatic` TR-2.1: 修复后 `should handle special characters in string expression 7` 测试用例必须通过
26
+ - `programmatic` TR-2.2: 所有其他测试用例继续通过,无回归
27
+ - **Notes**: 确保修改不会影响其他类型语句的处理
28
+
29
+ ## [ ] 任务 3: 运行所有测试确保没有回归
30
+ - **Priority**: P0
31
+ - **Depends On**: 任务 2
32
+ - **Description**:
33
+ - 运行完整的测试套件,确保所有测试用例都能通过
34
+ - 检查是否有任何测试出现回归
35
+ - **Acceptance Criteria Addressed**: [AC-2]
36
+ - **Test Requirements**:
37
+ - `programmatic` TR-3.1: 运行 `npm test` 命令,所有 82 个测试用例必须通过
38
+ - **Notes**: 确保修复不会破坏任何现有功能
39
+
@@ -0,0 +1,11 @@
1
+ # 匿名函数字符串提取 - Verification Checklist
2
+
3
+ - [x] 所有匿名函数相关测试用例(test/CSharpStringExtractor.test.ts:2333-2478)通过
4
+ - [x] 所有现有的测试用例继续通过
5
+ - [x] 代码严格遵循 TypeScript 语法
6
+ - [x] 不使用 HTML 实体编码字符
7
+ - [x] 不使用 arguments 等保留字段作为局部变量名
8
+ - [x] extractObjectInitializerStrings 和 processObjectInitializerStringsOnly 方法行为一致
9
+ - [x] 添加了 alreadyExists 检查以避免重复添加相同片段
10
+ - [x] 匿名函数内的普通字符串被正确提取
11
+ - [x] 匿名函数内的内插字符串被正确提取和转换
@@ -0,0 +1,137 @@
1
+ # 匿名函数字符串提取 - Product Requirement Document
2
+
3
+ ## Overview
4
+
5
+ * **Summary**: 修改 CSharpStringExtractor 类,使其能够正确识别和提取 C# 代码中匿名函数内的字符串表达式。
6
+
7
+ * **Purpose**: 解决当前代码无法处理匿名函数中字符串提取的问题,确保匿名函数中的字符串也能被正确国际化。
8
+
9
+ * **Target Users**: Unity 项目开发者,使用此工具进行 C# 代码国际化。
10
+
11
+ ## Goals
12
+
13
+ * 正确识别 C# 代码中的匿名函数
14
+
15
+ * 提取匿名函数内的字符串表达式
16
+
17
+ * 支持多种形式的匿名函数定义(带修饰词、带参数、不带参数、有大括号、无大括号)
18
+
19
+ * 确保匿名函数内的字符串与其他字符串一起按正确顺序返回
20
+
21
+ * 保持现有功能不变
22
+
23
+ ## Non-Goals (Out of Scope)
24
+
25
+ * 不修改字符串处理的核心逻辑
26
+
27
+ * 不改变已有的测试用例
28
+
29
+ * 不添加新的功能,除了匿名函数字符串提取
30
+
31
+ ## Background & Context
32
+
33
+ * 当前代码可以处理对象初始化器和类成员初始化中的字符串,但无法处理赋值给成员的匿名函数内的字符串
34
+
35
+ * 匿名函数常见形式:`() => { ... }`、`async () => { ... }`、`(param) => expression`
36
+
37
+ * 测试用例位于 test/CSharpStringExtractor.test.ts:2333-2478
38
+
39
+ ## Functional Requirements
40
+
41
+ * **FR-1**: 支持提取对象初始化器中赋值给成员的匿名函数内的字符串
42
+
43
+ * **FR-2**: 支持带 async 修饰词的匿名函数
44
+
45
+ * **FR-3**: 支持带参数和不带参数的匿名函数
46
+
47
+ * **FR-4**: 支持有大括号和无大括号的匿名函数表达式
48
+
49
+ * **FR-5**: 支持匿名函数内的普通字符串和内插字符串
50
+
51
+ # Non-Functional Requirements
52
+
53
+ # **NFR-1**: 所有现有测试用例必须继续通过
54
+
55
+ * **NFR-2**: 性能不应受到明显影响
56
+ * **NFR-3**: 代码必须严格遵循 TypeScript 语法
57
+
58
+ ## Constraints
59
+
60
+ * **Technical**: 使用 TypeScript,不使用 HTML 实体编码,不使用 arguments 等保留字段名
61
+
62
+ * **Business**: 必须通过指定的测试用例
63
+
64
+ * **Dependencies**: 依赖 Jest 测试框架
65
+
66
+ ## Assumptions
67
+
68
+ * 匿名函数总是出现在对象初始化器或类成员赋值的场景中
69
+
70
+ * 匿名函数的边界可以通过大括号匹配或箭头符号确定
71
+
72
+ ## Acceptance Criteria
73
+
74
+ ### AC-1: 处理对象初始化器中匿名函数内的字符串
75
+
76
+ * **Given**: 有一个对象初始化器,其中某个成员被赋值为一个包含字符串的匿名函数
77
+
78
+ * **When**: extractStrings 方法被调用处理此代码
79
+
80
+ * **Then**: 匿名函数内的字符串被正确提取,并且按原始顺序返回
81
+
82
+ * **Verification**: `programmatic`
83
+
84
+ ### AC-2: 处理带 async 修饰词的匿名函数
85
+
86
+ * **Given**: 有一个带 async 修饰词的匿名函数,其中包含字符串
87
+
88
+ * **When**: extractStrings 方法被调用处理此代码
89
+
90
+ * **Then**: 匿名函数内的字符串被正确提取
91
+
92
+ * **Verification**: `programmatic`
93
+
94
+ ### AC-3: 处理带参数的匿名函数
95
+
96
+ * **Given**: 有一个带参数的匿名函数,其中包含字符串
97
+
98
+ * **When**: extractStrings 方法被调用处理此代码
99
+
100
+ * **Then**: 匿名函数内的字符串被正确提取
101
+
102
+ * **Verification**: `programmatic`
103
+
104
+ ### AC-4: 处理无大括号的匿名函数表达式
105
+
106
+ * **Given**: 有一个无大括号的匿名函数表达式,其中包含字符串
107
+
108
+ * **When**: extractStrings 方法被调用处理此代码
109
+
110
+ * **Then**: 匿名函数内的字符串被正确提取
111
+
112
+ * **Verification**: `programmatic`
113
+
114
+ ### AC-5: 处理匿名函数内的内插字符串
115
+
116
+ * **Given**: 有一个匿名函数,其中包含内插字符串
117
+
118
+ * **When**: extractStrings 方法被调用处理此代码
119
+
120
+ * **Then**: 内插字符串被正确提取和转换
121
+
122
+ * **Verification**: `programmatic`
123
+
124
+ ### AC-6: 保持现有功能不变
125
+
126
+ * **Given**: 所有现有的测试用例
127
+
128
+ * **When**: 运行测试
129
+
130
+ * **Then**: 所有现有的测试用例必须通过
131
+
132
+ * **Verification**: `programmatic`
133
+
134
+ ## Open Questions
135
+
136
+ * 无
137
+
@@ -0,0 +1,65 @@
1
+ # 匿名函数字符串提取 - The Implementation Plan (Decomposed and Prioritized Task List)
2
+
3
+ ## [x] Task 1: 分析当前实现和测试失败原因
4
+ - **Priority**: P0
5
+ - **Depends On**: None
6
+ - **Description**:
7
+ - 分析 extractObjectInitializerStrings 和 processObjectInitializerStringsOnly 方法的当前实现
8
+ - 了解为什么它们无法处理匿名函数中的字符串
9
+ - 研究测试用例的预期行为
10
+ - **Acceptance Criteria Addressed**: [AC-1, AC-6]
11
+ - **Test Requirements**:
12
+ - `programmatic` TR-1.1: 运行测试用例,确认失败状态
13
+ - `programmatic` TR-1.2: 分析代码流程,确定问题所在
14
+ - **Notes**: 无
15
+
16
+ ## [x] Task 2: 设计解决方案
17
+ - **Priority**: P0
18
+ - **Depends On**: Task 1
19
+ - **Description**:
20
+ - 设计如何在对象初始化器中识别匿名函数
21
+ - 设计如何在匿名函数内部继续提取字符串
22
+ - 设计如何处理大括号匹配和箭头符号
23
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2, AC-3, AC-4]
24
+ - **Test Requirements**:
25
+ - `human-judgement` TR-2.1: 设计文档清晰说明如何识别和处理匿名函数
26
+ - **Notes**: 确保不破坏现有功能
27
+
28
+ ## [x] Task 3: 实现 extractObjectInitializerStrings 方法的修复
29
+ - **Priority**: P0
30
+ - **Depends On**: Task 2
31
+ - **Description**:
32
+ - 修改 extractObjectInitializerStrings 方法
33
+ - 添加匿名函数识别逻辑
34
+ - 确保匿名函数内的字符串被正确提取
35
+ - 添加 alreadyExists 检查以避免重复
36
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2, AC-3, AC-4, AC-5]
37
+ - **Test Requirements**:
38
+ - `programmatic` TR-3.1: 匿名函数相关测试用例通过
39
+ - `programmatic` TR-3.2: 所有现有测试用例继续通过
40
+ - **Notes**: 严格遵循 TypeScript 语法
41
+
42
+ ## [x] Task 4: 实现 processObjectInitializerStringsOnly 方法的修复
43
+ - **Priority**: P0
44
+ - **Depends On**: Task 3
45
+ - **Description**:
46
+ - 修改 processObjectInitializerStringsOnly 方法
47
+ - 保持与 extractObjectInitializerStrings 方法一致的行为
48
+ - **Acceptance Criteria Addressed**: [AC-1, AC-6]
49
+ - **Test Requirements**:
50
+ - `programmatic` TR-4.1: 匿名函数相关测试用例通过
51
+ - `programmatic` TR-4.2: 所有现有测试用例继续通过
52
+ - **Notes**: 确保两个方法的行为一致
53
+
54
+ ## [x] Task 5: 全面验证和测试
55
+ - **Priority**: P0
56
+ - **Depends On**: Task 4
57
+ - **Description**:
58
+ - 运行所有匿名函数相关测试用例
59
+ - 运行所有现有测试用例
60
+ - 确保没有回归
61
+ - **Acceptance Criteria Addressed**: [AC-1, AC-2, AC-3, AC-4, AC-5, AC-6]
62
+ - **Test Requirements**:
63
+ - `programmatic` TR-5.1: 所有匿名函数测试用例通过
64
+ - `programmatic` TR-5.2: 所有现有测试用例通过
65
+ - **Notes**: 无
@@ -0,0 +1,9 @@
1
+
2
+ # 处理内插字符串中的双花括号 - Verification Checklist
3
+
4
+ - [x] `should handle special characters in string expression 4` 测试用例成功通过
5
+ - [x] 所有 79 个现有测试用例继续通过,无回归问题
6
+ - [x] 内插字符串中的 `{{` 转义序列被正确处理,保持原样
7
+ - [x] 内插字符串中的 `}}` 转义序列被正确处理,保持原样
8
+ - [x] 单个 `{expr}` 内插表达式被正确替换为 `{0}`, `{1}` 等
9
+