Skip to content

Commit 8b9bf70

Browse files
committed
#9 - Expose getElementType and getMapKeyType from MemberDetails
1 parent 10f011d commit 8b9bf70

File tree

5 files changed

+95
-4
lines changed

5 files changed

+95
-4
lines changed

src/main/java/org/hibernate/models/spi/MemberDetails.java

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
package org.hibernate.models.spi;
88

99
import java.lang.reflect.Member;
10+
import java.util.Collection;
11+
import java.util.Map;
1012

1113
import org.hibernate.models.internal.ModifierUtils;
1214

@@ -36,6 +38,91 @@ public interface MemberDetails extends AnnotationTarget {
3638
*/
3739
TypeDetails getType();
3840

41+
/**
42+
* Get the plural element type for this member. If the member does not have a type or the
43+
* member is not plural, a {@code null} is returned.
44+
* <p/>
45+
* For arrays, lists and sets the element type is returned.
46+
* <p/>
47+
* For maps, the value type is returned.
48+
*/
49+
default TypeDetails getElementType() {
50+
final TypeDetails memberType = getType();
51+
if ( memberType == null ) {
52+
return null;
53+
}
54+
55+
if ( memberType.getTypeKind() == TypeDetails.Kind.ARRAY ) {
56+
return memberType.asArrayType().getConstituentType();
57+
}
58+
59+
if ( memberType.isImplementor( Collection.class ) ) {
60+
if ( memberType.getTypeKind() == TypeDetails.Kind.CLASS ) {
61+
// raw use
62+
return ClassBasedTypeDetails.OBJECT_TYPE_DETAILS;
63+
}
64+
if ( memberType.getTypeKind() == TypeDetails.Kind.PARAMETERIZED_TYPE ) {
65+
final ParameterizedTypeDetails parameterizedType = memberType.asParameterizedType();
66+
assert parameterizedType.getArguments().size() == 1;
67+
return parameterizedType.getArguments().get( 0 );
68+
}
69+
if ( memberType.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
70+
final TypeVariableDetails typeVariable = memberType.asTypeVariable();
71+
assert typeVariable.getBounds().size() == 1;
72+
return typeVariable.getBounds().get( 0 );
73+
}
74+
}
75+
76+
if ( memberType.isImplementor( Map.class ) ) {
77+
if ( memberType.getTypeKind() == TypeDetails.Kind.CLASS ) {
78+
// raw use
79+
return ClassBasedTypeDetails.OBJECT_TYPE_DETAILS;
80+
}
81+
if ( memberType.getTypeKind() == TypeDetails.Kind.PARAMETERIZED_TYPE ) {
82+
final ParameterizedTypeDetails parameterizedType = memberType.asParameterizedType();
83+
assert parameterizedType.getArguments().size() == 2;
84+
return parameterizedType.getArguments().get( 1 );
85+
}
86+
if ( memberType.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
87+
final TypeVariableDetails typeVariable = memberType.asTypeVariable();
88+
assert typeVariable.getBounds().size() == 2;
89+
return typeVariable.getBounds().get( 1 );
90+
}
91+
}
92+
93+
return null;
94+
}
95+
96+
/**
97+
* Get the map key type for this member. If the member does not have a type or the
98+
* member is not a map, a {@code null} is returned.
99+
*/
100+
default TypeDetails getMapKeyType() {
101+
final TypeDetails memberType = getType();
102+
if ( memberType == null ) {
103+
return null;
104+
}
105+
106+
if ( memberType.isImplementor( Map.class ) ) {
107+
if ( memberType.getTypeKind() == TypeDetails.Kind.CLASS ) {
108+
// raw use
109+
return ClassBasedTypeDetails.OBJECT_TYPE_DETAILS;
110+
}
111+
if ( memberType.getTypeKind() == TypeDetails.Kind.PARAMETERIZED_TYPE ) {
112+
final ParameterizedTypeDetails parameterizedType = memberType.asParameterizedType();
113+
assert parameterizedType.getArguments().size() == 2;
114+
return parameterizedType.getArguments().get( 0 );
115+
}
116+
if ( memberType.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
117+
final TypeVariableDetails typeVariable = memberType.asTypeVariable();
118+
assert typeVariable.getBounds().size() == 2;
119+
return typeVariable.getBounds().get( 0 );
120+
}
121+
}
122+
123+
return null;
124+
}
125+
39126
/**
40127
* The class which declares this member
41128
*/

src/test/java/org/hibernate/models/generics/CollectionTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ void testWildcard(Index index) {
212212
assertThat( extendsStuffFieldWildcardType.isExtends() ).isTrue();
213213
assertThat( extendsStuffFieldWildcardType.getBound().getTypeKind() ).isEqualTo( TypeDetails.Kind.CLASS );
214214
assertThat( extendsStuffFieldWildcardType.getBound().asClassType().getClassDetails().getName() ).endsWith( "Stuff" );
215+
assertThat( extendsStuffField.getElementType() ).isSameAs( extendsStuffFieldWildcardType );
215216

216217
final FieldDetails superStuffField = classDetails.findFieldByName( "superStuff" );
217218
final TypeDetails superStuffFieldType = superStuffField.getType();
@@ -229,6 +230,7 @@ void testWildcard(Index index) {
229230
assertThat( superStuffFieldWildcardType.isExtends() ).isFalse();
230231
assertThat( superStuffFieldWildcardType.getBound().getTypeKind() ).isEqualTo( TypeDetails.Kind.CLASS );
231232
assertThat( superStuffFieldWildcardType.getBound().asClassType().getClassDetails().getName() ).endsWith( "Stuff" );
233+
assertThat( superStuffField.getElementType() ).isSameAs( superStuffFieldWildcardType );
232234

233235
final FieldDetails namedStuffField = classDetails.findFieldByName( "namedStuff" );
234236
final TypeDetails namedStuffFieldType = namedStuffField.getType();
@@ -248,6 +250,9 @@ void testWildcard(Index index) {
248250
assertThat( namedStuffFieldValueWildcardType.isExtends() ).isTrue();
249251
assertThat( namedStuffFieldValueWildcardType.getBound().getTypeKind() ).isEqualTo( TypeDetails.Kind.CLASS );
250252
assertThat( namedStuffFieldValueWildcardType.getBound().asClassType().getClassDetails().getName() ).endsWith( "Stuff" );
253+
assertThat( namedStuffField.getElementType() ).isSameAs( namedStuffFieldValueWildcardType );
254+
assertThat( namedStuffField.getMapKeyType().getTypeKind() ).isEqualTo( TypeDetails.Kind.CLASS );
255+
assertThat( namedStuffField.getMapKeyType().asClassType().getClassDetails().toJavaClass() ).isEqualTo( String.class );
251256
}
252257

253258
@SuppressWarnings("unused")

src/test/java/org/hibernate/models/generics/ParameterizedHierarchyTests.java renamed to src/test/java/org/hibernate/models/generics/InheritanceTypeVariableTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
/**
2626
* @author Steve Ebersole
2727
*/
28-
public class ParameterizedHierarchyTests {
28+
public class InheritanceTypeVariableTests {
2929

3030
@Test
3131
void testParameterizedHierarchyWithJandex() {

src/test/java/org/hibernate/models/generics/TypeVariableReferenceTests.java renamed to src/test/java/org/hibernate/models/generics/RecursiveTypeVariableTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
/**
2323
* @author Steve Ebersole
2424
*/
25-
public class TypeVariableReferenceTests {
25+
public class RecursiveTypeVariableTests {
2626

2727
@Test
2828
void testTypeVariableReferenceJandex() {

src/test/java/org/hibernate/models/generics/GenericTypeTests.java renamed to src/test/java/org/hibernate/models/generics/SimpleTypeVariableTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package org.hibernate.models.generics;
99

1010
import org.hibernate.models.SourceModelTestHelper;
11-
import org.hibernate.models.internal.ClassTypeDetailsImpl;
1211
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
1312
import org.hibernate.models.spi.ClassBasedTypeDetails;
1413
import org.hibernate.models.spi.ClassDetails;
@@ -26,7 +25,7 @@
2625
/**
2726
* @author Steve Ebersole
2827
*/
29-
public class GenericTypeTests {
28+
public class SimpleTypeVariableTests {
3029

3130
@Test
3231
void testParameterizedClassWithJandex() {

0 commit comments

Comments
 (0)