Skip to content

Commit 245f8dc

Browse files
committed
#93 - Improve warning logged for missing dependencies
1 parent 28fe259 commit 245f8dc

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

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

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
package io.avaje.inject.generator;
22

3-
import java.util.ArrayList;
4-
import java.util.Collection;
5-
import java.util.HashMap;
6-
import java.util.Iterator;
7-
import java.util.List;
8-
import java.util.Map;
9-
import java.util.Set;
10-
import java.util.TreeSet;
3+
import java.util.*;
114

125
class MetaDataOrdering {
136

@@ -30,7 +23,8 @@ class MetaDataOrdering {
3023

3124
private final List<DependencyLink> circularDependencies = new ArrayList<>();
3225

33-
private final List<String> missingDependencies = new ArrayList<>();
26+
private final Set<String> missingDependencyTypes = new LinkedHashSet<>();
27+
private final List<String> missingDependencyMsg = new ArrayList<>();
3428

3529
private String topPackage;
3630

@@ -66,7 +60,6 @@ int processQueue() {
6660
int remaining = queue.size();
6761
if (remaining != 0) {
6862
missingDependencies();
69-
detectCircularDependency(queue);
7063
orderedList.addAll(queue);
7164
}
7265
return remaining;
@@ -77,17 +70,22 @@ int processQueue() {
7770
* in the queue with unsatisfied dependencies.
7871
*/
7972
private void detectCircularDependency(List<MetaData> remainder) {
73+
final List<DependencyLink> dependencyLinks = new ArrayList<>();
8074
for (MetaData metaData : remainder) {
8175
final List<String> dependsOn = metaData.getDependsOn();
8276
if (dependsOn != null) {
8377
for (String dependency : dependsOn) {
8478
final MetaData provider = findCircularDependency(remainder, dependency);
8579
if (provider != null) {
86-
circularDependencies.add(new DependencyLink(metaData, provider, dependency));
80+
dependencyLinks.add(new DependencyLink(metaData, provider, dependency));
8781
}
8882
}
8983
}
9084
}
85+
if (dependencyLinks.size() > 1) {
86+
// need minimum of 2 to form circular dependency
87+
circularDependencies.addAll(dependencyLinks);
88+
}
9189
}
9290

9391
private MetaData findCircularDependency(List<MetaData> remainder, String dependency) {
@@ -106,14 +104,10 @@ private MetaData findCircularDependency(List<MetaData> remainder, String depende
106104
/**
107105
* Log a reasonable compile error for detected circular dependencies.
108106
*/
109-
void errorOnCircularDependencies() {
110-
if (!missingDependencies.isEmpty()) {
111-
context.logError("Unsatisfied dependencies %s %s", missingDependencies, UNSAT_ERR_MSG);
112-
} else {
113-
context.logError("Circular dependencies detected with beans %s %s", circularDependencies, CIRC_ERR_MSG);
114-
for (DependencyLink link : circularDependencies) {
115-
context.logError("Circular dependency - %s dependsOn %s for %s", link.metaData, link.provider, link.dependency);
116-
}
107+
private void errorOnCircularDependencies() {
108+
context.logError("Circular dependencies detected with beans %s %s", circularDependencies, CIRC_ERR_MSG);
109+
for (DependencyLink link : circularDependencies) {
110+
context.logError("Circular dependency - %s dependsOn %s for %s", link.metaData, link.provider, link.dependency);
117111
}
118112
}
119113

@@ -124,19 +118,39 @@ void missingDependencies() {
124118
for (MetaData m : queue) {
125119
for (String dependency : m.getDependsOn()) {
126120
if (providers.get(dependency) == null) {
127-
missingDependencies.add(dependency + " dependency missing for " + m);
121+
missingDependencyTypes.add(dependency);
122+
missingDependencyMsg.add(dependency + " dependency missing for " + m);
128123
}
129124
}
130125
}
126+
if (missingDependencyTypes.isEmpty()) {
127+
// only look for circular dependencies if there are no missing dependencies
128+
detectCircularDependency(queue);
129+
}
131130
}
132131

133132
/**
134-
* Log a warning on unsatisfied dependencies that are expected to be
135-
* provided by another module.
133+
* Log a warning on unsatisfied dependencies that are expected to be provided by another module.
136134
*/
137-
void warnOnDependencies() {
138-
for (MetaData m : queue) {
139-
context.logWarn("Unsatisfied dependencies on %s dependsOn %s", m, m.getDependsOn());
135+
private void warnOnDependencies() {
136+
if (missingDependencyTypes.isEmpty()) {
137+
context.logWarn("There are " + queue.size() + " beans with unsatisfied dependencies (assuming external dependencies)");
138+
for (MetaData m : queue) {
139+
context.logWarn("Unsatisfied dependencies on %s dependsOn %s", m, m.getDependsOn());
140+
}
141+
} else {
142+
context.logWarn("Dependencies %s are not provided - missing @Singleton (or external dependencies)", missingDependencyTypes);
143+
for (String msg : missingDependencyMsg) {
144+
context.logWarn(msg);
145+
}
146+
}
147+
}
148+
149+
void logWarnings() {
150+
if (hasCircularDependencies()) {
151+
errorOnCircularDependencies();
152+
} else {
153+
warnOnDependencies();
140154
}
141155
}
142156

@@ -198,7 +212,6 @@ Set<String> getImportTypes() {
198212
* Return the MetaData for the bean that provides the (generic interface) dependency.
199213
*/
200214
MetaData findProviderOf(String depend) {
201-
202215
for (MetaData metaData : orderedList) {
203216
List<String> provides = metaData.getProvides();
204217
if (provides != null) {
@@ -216,7 +229,7 @@ MetaData findProviderOf(String depend) {
216229
* Return true if the beans with unsatisfied dependencies seem
217230
* to form a circular dependency.
218231
*/
219-
boolean hasCircularDependencies() {
232+
private boolean hasCircularDependencies() {
220233
return !circularDependencies.isEmpty();
221234
}
222235

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,7 @@ private void writeBeanFactory() {
116116
MetaDataOrdering ordering = new MetaDataOrdering(metaData.values(), context);
117117
int remaining = ordering.processQueue();
118118
if (remaining > 0) {
119-
if (ordering.hasCircularDependencies()) {
120-
ordering.errorOnCircularDependencies();
121-
} else {
122-
context.logWarn("there are " + remaining + " beans with unsatisfied dependencies (assuming external dependencies)");
123-
ordering.warnOnDependencies();
124-
}
119+
ordering.logWarnings();
125120
}
126121

127122
try {
@@ -249,7 +244,7 @@ private void readFactory(TypeElement factoryType) {
249244
// read a build method - DependencyMeta
250245
DependencyMeta meta = element.getAnnotation(DependencyMeta.class);
251246
if (meta == null) {
252-
context.logError("Missing @DependencyMeta on method " + simpleName.toString());
247+
context.logError("Missing @DependencyMeta on method " + simpleName);
253248
} else {
254249
final MetaData metaData = new MetaData(meta);
255250
this.metaData.put(metaData.getKey(), metaData);

0 commit comments

Comments
 (0)