diff --git a/src/main/java/com/codechecker/cache/report/ReportBuilder.java b/src/main/java/com/codechecker/cache/report/ReportBuilder.java index 1dc21c7..c8e1610 100644 --- a/src/main/java/com/codechecker/cache/report/ReportBuilder.java +++ b/src/main/java/com/codechecker/cache/report/ReportBuilder.java @@ -1,5 +1,6 @@ package com.codechecker.cache.report; +import com.codechecker.cache.diff.ChangeType; import com.codechecker.cache.diff.SchemaChange; import com.codechecker.cache.diff.Severity; @@ -14,7 +15,7 @@ import java.util.Set; /** * 将 {@link CheckReport} 渲染为企微 Markdown / 控制台文本。 * */ final class SkeletonAnnotator { - /** 企微橙:删除 / 类型变更 / 旧侧变更 */ + /** 企微橙:删除 / 路径迁移旧侧 */ static final String COLOR_REMOVE = "warning"; /** 企微绿:新增 / 新侧路径迁移 */ static final String COLOR_ADD = "info"; + /** 企微灰:类型变更(修改类) */ + static final String COLOR_TYPE = "comment"; private static final String FONT_CLOSE = ""; private SkeletonAnnotator() { } - /** 旧骨架应橙色标注的路径:删除、路径迁移旧侧、类型变更。 */ + /** 旧骨架应橙色标注的路径:删除、路径迁移旧侧(不含类型变更)。 */ static Set pathsForOldSkeleton(List details) { Set paths = new LinkedHashSet<>(); if (details == null) { @@ -40,8 +42,7 @@ final class SkeletonAnnotator { if (c == null || c.getChangeType() == null) { continue; } - if (c.getChangeType() == ChangeType.FIELD_REMOVED - || c.getChangeType() == ChangeType.TYPE_CHANGED) { + if (c.getChangeType() == ChangeType.FIELD_REMOVED) { addIfPresent(paths, c.getFieldPath()); } else if (c.getChangeType() == ChangeType.FIELD_PATH_MOVED) { addIfPresent(paths, c.getOldValue()); @@ -73,7 +74,7 @@ final class SkeletonAnnotator { return paths; } - /** 新骨架应橙色标注的路径:类型变更(与旧侧同色,便于识别)。 */ + /** 类型变更路径:新旧骨架均用灰色标注。 */ static Set pathsForTypeChanged(List details) { Set paths = new LinkedHashSet<>(); if (details == null) { @@ -88,30 +89,35 @@ final class SkeletonAnnotator { } /** - * 标注旧骨架改动字段(删除 / 类型变更 → 橙色)。 + * 标注旧骨架:删除等橙色;类型变更灰色。 */ - static String annotateOldForWecom(String json, Set highlightPaths) { - return annotateForWecom(json, highlightPaths, COLOR_REMOVE); + static String annotateOldForWecom(String json, Set orangePaths) { + return annotateOldForWecom(json, orangePaths, null); + } + + static String annotateOldForWecom(String json, Set orangePaths, Set grayPaths) { + String result = annotateForWecom(json, grayPaths, COLOR_TYPE); + return annotateForWecom(result, orangePaths, COLOR_REMOVE); } /** - * 标注新骨架:类型变更先着橙色,其余新增着绿色。 + * 标注新骨架:类型变更灰色,新增绿色。 */ static String annotateNewForWecom(String json, Set greenPaths) { return annotateNewForWecom(json, greenPaths, null); } /** - * 标注新骨架改动字段(类型变更 → 橙色;新增 / 迁移新侧 → 绿色)。 + * 标注新骨架改动字段(类型变更 → 灰色;新增 / 迁移新侧 → 绿色)。 */ - static String annotateNewForWecom(String json, Set greenPaths, Set orangePaths) { - String result = annotateForWecom(json, orangePaths, COLOR_REMOVE); + static String annotateNewForWecom(String json, Set greenPaths, Set grayTypePaths) { + String result = annotateForWecom(json, grayTypePaths, COLOR_TYPE); return annotateForWecom(result, greenPaths, COLOR_ADD); } /** * 仅标注改动字段:其余正文保持普通文本。 - * 改动片段格式:{@code "field":value} + * 改动片段格式:{@code "field":value} */ static String annotateForWecom(String json, Set highlightPaths) { return annotateForWecom(json, highlightPaths, COLOR_REMOVE); diff --git a/src/test/java/com/codechecker/cache/report/ReportBuilderTest.java b/src/test/java/com/codechecker/cache/report/ReportBuilderTest.java index 35b8a1c..107c4ca 100644 --- a/src/test/java/com/codechecker/cache/report/ReportBuilderTest.java +++ b/src/test/java/com/codechecker/cache/report/ReportBuilderTest.java @@ -112,7 +112,7 @@ class ReportBuilderTest { } @Test - void typeChangedHighlightedOrangeInBothSkeletons() { + void typeChangedHighlightedGrayInBothSkeletons() { SchemaChange typeChanged = new SchemaChange(ChangeType.TYPE_CHANGED); typeChanged.setFieldPath("amount"); typeChanged.setOldValue("BigDecimal/NUMBER"); @@ -125,20 +125,22 @@ class ReportBuilderTest { Set oldPaths = SkeletonAnnotator.pathsForOldSkeleton(details); Set newGreen = SkeletonAnnotator.pathsForNewSkeleton(details); - Set newOrange = SkeletonAnnotator.pathsForTypeChanged(details); + Set typeGray = SkeletonAnnotator.pathsForTypeChanged(details); - assertEquals(Collections.singleton("amount"), oldPaths); + assertTrue(oldPaths.isEmpty()); assertTrue(newGreen.isEmpty()); - assertEquals(Collections.singleton("amount"), newOrange); + assertEquals(Collections.singleton("amount"), typeGray); - String oldMd = SkeletonAnnotator.annotateOldForWecom(oldJson, oldPaths); - String newMd = SkeletonAnnotator.annotateNewForWecom(newJson, newGreen, newOrange); + String oldMd = SkeletonAnnotator.annotateOldForWecom(oldJson, oldPaths, typeGray); + String newMd = SkeletonAnnotator.annotateNewForWecom(newJson, newGreen, typeGray); - assertTrue(oldMd.contains("\"amount\":0")); - assertFalse(oldMd.contains("\"name\":\"\"")); - assertTrue(newMd.contains("\"amount\":\"\"")); + assertTrue(oldMd.contains("\"amount\":0")); + assertFalse(oldMd.contains("\"amount\"")); + assertFalse(oldMd.contains("\"name\":\"\"")); + assertTrue(newMd.contains("\"amount\":\"\"")); assertFalse(newMd.contains("\"amount\"")); - assertFalse(newMd.contains("\"name\":\"\"")); + assertFalse(newMd.contains("\"amount\"")); + assertFalse(newMd.contains("\"name\":\"\"")); CheckReport report = baseReport(); KeyStructureChange key = new KeyStructureChange(); @@ -157,9 +159,12 @@ class ReportBuilderTest { assertTrue(newSection > oldSection); String oldPart = md.substring(oldSection, newSection); String newPart = md.substring(newSection); - assertTrue(oldPart.contains("\"amount\":0")); - assertTrue(newPart.contains("\"amount\":\"\"")); + assertTrue(oldPart.contains("\"amount\":0")); + assertTrue(newPart.contains("\"amount\":\"\"")); assertFalse(newPart.contains("\"amount\"")); + assertFalse(oldPart.contains("\"amount\"")); + assertTrue(md.contains("> **类型变更**: amount BigDecimal → String"), + "应包含类型变更摘要行,实际 markdown:\n" + md); } @Test