Commit 3078fe33907ce889747270ee82757a38cdb0d65f

Authored by YunaiV
1 parent 1287ce90

refactor(codegen):精简 CodegenBuilder.sanitizeComment 引号替换实现并补充单测

yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java
@@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.infra.enums.codegen.CodegenColumnListConditionEnu
12 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum; 12 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
13 import com.baomidou.mybatisplus.generator.config.po.TableField; 13 import com.baomidou.mybatisplus.generator.config.po.TableField;
14 import com.baomidou.mybatisplus.generator.config.po.TableInfo; 14 import com.baomidou.mybatisplus.generator.config.po.TableInfo;
  15 +import com.google.common.annotations.VisibleForTesting;
15 import com.google.common.collect.Sets; 16 import com.google.common.collect.Sets;
16 import org.springframework.stereotype.Component; 17 import org.springframework.stereotype.Component;
17 18
@@ -117,10 +118,8 @@ public class CodegenBuilder { @@ -117,10 +118,8 @@ public class CodegenBuilder {
117 table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); 118 table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase());
118 // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 119 // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名
119 table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); 120 table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false))));
120 - // 处理表注释中的特殊字符,避免生成的代码编译错误(先转义,再去掉"表"字)  
121 - String tableComment = sanitizeColumnComment(table.getTableComment());  
122 - // 去除结尾的表,作为类描述  
123 - table.setClassComment(StrUtil.removeSuffixIgnoreCase(tableComment, "表")); 121 + // 去除结尾的表,作为类描述;注释中的英文引号替换为中文引号,避免破坏生成代码中的字符串字面量
  122 + table.setClassComment(StrUtil.removeSuffixIgnoreCase(sanitizeComment(table.getTableComment()), "表"));
124 table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()); 123 table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType());
125 } 124 }
126 125
@@ -130,8 +129,7 @@ public class CodegenBuilder { @@ -130,8 +129,7 @@ public class CodegenBuilder {
130 for (CodegenColumnDO column : columns) { 129 for (CodegenColumnDO column : columns) {
131 column.setTableId(tableId); 130 column.setTableId(tableId);
132 column.setOrdinalPosition(index++); 131 column.setOrdinalPosition(index++);
133 - // 处理字段注释中的特殊字符,避免生成的代码编译错误  
134 - column.setColumnComment(sanitizeColumnComment(column.getColumnComment())); 132 + column.setColumnComment(sanitizeComment(column.getColumnComment()));
135 // 特殊处理:Byte => Integer 133 // 特殊处理:Byte => Integer
136 if (Byte.class.getSimpleName().equals(column.getJavaType())) { 134 if (Byte.class.getSimpleName().equals(column.getJavaType())) {
137 column.setJavaType(Integer.class.getSimpleName()); 135 column.setJavaType(Integer.class.getSimpleName());
@@ -220,18 +218,19 @@ public class CodegenBuilder { @@ -220,18 +218,19 @@ public class CodegenBuilder {
220 column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"})); 218 column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"}));
221 } 219 }
222 } 220 }
223 - 221 +
224 /** 222 /**
225 - * 清理字段注释中的特殊字符  
226 - * 将英文引号替换为中文引号,避免生成的代码出现语法错误 223 + * 将注释中的英文引号替换为中文引号,避免破坏生成代码中的字符串字面量
227 * 224 *
228 - * @param comment 原始字段注释  
229 - * @return 清理后的字段注释 225 + * @param comment 原始注释
  226 + * @return 清理后的注释
230 */ 227 */
231 - private String sanitizeColumnComment(String comment) { 228 + @VisibleForTesting
  229 + String sanitizeComment(String comment) {
232 if (StrUtil.isEmpty(comment)) { 230 if (StrUtil.isEmpty(comment)) {
233 return comment; 231 return comment;
234 } 232 }
235 - return comment.replace("\"", "\u201c").replace("\"", "\u201d").replace("'", "\u2018").replace("'", "\u2019"); 233 + return comment.replace('"', '“').replace('\'', '‘');
236 } 234 }
  235 +
237 } 236 }
yudao-module-infra/src/test/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilderTest.java
@@ -84,4 +84,19 @@ public class CodegenBuilderTest extends BaseMockitoUnitTest { @@ -84,4 +84,19 @@ public class CodegenBuilderTest extends BaseMockitoUnitTest {
84 assertEquals("input", column.getHtmlType()); 84 assertEquals("input", column.getHtmlType());
85 } 85 }
86 86
  87 + @Test
  88 + public void testSanitizeComment() {
  89 + // 1. null / 空字符串:原样返回
  90 + assertNull(codegenBuilder.sanitizeComment(null));
  91 + assertEquals("", codegenBuilder.sanitizeComment(""));
  92 + // 2. 无英文引号:原样返回
  93 + assertEquals("无引号注释", codegenBuilder.sanitizeComment("无引号注释"));
  94 + // 3. 含英文双引号:替换为中文左双引号
  95 + assertEquals("含“双“引号", codegenBuilder.sanitizeComment("含\"双\"引号"));
  96 + // 4. 含英文单引号:替换为中文左单引号
  97 + assertEquals("含‘单‘引号", codegenBuilder.sanitizeComment("含'单'引号"));
  98 + // 5. 双 / 单引号混合
  99 + assertEquals("“混‘搭“‘", codegenBuilder.sanitizeComment("\"混'搭\"'"));
  100 + }
  101 +
87 } 102 }