Skip to content

Commit 43be24b

Browse files
authored
fix(jdk-codemodel): resolve module when building TypeName in visitDeclared (#53)
1 parent d806aad commit 43be24b

3 files changed

Lines changed: 36 additions & 4 deletions

File tree

jdk-codemodel/src/main/java/build/codemodel/jdk/JdkInitializer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -889,8 +889,7 @@ public Lazy<TypeUsage> visitArray(final ArrayType t, final Lazy<TypeUsage> lazy)
889889
@Override
890890
public Lazy<TypeUsage> visitDeclared(final DeclaredType t, final Lazy<TypeUsage> lazy) {
891891
final var typeElement = (TypeElement) t.asElement();
892-
final var fqn = typeElement.getQualifiedName().toString();
893-
final var typeName = nameProvider.getTypeName(Optional.empty(), fqn);
892+
final var typeName = resolveTypeName(typeElement);
894893

895894
if (typeElement.getTypeParameters().isEmpty()) {
896895
final var usage = SpecificTypeUsage.of(codeModel, typeName);

jdk-codemodel/src/test/java/build/codemodel/jdk/FieldDiscoveryTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ public class Discover {
4040
assertThat(typeDescriptor.traits(MethodDescriptor.class)).isEmpty();
4141
assertThat(typeDescriptor.traits(FieldDescriptor.class)).hasSize(4);
4242

43-
// All fields are String
44-
final var stringTypeName = naming.getTypeName(Optional.empty(), "java.lang.String");
43+
// All fields are String — type names are resolved with their JPMS module
44+
final var javaBase = naming.getModuleName("java.base");
45+
final var stringTypeName = naming.getTypeName(javaBase, "java.lang.String");
4546
assertThat(typeDescriptor.traits(FieldDescriptor.class)
4647
.map(FieldDescriptor::type)
4748
.filter(NamedTypeUsage.class::isInstance)

jdk-codemodel/src/test/java/build/codemodel/jdk/GenericsDiscoveryTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,38 @@ public class Discoverable<T extends Number & Comparable<T>> {
172172
assertThat(boundNames).anyMatch(name -> name.contains("Comparable"));
173173
}
174174

175+
@Test
176+
void genericTypeNameShouldIncludeModule() {
177+
// Regression: visitDeclared was constructing TypeNames with Optional.empty() module,
178+
// causing generic raw types to not match descriptors registered with a JPMS module.
179+
final var source = JavaFileObjects.forSourceString("build.codemodel.jdk.example.Wrapper", """
180+
package build.codemodel.jdk.example;
181+
import java.util.List;
182+
public class Wrapper {
183+
public List<String> items;
184+
}
185+
""");
186+
final var codeModel = JdkInitializerTests.runInternal(
187+
new JdkInitializer(List.of(), List.of(), List.of(source)));
188+
189+
final var naming = codeModel.getNameProvider();
190+
final var typeName = naming.getTypeName(Optional.empty(), "build.codemodel.jdk.example.Wrapper");
191+
final var field = codeModel.getTypeDescriptor(typeName).orElseThrow()
192+
.traits(FieldDescriptor.class).findFirst().orElseThrow();
193+
194+
final var generic = (GenericTypeUsage) field.type();
195+
196+
// The raw type must carry the java.base module
197+
final var javaBase = naming.getModuleName("java.base");
198+
final var expectedListName = naming.getTypeName(javaBase, "java.util.List");
199+
assertThat(generic.typeName()).isEqualTo(expectedListName);
200+
201+
// The type argument (String) must also carry java.base
202+
final var stringArg = (NamedTypeUsage) generic.parameters().findFirst().orElseThrow();
203+
final var expectedStringName = naming.getTypeName(javaBase, "java.lang.String");
204+
assertThat(stringArg.typeName()).isEqualTo(expectedStringName);
205+
}
206+
175207
@Test
176208
void shouldDiscoverGenericMethodTypeParameter() {
177209
final var source = JavaFileObjects.forSourceString("Discoverable", """

0 commit comments

Comments
 (0)