Skip to content

Support Generic Assist Factory Interfaces #837

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.example.myapp.assist.generic;

public interface LordFactory<N extends NightLord> {
N create(String title);
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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> caligoFactory;
private LordFactory<Libra> libraFactory;

public NightReign(LordFactory<Caligo> caligoFactory, LordFactory<Libra> 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");
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 <methodName>(", shortName(), shortName()));
var assistNames = new ArrayList<String>();
for (var iterator = assistedElements.iterator(); iterator.hasNext(); ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand All @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Caligo> miasma;
private LordFactory<Heolstor> lord;

public Game(LordFactory<Caligo> miasma, LordFactory<Heolstor> lord) {
super();
this.miasma = miasma;
this.lord = lord;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.avaje.inject.generator.models.valid.assist.generic;

public interface LordFactory<N extends NightLord> {
N create(String title);
}
Original file line number Diff line number Diff line change
@@ -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;
}
}