From f16bfaede2033894f3a527e1f2ab1fa21ba9447d Mon Sep 17 00:00:00 2001 From: Vincent Polfliet Date: Sun, 8 Jun 2025 17:33:05 +0200 Subject: [PATCH] fix: handle nested java types like Flow.Publisher in Util.shortName --- .../java/io/avaje/inject/generator/Util.java | 34 +++++++++---------- .../io/avaje/inject/generator/UtilTest.java | 8 +++++ .../models/valid/generic/GenericImpl.java | 12 +++++++ .../valid/generic/GenericInterfaceObject.java | 5 +++ 4 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericImpl.java create mode 100644 inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericInterfaceObject.java diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/Util.java b/inject-generator/src/main/java/io/avaje/inject/generator/Util.java index fc6f47cbf..1221ee56b 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/Util.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/Util.java @@ -141,26 +141,26 @@ static String shortName(String fullType) { final int p = fullType.lastIndexOf('.'); if (p == -1) { return fullType; - } else if (fullType.startsWith("java")) { - return fullType.substring(p + 1); - } else { - var result = ""; - var foundClass = false; - for (final String part : fullType.split("\\.")) { - char firstChar = part.charAt(0); - if (foundClass - || Character.isUpperCase(firstChar) - || !Character.isAlphabetic(firstChar) && Character.isJavaIdentifierStart(firstChar)) { - foundClass = true; - result += (result.isEmpty() ? "" : ".") + part; - } + } + + String[] parts = fullType.split("\\."); + StringBuilder result = new StringBuilder(); + boolean foundClass = false; + + for (String part : parts) { + char firstChar = part.charAt(0); + if (!foundClass && Character.isUpperCase(firstChar)) { + foundClass = true; } - // when in doubt, do the basic thing - if (result.isBlank()) { - return fullType.substring(p + 1); + if (foundClass) { + if (result.length() > 0) { + result.append("."); + } + result.append(part); } - return result; } + + return result.length() > 0 ? result.toString() : fullType.substring(p + 1); } static String shortName(UType uType) { diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/UtilTest.java b/inject-generator/src/test/java/io/avaje/inject/generator/UtilTest.java index 61cf8683f..5f826b6c4 100644 --- a/inject-generator/src/test/java/io/avaje/inject/generator/UtilTest.java +++ b/inject-generator/src/test/java/io/avaje/inject/generator/UtilTest.java @@ -144,4 +144,12 @@ void sanitizeImports() { assertEquals("my.Foo", Util.sanitizeImports("@org.bar.annotationMcgee my.Foo")); assertEquals("java.util.String", Util.sanitizeImports("java.util.String>")); } + + @Test + void testShortName_nestedTypes() { + assertEquals("Flow.Publisher", Util.shortName("java.util.concurrent.Flow.Publisher")); + assertEquals("Outer.Inner", Util.shortName("com.foo.Outer.Inner")); + assertEquals("Only", Util.shortName("a.b.c.Only")); + assertEquals("simple", Util.shortName("simple")); + } } diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericImpl.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericImpl.java new file mode 100644 index 000000000..e4e2db502 --- /dev/null +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericImpl.java @@ -0,0 +1,12 @@ +package io.avaje.inject.generator.models.valid.generic; + +import jakarta.inject.Singleton; +import java.util.concurrent.Flow; +import java.util.concurrent.SubmissionPublisher; + +@Singleton +public class GenericImpl implements GenericInterfaceObject> { + public Flow.Publisher get() { + return new SubmissionPublisher(); + } +} diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericInterfaceObject.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericInterfaceObject.java new file mode 100644 index 000000000..523b1b8cf --- /dev/null +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/generic/GenericInterfaceObject.java @@ -0,0 +1,5 @@ +package io.avaje.inject.generator.models.valid.generic; + +public interface GenericInterfaceObject { + T get(); +}