Skip to content

Commit 74aec7b

Browse files
authored
Remove exports limitation from Module Path Detection (#720)
* remove exports limitation * Update module-info.java * Update ExternalProvider.java
1 parent cd757ec commit 74aec7b

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

inject-generator/src/main/java/io/avaje/inject/generator/ExternalProvider.java

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
import java.util.Optional;
1616
import java.util.Set;
1717
import java.util.TreeSet;
18+
import java.util.stream.Stream;
1819

19-
import javax.lang.model.element.Element;
2020
import javax.lang.model.element.ElementKind;
2121
import javax.lang.model.element.Modifier;
22+
import javax.lang.model.element.ModuleElement;
2223
import javax.lang.model.element.TypeElement;
2324
import javax.lang.model.util.ElementFilter;
2425

@@ -117,7 +118,7 @@ static void registerPluginProvidedTypes(ScopeInfo defaultScope) {
117118
if (!INJECT_AVAILABLE) {
118119
if (!pluginExists("avaje-module-dependencies.csv")) {
119120
APContext.logNote(
120-
"Unable to detect Avaje Inject in Annotation Processor ClassPath, use the Avaje Inject Maven/Gradle plugin for detecting Inject Plugins from dependencies");
121+
"Unable to detect Avaje Inject in Annotation Processor ClassPath, use the Avaje Inject Maven/Gradle plugin for detecting Inject Plugins from dependencies");
121122
}
122123
return;
123124
}
@@ -171,28 +172,38 @@ static void scanTheWorld(Collection<String> providedTypes) {
171172
if (!externalMeta.isEmpty()) {
172173
return;
173174
}
175+
var allModules =
176+
APContext.elements().getAllModuleElements().stream()
177+
.filter(m -> !m.getQualifiedName().toString().startsWith("java"))
178+
.filter(m -> !m.getQualifiedName().toString().startsWith("jdk"))
179+
// for whatever reason, compilation breaks if we don't filter out the current module
180+
.filter(m -> m != APContext.getProjectModuleElement())
181+
.collect(toList());
174182

175183
var types = APContext.types();
176184
var spi = APContext.typeElement("io.avaje.inject.spi.AvajeModule").asType();
177-
APContext.elements().getAllModuleElements().stream()
178-
.filter(m -> !m.getQualifiedName().toString().startsWith("java"))
179-
.filter(m -> !m.getQualifiedName().toString().startsWith("jdk"))
180-
// for whatever reason, compilation breaks if we don't filter out the current module
181-
.filter(m -> m != APContext.getProjectModuleElement())
182-
.flatMap(m -> m.getEnclosedElements().stream())
183-
.flatMap(p -> p.getEnclosedElements().stream())
184-
.map(TypeElement.class::cast)
185-
.filter(t -> t.getKind() == ElementKind.CLASS)
186-
.filter(t -> t.getModifiers().contains(Modifier.PUBLIC))
185+
final var checkEnclosing =
186+
allModules.stream()
187+
.flatMap(m -> m.getEnclosedElements().stream())
188+
.flatMap(p -> p.getEnclosedElements().stream())
189+
.map(TypeElement.class::cast)
190+
.filter(t -> t.getKind() == ElementKind.CLASS)
191+
.filter(t -> t.getModifiers().contains(Modifier.PUBLIC));
192+
193+
final var checkDirectives =
194+
allModules.stream()
195+
.flatMap(m -> ElementFilter.providesIn(m.getDirectives()).stream())
196+
.filter(ExternalProvider::isInjectExtension)
197+
.flatMap(p -> p.getImplementations().stream());
198+
199+
Stream.concat(checkEnclosing, checkDirectives)
187200
.filter(t -> t.getInterfaces().stream().anyMatch(i -> types.isAssignable(i, spi)))
201+
.distinct()
188202
.forEach(t -> {
189203
final var provides = new HashSet<String>();
190204
final var requires = new HashSet<String>();
191-
Optional.of(t)
192-
.map(TypeElement::getEnclosedElements)
193-
.map(ElementFilter::methodsIn)
194-
.stream()
195-
.flatMap(List::stream)
205+
206+
ElementFilter.methodsIn(t.getEnclosedElements()).stream()
196207
.map(DependencyMetaPrism::getInstanceOn)
197208
.filter(Objects::nonNull)
198209
.map(MetaData::new)
@@ -219,4 +230,8 @@ static void scanTheWorld(Collection<String> providedTypes) {
219230
APContext.logNote("No external modules detected");
220231
}
221232
}
233+
234+
private static boolean isInjectExtension(ModuleElement.ProvidesDirective p) {
235+
return "io.avaje.inject.spi.InjectExtension".equals(p.getService().getQualifiedName().toString());
236+
}
222237
}

0 commit comments

Comments
 (0)