Skip to content
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,17 @@
package org.example.myapp.lifecycle;

import jakarta.inject.Singleton;

@Singleton
public class GreetingService extends ServiceCreator {
private String greeting;

@Override
public void setup() {
greeting = "Hello from GreetingService!";
}

public String getGreeting() {
return greeting;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.example.myapp.lifecycle;

import io.avaje.inject.PostConstruct;

public abstract class ServiceCreator {
@PostConstruct
public void setup() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.example.myapp.lifecycle;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

import io.avaje.inject.test.InjectTest;
import jakarta.inject.Inject;

@InjectTest
class HelloServiceTest {

@Inject GreetingService service;

@Test
void testGreetingMessage() {
assertEquals("Hello from GreetingService!", service.getGreeting());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.example.myapp.lifecycle;

import io.avaje.inject.Bean;
import io.avaje.inject.Factory;
import io.avaje.inject.test.TestScope;

@TestScope
@Factory
public class TestBeanFactory {
@Bean
public GreetingService greetingService() {
return new GreetingService();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package io.avaje.inject.generator;

import java.util.Objects;

import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.ElementFilter;
import javax.lang.model.util.Types;

final class AnnotationUtil {

Expand All @@ -11,13 +17,39 @@ static boolean hasAnnotationWithName(Element element, String matchShortName) {
return true;
}
}

if (element instanceof ExecutableElement) {
return annotatedSuperMethod((ExecutableElement) element, matchShortName);
}

return false;
}

/**
* Return the short name of the element.
*/
/** Return the short name of the element. */
private static String shortName(Element element) {
return element.getSimpleName().toString();
}

private static boolean annotatedSuperMethod(ExecutableElement element, Object matchShortName) {
var methodName = element.getSimpleName();
final Types types = APContext.types();
return types.directSupertypes(element.getEnclosingElement().asType()).stream()
.filter(type -> !type.toString().contains("java.lang.Object"))
.map(superType -> {
final var superClass = (TypeElement) types.asElement(superType);
for (final var method : ElementFilter.methodsIn(superClass.getEnclosedElements())) {
if (matchNameAndParams(element, method, methodName)) {
return method;
}
}
return null;
})
.filter(Objects::nonNull)
.flatMap(m -> APContext.elements().getAllAnnotationMirrors(m).stream())
.anyMatch(m -> matchShortName.equals(shortName(m.getAnnotationType().asElement())));
}

private static boolean matchNameAndParams(ExecutableElement element, ExecutableElement method, javax.lang.model.element.Name methodName) {
return method.getSimpleName().contentEquals(methodName) && method.getParameters().size() == element.getParameters().size();
}
}