Skip to content

Commit 6f28cbf

Browse files
authored
Merge pull request #714 from avaje/feature/MetaData-Comparable
Change MetaData to be Comparable and sort to deterministic order
2 parents b1fbe51 + deb0792 commit 6f28cbf

File tree

3 files changed

+72
-12
lines changed

3 files changed

+72
-12
lines changed

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
/**
99
* Holds the data as per <code>@DependencyMeta</code>
1010
*/
11-
final class MetaData {
11+
final class MetaData implements Comparable<MetaData> {
1212

13-
private static final String INDENT = " ";
13+
private static final Comparator<MetaData> COMPARATOR =
14+
Comparator.comparing(MetaData::type)
15+
.thenComparing(MetaData::name, Comparator.nullsFirst(Comparator.naturalOrder()))
16+
.thenComparing(MetaData::compareProvides);
1417

18+
private static final String INDENT = " ";
1519
private static final String NEWLINE = "\n";
1620

1721
private final String type;
@@ -314,4 +318,13 @@ void markWithExternalDependency(String name) {
314318
}
315319
}
316320
}
321+
322+
private String compareProvides() {
323+
return provides.toString();
324+
}
325+
326+
@Override
327+
public int compareTo(MetaData meta) {
328+
return COMPARATOR.compare(this, meta);
329+
}
317330
}

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

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,8 @@
33
import static io.avaje.inject.generator.ProcessingContext.*;
44
import static io.avaje.inject.generator.APContext.*;
55
import java.io.IOException;
6-
import java.util.ArrayList;
7-
import java.util.Collection;
8-
import java.util.HashSet;
9-
import java.util.LinkedHashMap;
10-
import java.util.LinkedHashSet;
11-
import java.util.List;
12-
import java.util.Map;
13-
import java.util.Set;
6+
import java.util.*;
7+
import java.util.stream.Collectors;
148

159
import javax.annotation.processing.FilerException;
1610
import javax.lang.model.element.Element;
@@ -48,7 +42,7 @@ String type() {
4842
/**
4943
* Map to merge the existing meta data with partially compiled code. Keyed by type and qualifier/name.
5044
*/
51-
private final Map<String, MetaData> metaData = new LinkedHashMap<>();
45+
private final Map<String, MetaData> metaData = new HashMap<>();
5246
private final Map<String, String> constructorDependencies = new LinkedHashMap<>();
5347
private final List<BeanReader> beanReaders = new ArrayList<>();
5448
private final Set<String> readBeans = new HashSet<>();
@@ -228,7 +222,7 @@ void writeModule() {
228222
if (moduleWritten) {
229223
return;
230224
}
231-
final Collection<MetaData> meta = metaData.values();
225+
final Collection<MetaData> meta = metaData.values().stream().sorted().collect(Collectors.toList());
232226
if (emptyModule) {
233227
// typically nothing in the default scope, only custom scopes
234228
if (meta.size() > 0) {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.avaje.inject.generator;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.List;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
import static org.junit.jupiter.api.Assertions.*;
9+
10+
class MetaDataCompareToTest {
11+
12+
MetaData foo = new MetaData("foo.Foo", null);
13+
MetaData fooEq = new MetaData("foo.Foo", null);
14+
MetaData fooA = new MetaData("foo.Foo", "a");
15+
MetaData fooAEq = new MetaData("foo.Foo", "a");
16+
MetaData bar = new MetaData("b.Bar", null);
17+
MetaData fooProv = new MetaData("foo.Foo", null);
18+
MetaData fooProv2 = new MetaData("foo.Foo", null);
19+
MetaData fooProv3 = new MetaData("foo.Foo", null);
20+
21+
MetaDataCompareToTest() {
22+
fooProv.setProvides(List.of("bar.Bar"));
23+
fooProv2.setProvides(List.of("bar.Bar"));
24+
fooProv3.setProvides(List.of("bar.Bar", "b.B2"));
25+
}
26+
27+
@Test
28+
void compareTo_equals() {
29+
assertThat(foo.compareTo(fooEq)).describedAs("type only").isEqualTo(0);
30+
assertThat(fooA.compareTo(fooAEq)).describedAs("type and name").isEqualTo(0);
31+
assertThat(fooProv.compareTo(fooProv2)).describedAs("type and name and provides").isEqualTo(0);
32+
}
33+
34+
@Test
35+
void compareTo_differentType() {
36+
assertEquals(4, foo.compareTo(bar));
37+
assertEquals(-4, bar.compareTo(foo));
38+
}
39+
40+
@Test
41+
void compareTo_differentName() {
42+
assertEquals(-1, foo.compareTo(fooA));
43+
assertEquals(1, fooA.compareTo(foo));
44+
}
45+
46+
@Test
47+
void compareTo_differentProvides() {
48+
assertEquals(5, fooProv.compareTo(foo));
49+
assertEquals(-5, foo.compareTo(fooProv));
50+
assertEquals(49, fooProv.compareTo(fooProv3));
51+
assertEquals(-49, fooProv3.compareTo(fooProv));
52+
}
53+
}

0 commit comments

Comments
 (0)