Ensure only immediate member classes are only included

Update `ClassFileClassMetadata` so that member classes only include
immediate children. This aligns with the other `ClassMetadata`
implementations.

Closes gh-34869
This commit is contained in:
Phillip Webb
2025-05-08 14:20:01 -07:00
committed by Brian Clozel
parent ead80ce2f5
commit 13b09e6f3c
2 changed files with 31 additions and 10 deletions

View File

@@ -268,18 +268,16 @@ class ClassFileClassMetadata implements AnnotationMetadata {
void nestMembers(String currentClassName, InnerClassesAttribute innerClasses) {
for (InnerClassInfo classInfo : innerClasses.classes()) {
String innerClassName = classInfo.innerClass().name().stringValue();
// skip parent inner classes
if (!innerClassName.startsWith(currentClassName)) {
continue;
}
// the current class is an inner class
else if (currentClassName.equals(innerClassName)) {
if (currentClassName.equals(innerClassName)) {
// the current class is an inner class
this.innerAccessFlags = classInfo.flags();
}
// collecting data about actual inner classes
else {
this.memberClassNames.add(ClassUtils.convertResourcePathToClassName(innerClassName));
}
classInfo.outerClass().ifPresent(outerClass -> {
if (outerClass.name().stringValue().equals(currentClassName)) {
// collecting data about actual inner classes
this.memberClassNames.add(ClassUtils.convertResourcePathToClassName(innerClassName));
}
});
}
}

View File

@@ -184,6 +184,13 @@ public abstract class AbstractAnnotationMetadataTests {
TestMemberClass.TestMemberClassInnerClass.class.getName(), TestMemberClass.TestMemberClassInnerInterface.class.getName());
}
@Test
void getMemberClassNamesWhenHasNestedMemberClassesReturnsOnlyFirstLevel() {
assertThat(get(TestNestedMemberClass.class).getMemberClassNames()).containsOnly(
TestNestedMemberClass.TestMemberClassInnerClassA.class.getName(),
TestNestedMemberClass.TestMemberClassInnerClassB.class.getName());
}
@Test
void getMemberClassNamesWhenHasNoMemberClassesReturnsEmptyArray() {
assertThat(get(TestClass.class).getMemberClassNames()).isEmpty();
@@ -220,6 +227,22 @@ public abstract class AbstractAnnotationMetadataTests {
}
public static class TestNestedMemberClass {
public static class TestMemberClassInnerClassA {
public static class TestMemberClassInnerClassAA {
}
}
public static class TestMemberClassInnerClassB {
}
}
}
@Nested