Skip to content

Commit

Permalink
#175 - Interfaces with generic type parameters that extend other inte…
Browse files Browse the repository at this point in the history
…rfaces, don't PROVIDE those extended interfaces
  • Loading branch information
rbygrave committed Dec 21, 2021
1 parent def3165 commit 01583f8
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import javax.lang.model.type.TypeMirror;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
* Read the inheritance types for a given bean type.
Expand Down Expand Up @@ -152,7 +151,8 @@ private void readInterfaces(TypeElement type) {
}

private void readExtendedInterfaces(String type) {
final TypeElement element = context.element(type);
GenericType genericType = GenericType.parse(type);
final TypeElement element = context.element(genericType.topType());
if (element != null) {
readInterfaces(element);
}
Expand Down
6 changes: 6 additions & 0 deletions inject-test/src/test/java/org/example/generic/BuildTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.generic;

public interface BuildTask {

void build();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.example.generic;

public interface BuildTaskWith<T> extends BuildTask {

void prepareWith(T param);
}
20 changes: 20 additions & 0 deletions inject-test/src/test/java/org/example/generic/PathBuildTask.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.example.generic;

import jakarta.inject.Singleton;

import java.nio.file.Path;

@Singleton
public class PathBuildTask implements BuildTaskWith<Path> {

@Override
public void prepareWith(Path param) {
// do nothing
}

@Override
public void build() {
// do nothing
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.example.generic;

import io.avaje.inject.BeanScope;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class PathBuildTaskTest {

@Test
void genericInterfaceWithExtends_expect_providesExtendedInterface() {

try (BeanScope beanScope = BeanScope.newBuilder().build()) {

PathBuildTask pathBuildTask = beanScope.get(PathBuildTask.class);
BuildTask buildTask = beanScope.get(BuildTask.class);

// PathBuildTask is registered as providing PathBuildTask.class, BuildTask.class and generic TYPE_BuildTaskWithPath
assertThat(pathBuildTask).isSameAs(buildTask);

Object viaType = beanScope.get(PathBuildTask$DI.TYPE_BuildTaskWithPath, null);
assertThat(viaType).isSameAs(buildTask);
}
}
}

0 comments on commit 01583f8

Please sign in to comment.