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..9752d5b1f --- /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 caligoFactory; + private LordFactory libraFactory; + + public NightReign(LordFactory caligoFactory, LordFactory libraFactory) { + this.caligoFactory = caligoFactory; + this.libraFactory = libraFactory; + } + + public Caligo caligo() { + return caligoFactory.create("Miasma of Night"); + } + + public Libra libra() { + return libraFactory.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/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..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 @@ -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(); } @@ -113,6 +113,9 @@ private void writeImplementsOrExtends() { writer .append(targetInterface.getKind() == ElementKind.INTERFACE ? " implements " : " extends ") .append(Util.shortName(targetInterface.getQualifiedName().toString())); + if (!targetInterface.getTypeParameters().isEmpty()) { + writer.append("<%s>", shortName); + } } private void writeInjectFields() { 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; + } +}