scancscode 1.0.33 → 1.0.35

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.
@@ -1,73 +1,73 @@
1
- 对文件进行TypeScript代码重构,重点优化字符串匹配方法设计,将原有的整句C#语句捕获逻辑精确调整为仅捕获字符串值表达式部分,通过90%的测试用例。开发过程中必须严格遵循以下规范:采用原生TypeScript开发方式,严禁使用反编译JavaScript的方法;禁止使用`git show`等需要用户手动确认的操作;所有中间生成的临时文件仅在最终结束时,以清单形式提示用户需要清理的文件列表,不得自动执行清理操作。不要使用 `<`、 `&`、`>` 等html代码中才有的符号,严格使用 typescript 语言语法, 不使用 `arguments` 等保留字段作为局部变量名。
2
- 其中CodeSnippet类成员定义如下:
3
-
4
- ```typescript
5
- export class CodeSnippet {
6
- /**
7
- * 要替换的原始内容在代码全文中的起始位置,从0开始
8
- */
9
- originalIndex: number;
10
- /**
11
- * 从originalIndex开始长度至少30个字符的原始代码文本,如果从originalIndex开始后续全文中包含`;`符号,那么originalContext必须包含一个`;`号
12
- */
13
- originalContext: string;
14
- /**
15
- * 标记是否改变了原始代码内容,如果需要替换文件内容则为true,否则为false; 具体定义为: isChanged = originalCode!=convertedCode
16
- */
17
- isChanged: boolean;
18
- /**
19
- * 要替换的C#语句整句原始内容
20
- */
21
- originalCode: string;
22
- /**
23
- * originalCode转换后的代码
24
- */
25
- convertedCode: string;
26
- /**
27
- * 匹配出的所有字符串列表, 包括转换出来的字符串模板,同一个位置匹配出的字符串会合并到一个元素中
28
- */
29
- literals: string[];
30
- /**
31
- * 无法识别的疑似字符串列表
32
- */
33
- unexpects: string[];
34
- }
35
- ```
36
-
37
-
38
- 代码实现需满足以下具体技术要求:
39
- 1. 重构originalCode的解析逻辑,实现精确的字符串操作表达式定位与提取,严格排除非字符串表达式的代码部分
40
- 2. 基于调整后的originalCode提取逻辑,同步更新convertedCode的转换逻辑和originalIndex的位置映射关系,确保代码转换的准确性和位置对应关系
41
- 3. 完整实现CSharpStringExtractor类,该类必须包含名为`extractStrings`的公共成员方法。此方法接收C#代码字符串作为输入参数,提取其中的字符串文本转换信息,并以CodeSnippet[]数组形式返回处理结果
42
-
43
- CodeSnippet数据结构必须严格符合以下规范:
44
- - CodeSnippet.originalCode:存储从C#代码中提取的完整字符串值表达式文本,确保不包含多余的代码内容
45
- - CodeSnippet.convertedCode:存储按照"规则A"转换后的字符串值表达式文本,保持语法正确性
46
- - CodeSnippet.literals:存储从字符串值表达式中提取的所有字符串文本组成的字符串数组,确保包含所有嵌套和连接的字符串片段,包括转义字符和特殊符号
47
-
48
- "规则A"转换逻辑的详细实现规范:
49
- 1. 对于赋值表达式中形如`xxx.text = 字符串值表达式`的模式:
50
- - 非内插字符串(不以$@或$开头):在原始字符串值表达式末尾添加`.TR()`方法调用,保持原有字符串内容不变
51
- - 内插字符串(以$@或$开头):将整个字符串表达式转换为`Tr.Format(...)`格式,保持原有占位符结构和表达式逻辑
52
- 2. 对于使用`+`运算符连接的字符串表达式:
53
- - 对每个独立的字符串子表达式应用与规则1相同的转换处理,保持原有的连接结构和运算顺序
54
- 3. 其他所有不符合上述模式的情况:
55
- - CodeSnippet.convertedCode字段保持原始字符串值表达式不变
56
- - CodeSnippet.literals字段仍需准确提取所有字符串文本内容,包括转义字符和特殊符号
57
- 4. string.Format(...) 形式包含的字符串表达式, 需要特殊处理, 连带 `string.Format()` 一起捕获存入 originalCode 成员
58
- 5. 需要捕获类对象成员初始化赋值表达式中, 出现在赋值操作符`=`右侧的字符串值表达式
59
- 6. 需要能捕获 switch 语句中包含普通字符串的情况
60
- 7. 需要正确识别字符串包含各种特殊符号和转译符号组合的情况, 能正确识别这种情况下的字符串边界
61
- 8. 函数参数需要拆分, 逐个参数捕获
62
- 9. string.Format(...) 形式包含的字符串表达式, 需要特殊处理, 连带 `string.Format()` 一起捕获存入 originalCode 成员
63
-
64
-
65
-
66
- 实现过程中必须特别注意以下技术要点:
67
- - 实现精确的字符串边界识别算法,正确处理单引号和双引号字符串的开始与结束位置
68
- - 设计转义字符处理机制,妥善处理字符串中的转义字符(如\"、\'、\\等),避免错误识别字符串边界
69
- - 开发代码结构分析逻辑,正确区分字符串内的代码内容与字符串外的代码结构
70
- - 确保提取的字符串文本的准确性和完整性,包括多行字符串、复杂嵌套结构和特殊编码字符
71
- - 全面处理各种边缘情况,如空字符串、仅包含空格的字符串、包含特殊字符的字符串、零长度字符串等
72
-
1
+ 对文件进行TypeScript代码重构,重点优化字符串匹配方法设计,将原有的整句C#语句捕获逻辑精确调整为仅捕获字符串值表达式部分,通过90%的测试用例。开发过程中必须严格遵循以下规范:采用原生TypeScript开发方式,严禁使用反编译JavaScript的方法;禁止使用`git show`等需要用户手动确认的操作;所有中间生成的临时文件仅在最终结束时,以清单形式提示用户需要清理的文件列表,不得自动执行清理操作。不要使用 `<`、 `&`、`>` 等html代码中才有的符号,严格使用 typescript 语言语法, 不使用 `arguments` 等保留字段作为局部变量名。
2
+ 其中CodeSnippet类成员定义如下:
3
+
4
+ ```typescript
5
+ export class CodeSnippet {
6
+ /**
7
+ * 要替换的原始内容在代码全文中的起始位置,从0开始
8
+ */
9
+ originalIndex: number;
10
+ /**
11
+ * 从originalIndex开始长度至少30个字符的原始代码文本,如果从originalIndex开始后续全文中包含`;`符号,那么originalContext必须包含一个`;`号
12
+ */
13
+ originalContext: string;
14
+ /**
15
+ * 标记是否改变了原始代码内容,如果需要替换文件内容则为true,否则为false; 具体定义为: isChanged = originalCode!=convertedCode
16
+ */
17
+ isChanged: boolean;
18
+ /**
19
+ * 要替换的C#语句整句原始内容
20
+ */
21
+ originalCode: string;
22
+ /**
23
+ * originalCode转换后的代码
24
+ */
25
+ convertedCode: string;
26
+ /**
27
+ * 匹配出的所有字符串列表, 包括转换出来的字符串模板,同一个位置匹配出的字符串会合并到一个元素中
28
+ */
29
+ literals: string[];
30
+ /**
31
+ * 无法识别的疑似字符串列表
32
+ */
33
+ unexpects: string[];
34
+ }
35
+ ```
36
+
37
+
38
+ 代码实现需满足以下具体技术要求:
39
+ 1. 重构originalCode的解析逻辑,实现精确的字符串操作表达式定位与提取,严格排除非字符串表达式的代码部分
40
+ 2. 基于调整后的originalCode提取逻辑,同步更新convertedCode的转换逻辑和originalIndex的位置映射关系,确保代码转换的准确性和位置对应关系
41
+ 3. 完整实现CSharpStringExtractor类,该类必须包含名为`extractStrings`的公共成员方法。此方法接收C#代码字符串作为输入参数,提取其中的字符串文本转换信息,并以CodeSnippet[]数组形式返回处理结果
42
+
43
+ CodeSnippet数据结构必须严格符合以下规范:
44
+ - CodeSnippet.originalCode:存储从C#代码中提取的完整字符串值表达式文本,确保不包含多余的代码内容
45
+ - CodeSnippet.convertedCode:存储按照"规则A"转换后的字符串值表达式文本,保持语法正确性
46
+ - CodeSnippet.literals:存储从字符串值表达式中提取的所有字符串文本组成的字符串数组,确保包含所有嵌套和连接的字符串片段,包括转义字符和特殊符号
47
+
48
+ "规则A"转换逻辑的详细实现规范:
49
+ 1. 对于赋值表达式中形如`xxx.text = 字符串值表达式`的模式:
50
+ - 非内插字符串(不以$@或$开头):在原始字符串值表达式末尾添加`.TR()`方法调用,保持原有字符串内容不变
51
+ - 内插字符串(以$@或$开头):将整个字符串表达式转换为`Tr.Format(...)`格式,保持原有占位符结构和表达式逻辑
52
+ 2. 对于使用`+`运算符连接的字符串表达式:
53
+ - 对每个独立的字符串子表达式应用与规则1相同的转换处理,保持原有的连接结构和运算顺序
54
+ 3. 其他所有不符合上述模式的情况:
55
+ - CodeSnippet.convertedCode字段保持原始字符串值表达式不变
56
+ - CodeSnippet.literals字段仍需准确提取所有字符串文本内容,包括转义字符和特殊符号
57
+ 4. string.Format(...) 形式包含的字符串表达式, 需要特殊处理, 连带 `string.Format()` 一起捕获存入 originalCode 成员
58
+ 5. 需要捕获类对象成员初始化赋值表达式中, 出现在赋值操作符`=`右侧的字符串值表达式
59
+ 6. 需要能捕获 switch 语句中包含普通字符串的情况
60
+ 7. 需要正确识别字符串包含各种特殊符号和转译符号组合的情况, 能正确识别这种情况下的字符串边界
61
+ 8. 函数参数需要拆分, 逐个参数捕获
62
+ 9. string.Format(...) 形式包含的字符串表达式, 需要特殊处理, 连带 `string.Format()` 一起捕获存入 originalCode 成员
63
+
64
+
65
+
66
+ 实现过程中必须特别注意以下技术要点:
67
+ - 实现精确的字符串边界识别算法,正确处理单引号和双引号字符串的开始与结束位置
68
+ - 设计转义字符处理机制,妥善处理字符串中的转义字符(如\"、\'、\\等),避免错误识别字符串边界
69
+ - 开发代码结构分析逻辑,正确区分字符串内的代码内容与字符串外的代码结构
70
+ - 确保提取的字符串文本的准确性和完整性,包括多行字符串、复杂嵌套结构和特殊编码字符
71
+ - 全面处理各种边缘情况,如空字符串、仅包含空格的字符串、包含特殊字符的字符串、零长度字符串等
72
+
73
73
  完成实现后,需进行全面测试验证:确保代码通过90%以上的测试用例,对未通过的测试用例进行针对性分析和优化,提供详细的测试报告和优化方案。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scancscode",
3
- "version": "1.0.33",
3
+ "version": "1.0.35",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {
@@ -443,12 +443,14 @@ export class CSharpStringExtractor {
443
443
  let stringStartPos = -1;
444
444
  let inComment = false;
445
445
  let commentType = '';
446
+ let inAnonymousFunction = false;
447
+ let anonymousFunctionBraceDepth = 0;
446
448
 
447
449
  for (j = braceOpenIndex + 1; j < code.length; j++) {
448
450
  const char = code[j];
449
451
  const nextChar = j + 1 < code.length ? code[j + 1] : '';
450
452
 
451
- if (braceDepth > 1 || parenthesesDepth > 0) {
453
+ if (!inAnonymousFunction && (braceDepth > 1 || parenthesesDepth > 0)) {
452
454
  afterEqual = false;
453
455
  }
454
456
 
@@ -459,6 +461,13 @@ export class CSharpStringExtractor {
459
461
  parenthesesDepth--;
460
462
  }
461
463
 
464
+ if (!inString && !inComment && char === '=' && nextChar === '>') {
465
+ inAnonymousFunction = true;
466
+ anonymousFunctionBraceDepth = braceDepth;
467
+ j++;
468
+ continue;
469
+ }
470
+
462
471
  if (!inString && !inComment && char === '/' && nextChar === '/') {
463
472
  inComment = true;
464
473
  commentType = '//';
@@ -498,7 +507,7 @@ export class CSharpStringExtractor {
498
507
  inString = false;
499
508
  stringDelimiter = '';
500
509
 
501
- if (afterEqual && braceDepth === 1) {
510
+ if (afterEqual || inAnonymousFunction) {
502
511
  const stringLiteral = code.substring(stringStartPos, j + 1);
503
512
 
504
513
  let alreadyExists = false;
@@ -526,7 +535,7 @@ export class CSharpStringExtractor {
526
535
  continue;
527
536
  }
528
537
 
529
- if (!inString && afterEqual && braceDepth === 1 && j + 1 < code.length && char === '$') {
538
+ if (!inString && (afterEqual || inAnonymousFunction) && j + 1 < code.length && char === '$') {
530
539
  if (code[j + 1] === '"') {
531
540
  inString = true;
532
541
  stringDelimiter = '"';
@@ -540,14 +549,14 @@ export class CSharpStringExtractor {
540
549
  j += 2;
541
550
  continue;
542
551
  }
543
- } else if (!inString && afterEqual && braceDepth === 1 && j + 1 < code.length && char === '@' && code[j + 1] === '$' && j + 2 < code.length && code[j + 2] === '"') {
552
+ } else if (!inString && (afterEqual || inAnonymousFunction) && j + 1 < code.length && char === '@' && code[j + 1] === '$' && j + 2 < code.length && code[j + 2] === '"') {
544
553
  inString = true;
545
554
  stringDelimiter = '"';
546
555
  stringStartPos = j;
547
556
  j += 2;
548
557
  continue;
549
558
  } else if (!inString && (char === '"' || char === "'")) {
550
- if (afterEqual && braceDepth === 1) {
559
+ if (afterEqual || inAnonymousFunction) {
551
560
  inString = true;
552
561
  stringDelimiter = char;
553
562
  stringStartPos = j;
@@ -557,7 +566,7 @@ export class CSharpStringExtractor {
557
566
 
558
567
  if (char === '{') {
559
568
  braceDepth++;
560
- if (braceDepth > 1) {
569
+ if (!inAnonymousFunction && braceDepth > 1) {
561
570
  afterEqual = false;
562
571
  }
563
572
  continue;
@@ -568,7 +577,10 @@ export class CSharpStringExtractor {
568
577
  if (braceDepth === 0) {
569
578
  break;
570
579
  }
571
- if (braceDepth > 1 || parenthesesDepth > 0) {
580
+ if (inAnonymousFunction && braceDepth === anonymousFunctionBraceDepth) {
581
+ inAnonymousFunction = false;
582
+ }
583
+ if (!inAnonymousFunction && (braceDepth > 1 || parenthesesDepth > 0)) {
572
584
  afterEqual = false;
573
585
  }
574
586
  continue;
@@ -581,6 +593,7 @@ export class CSharpStringExtractor {
581
593
 
582
594
  if (char === ',' && braceDepth === 1) {
583
595
  afterEqual = false;
596
+ inAnonymousFunction = false;
584
597
  continue;
585
598
  }
586
599
  }
@@ -1088,12 +1101,14 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1088
1101
  let stringStartPos = -1;
1089
1102
  let inComment = false;
1090
1103
  let commentType = '';
1104
+ let inAnonymousFunction = false;
1105
+ let anonymousFunctionBraceDepth = 0;
1091
1106
 
1092
1107
  for (let i = braceOpenIndex + 1; i < fullCode.length; i++) {
1093
1108
  const char = fullCode[i];
1094
1109
  const nextChar = i + 1 < fullCode.length ? fullCode[i + 1] : '';
1095
1110
 
1096
- if (braceDepth > 1 || parenthesesDepth > 0) {
1111
+ if (!inAnonymousFunction && (braceDepth > 1 || parenthesesDepth > 0)) {
1097
1112
  afterEqual = false;
1098
1113
  }
1099
1114
 
@@ -1104,6 +1119,13 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1104
1119
  parenthesesDepth--;
1105
1120
  }
1106
1121
 
1122
+ if (!inString && !inComment && char === '=' && nextChar === '>') {
1123
+ inAnonymousFunction = true;
1124
+ anonymousFunctionBraceDepth = braceDepth;
1125
+ i++;
1126
+ continue;
1127
+ }
1128
+
1107
1129
  if (!inString && !inComment && char === '/' && nextChar === '/') {
1108
1130
  inComment = true;
1109
1131
  commentType = '//';
@@ -1143,25 +1165,35 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1143
1165
  inString = false;
1144
1166
  stringDelimiter = '';
1145
1167
 
1146
- if (afterEqual && braceDepth === 1) {
1168
+ if (afterEqual || inAnonymousFunction) {
1147
1169
  const stringLiteral = fullCode.substring(stringStartPos, i + 1);
1148
1170
 
1149
- const snippet = new CodeSnippet();
1150
- snippet.originalIndex = stringStartPos;
1151
- snippet.originalCode = stringLiteral;
1152
- snippet.originalContext = stringLiteral;
1171
+ let alreadyExists = false;
1172
+ for (const snippet of snippets) {
1173
+ if (snippet.originalIndex === stringStartPos) {
1174
+ alreadyExists = true;
1175
+ break;
1176
+ }
1177
+ }
1178
+
1179
+ if (!alreadyExists) {
1180
+ const snippet = new CodeSnippet();
1181
+ snippet.originalIndex = stringStartPos;
1182
+ snippet.originalCode = stringLiteral;
1183
+ snippet.originalContext = stringLiteral;
1153
1184
 
1154
- this.variableIndex = 0;
1185
+ this.variableIndex = 0;
1155
1186
 
1156
- this.processSingleArgument(snippet, stringLiteral, trClass, trFormatMethod, trMethod);
1187
+ this.processSingleArgument(snippet, stringLiteral, trClass, trFormatMethod, trMethod);
1157
1188
 
1158
- snippets.push(snippet);
1189
+ snippets.push(snippet);
1190
+ }
1159
1191
  }
1160
1192
  }
1161
1193
  continue;
1162
1194
  }
1163
1195
 
1164
- if (!inString && afterEqual && braceDepth === 1 && i + 1 < fullCode.length && char === '$') {
1196
+ if (!inString && (afterEqual || inAnonymousFunction) && i + 1 < fullCode.length && char === '$') {
1165
1197
  if (fullCode[i + 1] === '"') {
1166
1198
  inString = true;
1167
1199
  stringDelimiter = '"';
@@ -1175,14 +1207,14 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1175
1207
  i += 2;
1176
1208
  continue;
1177
1209
  }
1178
- } else if (!inString && afterEqual && braceDepth === 1 && i + 1 < fullCode.length && char === '@' && fullCode[i + 1] === '$' && i + 2 < fullCode.length && fullCode[i + 2] === '"') {
1210
+ } else if (!inString && (afterEqual || inAnonymousFunction) && i + 1 < fullCode.length && char === '@' && fullCode[i + 1] === '$' && i + 2 < fullCode.length && fullCode[i + 2] === '"') {
1179
1211
  inString = true;
1180
1212
  stringDelimiter = '"';
1181
1213
  stringStartPos = i;
1182
1214
  i += 2;
1183
1215
  continue;
1184
1216
  } else if (!inString && (char === '"' || char === "'")) {
1185
- if (afterEqual && braceDepth === 1) {
1217
+ if (afterEqual || inAnonymousFunction) {
1186
1218
  inString = true;
1187
1219
  stringDelimiter = char;
1188
1220
  stringStartPos = i;
@@ -1192,6 +1224,9 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1192
1224
 
1193
1225
  if (char === '{') {
1194
1226
  braceDepth++;
1227
+ if (!inAnonymousFunction && braceDepth > 1) {
1228
+ afterEqual = false;
1229
+ }
1195
1230
  continue;
1196
1231
  }
1197
1232
 
@@ -1200,7 +1235,10 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1200
1235
  if (braceDepth === 0) {
1201
1236
  break;
1202
1237
  }
1203
- if (braceDepth > 1 || parenthesesDepth > 0) {
1238
+ if (inAnonymousFunction && braceDepth === anonymousFunctionBraceDepth) {
1239
+ inAnonymousFunction = false;
1240
+ }
1241
+ if (!inAnonymousFunction && (braceDepth > 1 || parenthesesDepth > 0)) {
1204
1242
  afterEqual = false;
1205
1243
  }
1206
1244
  continue;
@@ -1213,6 +1251,7 @@ private extractCommentStrings(code: string, snippets: CodeSnippet[], trClass: st
1213
1251
 
1214
1252
  if (char === ',' && braceDepth === 1) {
1215
1253
  afterEqual = false;
1254
+ inAnonymousFunction = false;
1216
1255
  continue;
1217
1256
  }
1218
1257
  }
@@ -15,8 +15,8 @@ export class LiteralCollector {
15
15
 
16
16
  let files = glob.sync("**/*.cs", { cwd: folder });
17
17
  let testFullPath = "@";
18
- // let testFullPath = "E:/DATA/Projects/ZhiYou/ProjectFClient/GameClient/Assets/Bundles/GameConfigs/Main/UnitAttributeTable-UnitAttributeTable.cs";
19
-
18
+ // let testFullPath = "E:/DATA/Projects/ZhiYou/ProjectFClient/GameClient/Assets/Bundles/FGUI/Basics/Comp/InfoToastComp.cs";
19
+
20
20
  // 限制并行处理的文件数量,避免内存占用过高
21
21
  const batchSize = 10;
22
22
  for (let i = 0; i < files.length; i += batchSize) {
@@ -32,8 +32,7 @@ export class LiteralCollector {
32
32
  try {
33
33
  const content = await fs.promises.readFile(fullPath, "utf-8");
34
34
  const snippets = CSCodeScanner.scanFile(fullPath, content, trmethod);
35
- CSCodeScanner.filterSnippets(snippets);
36
-
35
+
37
36
  if (snippets.length > 0) {
38
37
  if (!scanonly) {
39
38
  let convertedContent = CSCodeScanner.replaceInFile(content, snippets);
@@ -42,9 +41,11 @@ export class LiteralCollector {
42
41
  }
43
42
  }
44
43
 
44
+ let filteredSnippets = [...snippets];
45
+ CSCodeScanner.filterSnippets(filteredSnippets);
45
46
  const fileLiterals: string[] = [];
46
47
  const fileUnexpects: string[] = [];
47
- for (const snippet of snippets) {
48
+ for (const snippet of filteredSnippets) {
48
49
  fileLiterals.push(...snippet.literals);
49
50
  fileUnexpects.push(...snippet.unexpects);
50
51
  }
@@ -106,7 +107,7 @@ export class LiteralCollector {
106
107
 
107
108
  let literals: string[] = [];
108
109
  let unexpects: string[] = [];
109
-
110
+
110
111
  // 并行处理代码文件夹
111
112
  const codeFolderPromises = cscodeFolders.map(async (cscodeFolder) => {
112
113
  const folderLiterals: string[] = [];
@@ -114,19 +115,19 @@ export class LiteralCollector {
114
115
  await this.scanCodeInFolder(cscodeFolder, folderLiterals, folderUnexpects, trmethod, scanonly, verbose);
115
116
  return { literals: folderLiterals, unexpects: folderUnexpects };
116
117
  });
117
-
118
+
118
119
  const codeFolderResults = await Promise.all(codeFolderPromises);
119
120
  for (const result of codeFolderResults) {
120
121
  literals.push(...result.literals);
121
122
  unexpects.push(...result.unexpects);
122
123
  }
123
-
124
+
124
125
  // 并行处理表格文件夹
125
126
  const tableFolderPromises = gameConfigFolders.map(async (gameConfigFolder) => {
126
127
  await this.scanTablesInFolder(gameConfigFolder, literals, verbose);
127
128
  });
128
129
  await Promise.all(tableFolderPromises);
129
-
130
+
130
131
  // 去重和过滤
131
132
  this.filterLiterals(literals);
132
133