Skip to content

Commit ea320d8

Browse files
leonardhusmanncodecholeric
authored andcommitted
add JavaMember.getAllInvolvedRawTypes()
Convenience method to find all `JavaClass`es involved in any member's signature. For a field these are only the raw types involved in the field type, for methods and constructors it's the union of all raw types involved in parameter types, return types and type parameters. Issue: #723 Signed-off-by: Leonard Husmann <[email protected]> Signed-off-by: Peter Gafert <[email protected]>
1 parent f4b0684 commit ea320d8

File tree

5 files changed

+80
-0
lines changed

5 files changed

+80
-0
lines changed

archunit/src/main/java/com/tngtech/archunit/core/domain/JavaCodeUnit.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.List;
2121
import java.util.Optional;
2222
import java.util.Set;
23+
import java.util.stream.Stream;
2324

2425
import com.google.common.collect.ImmutableList;
2526
import com.google.common.collect.ImmutableSet;
@@ -43,6 +44,7 @@
4344
import static com.tngtech.archunit.PublicAPI.Usage.ACCESS;
4445
import static com.tngtech.archunit.core.domain.Formatters.formatMethod;
4546
import static com.tngtech.archunit.core.domain.properties.HasName.Utils.namesOf;
47+
import static java.util.stream.Collectors.toSet;
4648

4749
/**
4850
* Represents a unit of code containing accesses to other units of code. A unit of code can be
@@ -169,6 +171,22 @@ public JavaClass getRawReturnType() {
169171
return returnType.getRaw();
170172
}
171173

174+
/**
175+
* @return All raw types involved in this code unit's signature,
176+
* which is the union of all raw types involved in the {@link #getReturnType() return type},
177+
* the {@link #getParameterTypes() parameter types} and the {@link #getTypeParameters() type parameters} of this code unit.
178+
* For a definition of "all raw types involved" consult {@link JavaType#getAllInvolvedRawTypes()}.
179+
*/
180+
@Override
181+
@PublicAPI(usage = ACCESS)
182+
public Set<JavaClass> getAllInvolvedRawTypes() {
183+
return Stream.of(
184+
Stream.of(this.returnType.get()),
185+
this.parameters.getParameterTypes().stream(),
186+
this.typeParameters.stream()
187+
).flatMap(s -> s).map(JavaType::getAllInvolvedRawTypes).flatMap(Set::stream).collect(toSet());
188+
}
189+
172190
@PublicAPI(usage = ACCESS)
173191
public Set<JavaFieldAccess> getFieldAccesses() {
174192
return fieldAccesses;

archunit/src/main/java/com/tngtech/archunit/core/domain/JavaField.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ public JavaClass getRawType() {
6262
return type.toErasure();
6363
}
6464

65+
/**
66+
* @return All raw types involved in this field's signature, which is equivalent to {@link #getType()}.{@link JavaType#getAllInvolvedRawTypes() getAllInvolvedRawTypes()}.
67+
*/
68+
@Override
69+
@PublicAPI(usage = ACCESS)
70+
public Set<JavaClass> getAllInvolvedRawTypes() {
71+
return getType().getAllInvolvedRawTypes();
72+
}
73+
6574
@Override
6675
@PublicAPI(usage = ACCESS)
6776
public Set<JavaFieldAccess> getAccessesToSelf() {

archunit/src/main/java/com/tngtech/archunit/core/domain/JavaMember.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ public abstract class JavaMember implements
6363
this.modifiers = checkNotNull(builder.getModifiers());
6464
}
6565

66+
/**
67+
* Similar to {@link JavaType#getAllInvolvedRawTypes()}, this method returns all raw types involved in this {@link JavaMember member's} signature.
68+
* For more concrete details refer to {@link JavaField#getAllInvolvedRawTypes()} and {@link JavaCodeUnit#getAllInvolvedRawTypes()}.
69+
*
70+
* @return All raw types involved in the signature of this member
71+
*/
72+
@PublicAPI(usage = ACCESS)
73+
public abstract Set<JavaClass> getAllInvolvedRawTypes();
74+
6675
@Override
6776
@PublicAPI(usage = ACCESS)
6877
public Set<? extends JavaAnnotation<? extends JavaMember>> getAnnotations() {

archunit/src/test/java/com/tngtech/archunit/core/domain/JavaCodeUnitTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.tngtech.archunit.core.domain;
22

33
import java.io.File;
4+
import java.io.Serializable;
5+
import java.util.Collection;
46
import java.util.List;
57
import java.util.Map;
8+
import java.util.Set;
69

710
import com.google.common.collect.ImmutableList;
811
import com.tngtech.archunit.core.importer.ClassFileImporter;
@@ -20,12 +23,28 @@
2023
import static com.tngtech.archunit.core.domain.properties.HasType.Functions.GET_RAW_TYPE;
2124
import static com.tngtech.archunit.testutil.Assertions.assertThat;
2225
import static com.tngtech.archunit.testutil.Assertions.assertThatAnnotation;
26+
import static com.tngtech.archunit.testutil.Assertions.assertThatTypes;
2327
import static com.tngtech.java.junit.dataprovider.DataProviders.testForEach;
2428
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2529

2630
@RunWith(DataProviderRunner.class)
2731
public class JavaCodeUnitTest {
2832

33+
@Test
34+
public void offers_all_involved_raw_types() {
35+
class SampleClass<T extends Collection<? super File> & Serializable> {
36+
@SuppressWarnings("unused")
37+
T method(List<Map<? extends Number, Set<? super String[][]>>> input) {
38+
return null;
39+
}
40+
}
41+
42+
JavaMethod method = new ClassFileImporter().importClass(SampleClass.class).getMethod("method", List.class);
43+
44+
assertThatTypes(method.getAllInvolvedRawTypes())
45+
.matchInAnyOrder(Collection.class, File.class, Serializable.class, List.class, Map.class, Number.class, Set.class, String.class);
46+
}
47+
2948
@Test
3049
public void offers_all_calls_from_Self() {
3150
JavaMethod method = importClassWithContext(ClassAccessingOtherClass.class).getMethod("access", ClassBeingAccessed.class);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.tngtech.archunit.core.domain;
2+
3+
import java.io.Serializable;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
import com.tngtech.archunit.core.importer.ClassFileImporter;
9+
import org.junit.Test;
10+
11+
import static com.tngtech.archunit.testutil.Assertions.assertThatTypes;
12+
13+
public class JavaFieldTest {
14+
@Test
15+
public void offers_all_involved_raw_types() {
16+
class SomeClass {
17+
@SuppressWarnings("unused")
18+
List<? super Map<? extends Serializable, ? super Set<Number[][]>>> field;
19+
}
20+
21+
JavaField field = new ClassFileImporter().importClass(SomeClass.class).getField("field");
22+
23+
assertThatTypes(field.getAllInvolvedRawTypes()).matchInAnyOrder(List.class, Map.class, Serializable.class, Set.class, Number.class);
24+
}
25+
}

0 commit comments

Comments
 (0)