From 040e4b2ac7e20c192450dba7d1e98b4185db6cb4 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 20 Jun 2025 22:02:17 -0400 Subject: [PATCH 1/4] generic assist --- .../io/avaje/inject/generator/AssistBeanReader.java | 5 +++++ .../io/avaje/inject/generator/SimpleAssistWriter.java | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/AssistBeanReader.java b/inject-generator/src/main/java/io/avaje/inject/generator/AssistBeanReader.java index a6a389f6d..10025a67f 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/AssistBeanReader.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/AssistBeanReader.java @@ -85,6 +85,11 @@ private void validateTarget(TypeElement t) { APContext.logError(type, "@AssistFactory targets must have only one abstract method"); } } + + if (t.getTypeParameters().size() > 1) { + APContext.logError(type, "@AssistFactory targets can't have more than one type parameter"); + } + var sb = new StringBuilder(String.format("@AssistFactory targets for type %s must have an abstract method with form '%s (", shortName(), shortName())); var assistNames = new ArrayList(); for (var iterator = assistedElements.iterator(); iterator.hasNext(); ) { diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java index 0ad57f889..5ca081f5c 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java @@ -17,7 +17,7 @@ */ final class SimpleAssistWriter { - private static final String CODE_COMMENT = "/**\n * Generated source - Factory for %s.\n */"; + private static final String CODE_COMMENT = "/**\n * Generated source - LordFactory for %s.\n */"; private static final String CODE_COMMENT_BUILD = " /**\n * Fabricates a new %s.\n */"; private final AssistBeanReader beanReader; private final String originName; @@ -96,7 +96,7 @@ private void writeClassStart() { valhallaStr = ""; } - writer.append("final %sclass ", valhallaStr).append(name).append(suffix); + writer.append("final %sclass %s%s", valhallaStr, name, suffix); writeImplementsOrExtends(); writer.append(" {").eol().eol(); } @@ -111,8 +111,11 @@ private boolean hasAssistedFieldsOrParams() { private void writeImplementsOrExtends() { TypeElement targetInterface = beanReader.targetInterface(); writer - .append(targetInterface.getKind() == ElementKind.INTERFACE ? " implements " : " extends ") - .append(Util.shortName(targetInterface.getQualifiedName().toString())); + .append(targetInterface.getKind() == ElementKind.INTERFACE ? " implements " : " extends ") + .append(Util.shortName(targetInterface.getQualifiedName().toString())); + if (!targetInterface.getTypeParameters().isEmpty()) { + writer.append("<%s>", shortName); + } } private void writeInjectFields() { From 310e093a1aa225b524a12bd7ca3567329c7be99b Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Fri, 20 Jun 2025 22:46:57 -0400 Subject: [PATCH 2/4] test --- .../myapp/assist/generic/LordFactory.java | 5 ++++ .../myapp/assist/generic/NightLord.java | 19 ++++++++++++++ .../myapp/assist/generic/NightReign.java | 26 +++++++++++++++++++ .../assist/generic/AssistGenericTest.java | 22 ++++++++++++++++ .../models/valid/assist/generic/Game.java | 17 ++++++++++++ .../valid/assist/generic/LordFactory.java | 5 ++++ .../valid/assist/generic/NightLord.java | 19 ++++++++++++++ 7 files changed, 113 insertions(+) create mode 100644 blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/LordFactory.java create mode 100644 blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightLord.java create mode 100644 blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java create mode 100644 blackbox-test-inject/src/test/java/org/example/myapp/assist/generic/AssistGenericTest.java create mode 100644 inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/Game.java create mode 100644 inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/LordFactory.java create mode 100644 inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/NightLord.java diff --git a/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/LordFactory.java b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/LordFactory.java new file mode 100644 index 000000000..56488a5d4 --- /dev/null +++ b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/LordFactory.java @@ -0,0 +1,5 @@ +package org.example.myapp.assist.generic; + +public interface LordFactory { + N create(String title); +} diff --git a/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightLord.java b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightLord.java new file mode 100644 index 000000000..6cb295f6d --- /dev/null +++ b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightLord.java @@ -0,0 +1,19 @@ +package org.example.myapp.assist.generic; + +import io.avaje.inject.AssistFactory; +import io.avaje.inject.Assisted; + +public interface NightLord { + + @AssistFactory(LordFactory.class) + public static class Caligo implements NightLord { + + @Assisted String title; + } + + @AssistFactory(LordFactory.class) + public static class Libra implements NightLord { + + @Assisted String title; + } +} diff --git a/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java new file mode 100644 index 000000000..cc3115154 --- /dev/null +++ b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java @@ -0,0 +1,26 @@ +package org.example.myapp.assist.generic; + +import org.example.myapp.assist.generic.NightLord.Caligo; +import org.example.myapp.assist.generic.NightLord.Libra; + +import jakarta.inject.Singleton; + +@Singleton +public class NightReign { + + private LordFactory caligo; + private LordFactory creature; + + public NightReign(LordFactory caligo, LordFactory creature) { + this.caligo = caligo; + this.creature = creature; + } + + public Caligo caligo() { + return caligo.create("Miasma of Night"); + } + + public Libra libra() { + return creature.create("Creature of Night"); + } +} diff --git a/blackbox-test-inject/src/test/java/org/example/myapp/assist/generic/AssistGenericTest.java b/blackbox-test-inject/src/test/java/org/example/myapp/assist/generic/AssistGenericTest.java new file mode 100644 index 000000000..b2e475a30 --- /dev/null +++ b/blackbox-test-inject/src/test/java/org/example/myapp/assist/generic/AssistGenericTest.java @@ -0,0 +1,22 @@ +package org.example.myapp.assist.generic; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.example.myapp.assist.generic.NightLord.Caligo; +import org.example.myapp.assist.generic.NightLord.Libra; +import org.junit.jupiter.api.Test; + +import io.avaje.inject.test.InjectTest; +import jakarta.inject.Inject; + +@InjectTest +class AssistGenericTest { + + @Inject NightReign nightReign; + + @Test + void test() { + assertThat(nightReign.caligo()).isInstanceOf(Caligo.class); + assertThat(nightReign.libra()).isInstanceOf(Libra.class); + } +} diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/Game.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/Game.java new file mode 100644 index 000000000..992f94208 --- /dev/null +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/Game.java @@ -0,0 +1,17 @@ +package io.avaje.inject.generator.models.valid.assist.generic; + +import io.avaje.inject.generator.models.valid.assist.generic.NightLord.Caligo; +import io.avaje.inject.generator.models.valid.assist.generic.NightLord.Heolstor; +import jakarta.inject.Singleton; + +@Singleton +public class Game { + private LordFactory miasma; + private LordFactory lord; + + public Game(LordFactory miasma, LordFactory lord) { + super(); + this.miasma = miasma; + this.lord = lord; + } +} diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/LordFactory.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/LordFactory.java new file mode 100644 index 000000000..0edb03ee0 --- /dev/null +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/LordFactory.java @@ -0,0 +1,5 @@ +package io.avaje.inject.generator.models.valid.assist.generic; + +public interface LordFactory { + N create(String title); +} diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/NightLord.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/NightLord.java new file mode 100644 index 000000000..c61918273 --- /dev/null +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/assist/generic/NightLord.java @@ -0,0 +1,19 @@ +package io.avaje.inject.generator.models.valid.assist.generic; + +import io.avaje.inject.AssistFactory; +import io.avaje.inject.Assisted; + +public interface NightLord { + + @AssistFactory(LordFactory.class) + public static class Caligo implements NightLord { + + @Assisted String title; + } + + @AssistFactory(LordFactory.class) + public static class Heolstor implements NightLord { + + @Assisted String title; + } +} From 327957f34804c3bc7e054608382b9974539b1fd3 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Sat, 21 Jun 2025 02:50:50 -0400 Subject: [PATCH 3/4] Update NightReign.java --- .../example/myapp/assist/generic/NightReign.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java index cc3115154..9752d5b1f 100644 --- a/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java +++ b/blackbox-test-inject/src/main/java/org/example/myapp/assist/generic/NightReign.java @@ -8,19 +8,19 @@ @Singleton public class NightReign { - private LordFactory caligo; - private LordFactory creature; + private LordFactory caligoFactory; + private LordFactory libraFactory; - public NightReign(LordFactory caligo, LordFactory creature) { - this.caligo = caligo; - this.creature = creature; + public NightReign(LordFactory caligoFactory, LordFactory libraFactory) { + this.caligoFactory = caligoFactory; + this.libraFactory = libraFactory; } public Caligo caligo() { - return caligo.create("Miasma of Night"); + return caligoFactory.create("Miasma of Night"); } public Libra libra() { - return creature.create("Creature of Night"); + return libraFactory.create("Creature of Night"); } } From e81a97355fc93a16be72d21fd8ca6b58b6c25988 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Sun, 22 Jun 2025 12:25:52 +1200 Subject: [PATCH 4/4] Format and removing using Factory in generated comment --- .../java/io/avaje/inject/generator/SimpleAssistWriter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java index 5ca081f5c..caa741267 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/SimpleAssistWriter.java @@ -17,7 +17,7 @@ */ final class SimpleAssistWriter { - private static final String CODE_COMMENT = "/**\n * Generated source - LordFactory for %s.\n */"; + private static final String CODE_COMMENT = "/**\n * Generated source - Factory for %s.\n */"; private static final String CODE_COMMENT_BUILD = " /**\n * Fabricates a new %s.\n */"; private final AssistBeanReader beanReader; private final String originName; @@ -111,8 +111,8 @@ private boolean hasAssistedFieldsOrParams() { private void writeImplementsOrExtends() { TypeElement targetInterface = beanReader.targetInterface(); writer - .append(targetInterface.getKind() == ElementKind.INTERFACE ? " implements " : " extends ") - .append(Util.shortName(targetInterface.getQualifiedName().toString())); + .append(targetInterface.getKind() == ElementKind.INTERFACE ? " implements " : " extends ") + .append(Util.shortName(targetInterface.getQualifiedName().toString())); if (!targetInterface.getTypeParameters().isEmpty()) { writer.append("<%s>", shortName); }