From 420ce14dc3f37f6d6987a8585ce4807849acdfa1 Mon Sep 17 00:00:00 2001 From: Rawvoid Date: Wed, 4 Feb 2026 11:05:05 +0800 Subject: [PATCH] refactor(normalize-class): only remove classes with same name and identical structure --- .../jaxb/plugin/NormalizeClassPlugin.java | 43 +++++++++++-------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/plugins/src/main/java/io/github/rawvoid/jaxb/plugin/NormalizeClassPlugin.java b/plugins/src/main/java/io/github/rawvoid/jaxb/plugin/NormalizeClassPlugin.java index 999d1c9..bc703cd 100644 --- a/plugins/src/main/java/io/github/rawvoid/jaxb/plugin/NormalizeClassPlugin.java +++ b/plugins/src/main/java/io/github/rawvoid/jaxb/plugin/NormalizeClassPlugin.java @@ -49,18 +49,28 @@ public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) thro private void removeDuplicateClasses(PackageOutline packageOutline) { var classOutlines = packageOutline.getClasses(); + var classOutlinesGroup = classOutlines.stream() + .collect(Collectors.groupingBy(c -> c.implClass.name().toUpperCase())); - var groupedClasses = groupingEqualClasses(classOutlines); - for (var groupedClass : groupedClasses) { - if (groupedClass.size() <= 1) { - continue; + classOutlinesGroup.forEach((name, sameNameClasses) -> { + if (sameNameClasses.size() == 1) { + return; } - groupedClass.sort(Comparator.comparing(this::innerDepth)); - var savingClass = groupedClass.getFirst(); + var groupedClasses = groupingEqualClasses(sameNameClasses); + if (groupedClasses.size() > 1) { + return; + } + for (var groupedClass : groupedClasses) { + if (groupedClass.size() <= 1) { + continue; + } + groupedClass.sort(Comparator.comparing(this::innerDepth)); + var savingClass = groupedClass.getFirst(); - var removeClasses = groupedClass.subList(1, groupedClass.size()); - removeAndReplaceClass(removeClasses, savingClass); - } + var removeClasses = groupedClass.subList(1, groupedClass.size()); + removeAndReplaceClass(removeClasses, savingClass); + } + }); } private int innerDepth(ClassOutline classOutline) { @@ -77,15 +87,13 @@ private int innerDepth(JDefinedClass definedClass) { return depth; } - private List> groupingEqualClasses(Set classes) { + private List> groupingEqualClasses(Collection classes) { List> groupedClasses = new ArrayList<>(); - for (var classOutline : classes) { - groupedClasses.stream() - .filter(group -> isEqual(group.getFirst().implClass, classOutline.implClass)) - .findFirst() - .ifPresentOrElse(group -> group.add(classOutline), - () -> groupedClasses.add(new ArrayList<>(List.of(classOutline)))); - } + classes.forEach(classOutline -> groupedClasses.stream() + .filter(group -> isEqual(group.getFirst().implClass, classOutline.implClass)) + .findFirst() + .ifPresentOrElse(group -> group.add(classOutline), + () -> groupedClasses.add(new ArrayList<>(List.of(classOutline))))); return groupedClasses; } @@ -109,7 +117,6 @@ private boolean isEqual(JDefinedClass class1, JDefinedClass class2) { } if (class1.classes().hasNext() || class2.classes().hasNext()) { - return false; }