15
15
import java .util .Optional ;
16
16
import java .util .Set ;
17
17
import java .util .TreeSet ;
18
+ import java .util .stream .Stream ;
18
19
19
- import javax .lang .model .element .Element ;
20
20
import javax .lang .model .element .ElementKind ;
21
21
import javax .lang .model .element .Modifier ;
22
+ import javax .lang .model .element .ModuleElement ;
22
23
import javax .lang .model .element .TypeElement ;
23
24
import javax .lang .model .util .ElementFilter ;
24
25
@@ -117,7 +118,7 @@ static void registerPluginProvidedTypes(ScopeInfo defaultScope) {
117
118
if (!INJECT_AVAILABLE ) {
118
119
if (!pluginExists ("avaje-module-dependencies.csv" )) {
119
120
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" );
121
122
}
122
123
return ;
123
124
}
@@ -171,28 +172,38 @@ static void scanTheWorld(Collection<String> providedTypes) {
171
172
if (!externalMeta .isEmpty ()) {
172
173
return ;
173
174
}
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 ());
174
182
175
183
var types = APContext .types ();
176
184
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 )
187
200
.filter (t -> t .getInterfaces ().stream ().anyMatch (i -> types .isAssignable (i , spi )))
201
+ .distinct ()
188
202
.forEach (t -> {
189
203
final var provides = new HashSet <String >();
190
204
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 ()
196
207
.map (DependencyMetaPrism ::getInstanceOn )
197
208
.filter (Objects ::nonNull )
198
209
.map (MetaData ::new )
@@ -219,4 +230,8 @@ static void scanTheWorld(Collection<String> providedTypes) {
219
230
APContext .logNote ("No external modules detected" );
220
231
}
221
232
}
233
+
234
+ private static boolean isInjectExtension (ModuleElement .ProvidesDirective p ) {
235
+ return "io.avaje.inject.spi.InjectExtension" .equals (p .getService ().getQualifiedName ().toString ());
236
+ }
222
237
}
0 commit comments