Skip to content

Commit fc99b48

Browse files
committed
#9 - Add details about "index" and "element"/"component" types to MemberDetails
#21 - Work on generics / parameterized-types
1 parent 3c3eecc commit fc99b48

File tree

9 files changed

+92
-108
lines changed

9 files changed

+92
-108
lines changed

src/main/java/org/hibernate/models/internal/ArrayTypeDescriptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import org.hibernate.models.internal.jandex.ArrayValueExtractor;
1414
import org.hibernate.models.internal.jandex.ArrayValueWrapper;
15-
import org.hibernate.models.internal.util.ArrayHelper;
15+
import org.hibernate.models.internal.util.CollectionHelper;
1616
import org.hibernate.models.spi.AnnotationDescriptor;
1717
import org.hibernate.models.spi.AnnotationTarget;
1818
import org.hibernate.models.spi.AttributeDescriptor;
@@ -55,7 +55,7 @@ public List<V> createValue(
5555
AnnotationTarget target,
5656
SourceModelBuildingContext context) {
5757
final Object[] defaultValue = (Object[]) attributeDescriptor.getAttributeMethod().getDefaultValue();
58-
if ( ArrayHelper.isEmpty( defaultValue ) ) {
58+
if ( CollectionHelper.isEmpty( defaultValue ) ) {
5959
return Collections.emptyList();
6060
}
6161

src/main/java/org/hibernate/models/internal/PrimitiveTypeDetailsImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public Kind getTypeKind() {
2020
return Kind.PRIMITIVE;
2121
}
2222

23+
@Override
2324
public PrimitiveKind getPrimitiveKind() {
2425
return PrimitiveKind.resolveFromClassDetails( classDetails() );
2526
}

src/main/java/org/hibernate/models/internal/jandex/JandexTypeSwitchStandard.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
import org.hibernate.models.internal.TypeVariableDetailsImpl;
1919
import org.hibernate.models.internal.TypeVariableReferenceDetailsImpl;
2020
import org.hibernate.models.internal.VoidTypeDetailsImpl;
21+
import org.hibernate.models.internal.jdk.JdkTrackingTypeSwitch;
2122
import org.hibernate.models.internal.util.CollectionHelper;
2223
import org.hibernate.models.spi.ClassDetails;
2324
import org.hibernate.models.spi.SourceModelBuildingContext;
2425
import org.hibernate.models.spi.TypeDetails;
26+
import org.hibernate.models.spi.TypeDetailsHelper;
2527

2628
import org.jboss.jandex.ArrayType;
2729
import org.jboss.jandex.ClassType;
@@ -103,14 +105,8 @@ public TypeDetails caseTypeVariableReference(
103105

104106
@Override
105107
public TypeDetails caseArrayType(ArrayType arrayType, SourceModelBuildingContext buildingContext) {
106-
final ClassDetails arrayClassDetails = buildingContext
107-
.getClassDetailsRegistry()
108-
.resolveClassDetails( arrayType.name().toString() );
109-
return new ArrayTypeDetailsImpl(
110-
arrayClassDetails,
111-
JandexTypeSwitcher.switchType( arrayType.componentType(), this, buildingContext )
112-
);
113-
108+
final TypeDetails componentTypeDetails = switchType( arrayType.componentType(), this, buildingContext );
109+
return TypeDetailsHelper.arrayOf( componentTypeDetails, buildingContext );
114110
}
115111

116112
@Override

src/main/java/org/hibernate/models/internal/jdk/JdkClassDetails.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import java.util.List;
1818

1919
import org.hibernate.models.internal.ClassDetailsSupport;
20-
import org.hibernate.models.internal.util.ArrayHelper;
20+
import org.hibernate.models.internal.util.CollectionHelper;
2121
import org.hibernate.models.internal.util.TypeHelper;
2222
import org.hibernate.models.spi.ClassDetails;
2323
import org.hibernate.models.spi.ClassDetailsRegistry;
@@ -131,7 +131,7 @@ public List<TypeDetails> getImplementedInterfaceTypes() {
131131

132132
private List<TypeDetails> collectInterfaces() {
133133
final Type[] jdkInterfaces = managedClass.getGenericInterfaces();
134-
if ( ArrayHelper.isEmpty( jdkInterfaces ) ) {
134+
if ( CollectionHelper.isEmpty( jdkInterfaces ) ) {
135135
return Collections.emptyList();
136136
}
137137

@@ -154,7 +154,7 @@ public List<TypeVariableDetails> getTypeParameters() {
154154

155155
private List<TypeVariableDetails> collectTypeParameters() {
156156
final TypeVariable<? extends Class<?>>[] jdkTypeParameters = managedClass.getTypeParameters();
157-
if ( ArrayHelper.isEmpty( jdkTypeParameters ) ) {
157+
if ( CollectionHelper.isEmpty( jdkTypeParameters ) ) {
158158
return Collections.emptyList();
159159
}
160160

src/main/java/org/hibernate/models/internal/jdk/JdkTrackingTypeSwitch.java

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@
2222
import org.hibernate.models.internal.PrimitiveTypeDetailsImpl;
2323
import org.hibernate.models.internal.TypeVariableDetailsImpl;
2424
import org.hibernate.models.internal.VoidTypeDetailsImpl;
25-
import org.hibernate.models.internal.util.ArrayHelper;
25+
import org.hibernate.models.internal.util.CollectionHelper;
2626
import org.hibernate.models.spi.ArrayTypeDetails;
2727
import org.hibernate.models.spi.ClassBasedTypeDetails;
2828
import org.hibernate.models.spi.ClassDetails;
2929
import org.hibernate.models.spi.ParameterizedTypeDetails;
3030
import org.hibernate.models.spi.SourceModelBuildingContext;
3131
import org.hibernate.models.spi.TypeDetails;
32+
import org.hibernate.models.spi.TypeDetailsHelper;
3233
import org.hibernate.models.spi.TypeVariableDetails;
3334
import org.hibernate.models.spi.WildcardTypeDetails;
3435

@@ -88,37 +89,7 @@ public TypeVariableDetails caseTypeVariable(TypeVariable<?> typeVariable) {
8889

8990
public TypeDetails caseGenericArrayType(GenericArrayType genericArrayType) {
9091
final TypeDetails componentType = switcher.switchType( genericArrayType.getGenericComponentType() );
91-
92-
final ClassDetails arrayClassDetails;
93-
switch ( componentType.getTypeKind() ) {
94-
case CLASS, PRIMITIVE -> {
95-
arrayClassDetails = buildingContext
96-
.getClassDetailsRegistry()
97-
.resolveClassDetails( genericArrayType.getTypeName() );
98-
}
99-
case ARRAY -> {
100-
final ClassDetails componentArrayClass = componentType.asArrayType().getArrayClassDetails();
101-
arrayClassDetails = buildingContext
102-
.getClassDetailsRegistry()
103-
.resolveClassDetails( "[" + componentArrayClass.getName() );
104-
}
105-
case TYPE_VARIABLE -> {
106-
final TypeVariableDetails typeVariable = componentType.asTypeVariable();
107-
if ( !typeVariable.getBounds().isEmpty() ) {
108-
final String arrayTypeName = "[L" + typeVariable.getName().replace( '.', '/' ) + ";";
109-
arrayClassDetails = buildingContext
110-
.getClassDetailsRegistry()
111-
.resolveClassDetails( arrayTypeName );
112-
}
113-
else {
114-
arrayClassDetails = ClassDetails.OBJECT_CLASS_DETAILS;
115-
}
116-
}
117-
default -> {
118-
throw new UnsupportedOperationException( "Not yet implemented - " + componentType );
119-
}
120-
}
121-
return new ArrayTypeDetailsImpl( arrayClassDetails, componentType );
92+
return TypeDetailsHelper.arrayOf( componentType, buildingContext );
12293
}
12394

12495
public TypeDetails defaultCase(Type type) {
@@ -141,7 +112,7 @@ public List<TypeDetails> extractTypeParameters(ParameterizedType parameterizedTy
141112
}
142113

143114
public List<TypeDetails> resolveTypes(Type[] types) {
144-
if ( ArrayHelper.isEmpty( types ) ) {
115+
if ( CollectionHelper.isEmpty( types ) ) {
145116
return Collections.emptyList();
146117
}
147118

src/main/java/org/hibernate/models/internal/util/ArrayHelper.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

src/main/java/org/hibernate/models/internal/util/CollectionHelper.java

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,20 @@
1818
*/
1919
public class CollectionHelper {
2020
public static final int DEFAULT_LIST_CAPACITY = 10;
21-
public static final int MINIMUM_INITIAL_CAPACITY = 16;
22-
public static final float LOAD_FACTOR = 0.75f;
2321

24-
@SuppressWarnings("rawtypes")
25-
public static boolean isEmpty(Collection collection) {
22+
public static boolean isEmpty(@SuppressWarnings("rawtypes") Collection collection) {
2623
return collection == null || collection.isEmpty();
2724
}
2825

29-
@SuppressWarnings("rawtypes")
30-
public static boolean isNotEmpty(Collection collection) {
26+
public static boolean isNotEmpty(@SuppressWarnings("rawtypes") Collection collection) {
3127
return !isEmpty( collection );
3228
}
3329

34-
@SuppressWarnings("rawtypes")
35-
public static boolean isEmpty(Map map) {
30+
public static boolean isEmpty(@SuppressWarnings("rawtypes") Map map) {
3631
return map == null || map.isEmpty();
3732
}
3833

39-
@SuppressWarnings("rawtypes")
40-
public static boolean isNotEmpty(Map map) {
34+
public static boolean isNotEmpty(@SuppressWarnings("rawtypes") Map map) {
4135
return !isEmpty( map );
4236
}
4337

@@ -49,47 +43,33 @@ public static boolean isNotEmpty(Object[] objects) {
4943
return objects != null && objects.length > 0;
5044
}
5145

52-
public static <T> ArrayList<T> arrayList(int expectedNumberOfElements) {
53-
return new ArrayList<>( Math.max( expectedNumberOfElements + 1, DEFAULT_LIST_CAPACITY ) );
46+
public static int size(@SuppressWarnings("rawtypes") Collection collection) {
47+
return collection == null
48+
? 0
49+
: collection.size();
5450
}
5551

56-
public static <E> List<E> join(List<E> first, List<E> second) {
57-
final int totalCount = ( first == null ? 0 : first.size() )
58-
+ ( second == null ? 0 : second.size() );
59-
if ( totalCount == 0 ) {
60-
return Collections.emptyList();
61-
}
62-
final ArrayList<E> joined = new ArrayList<>( totalCount );
63-
if ( first != null ) {
64-
joined.addAll( first );
65-
}
66-
if ( second != null ) {
67-
joined.addAll( second );
68-
}
69-
return joined;
52+
public static int size(@SuppressWarnings("rawtypes") Map map) {
53+
return map == null
54+
? 0
55+
: map.size();
7056
}
7157

72-
public static <E> List<E> join(Collection<E> first, Collection<E> second) {
73-
final int totalCount = ( first == null ? 0 : first.size() )
74-
+ ( second == null ? 0 : second.size() );
75-
if ( totalCount == 0 ) {
76-
return Collections.emptyList();
77-
}
78-
final ArrayList<E> joined = new ArrayList<>( totalCount );
79-
if ( first != null ) {
80-
joined.addAll( first );
81-
}
82-
if ( second != null ) {
83-
joined.addAll( second );
84-
}
85-
return joined;
58+
public static int length(Object[] array) {
59+
return array == null
60+
? 0
61+
: array.length;
62+
}
63+
64+
public static <T> ArrayList<T> arrayList(int expectedNumberOfElements) {
65+
return new ArrayList<>( Math.max( expectedNumberOfElements + 1, DEFAULT_LIST_CAPACITY ) );
8666
}
8767

88-
public static <E> List<E> mutableJoin(Collection<E> first, Collection<E> second) {
68+
public static <E> List<E> join(List<E> first, List<E> second) {
8969
final int totalCount = ( first == null ? 0 : first.size() )
9070
+ ( second == null ? 0 : second.size() );
9171
if ( totalCount == 0 ) {
92-
return new ArrayList<>();
72+
return Collections.emptyList();
9373
}
9474
final ArrayList<E> joined = new ArrayList<>( totalCount );
9575
if ( first != null ) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package org.hibernate.models.spi;
99

10+
import org.hibernate.models.internal.PrimitiveKind;
11+
1012
/**
1113
* Models a primitive type
1214
*
@@ -23,6 +25,8 @@ public interface PrimitiveTypeDetails extends ClassBasedTypeDetails {
2325
@Override
2426
Kind getTypeKind();
2527

28+
PrimitiveKind getPrimitiveKind();
29+
2630
@Override
2731
PrimitiveTypeDetails asPrimitiveType();
2832
}

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

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import java.util.List;
1111

12+
import org.hibernate.models.internal.ArrayTypeDetailsImpl;
13+
import org.hibernate.models.internal.PrimitiveKind;
1214
import org.hibernate.models.internal.util.CollectionHelper;
1315

1416
/**
@@ -102,7 +104,7 @@ public static ClassBasedTypeDetails resolveRelativeClassType(TypeDetails memberT
102104
}
103105
else if ( typeDetails.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
104106
final TypeVariableDetails resolvedTypeVariable = typeDetails.asTypeVariable();
105-
if ( CollectionHelper.isNotEmpty( resolvedTypeVariable.getBounds() ) ) {
107+
if ( CollectionHelper.size( resolvedTypeVariable.getBounds() ) == 1 ) {
106108
// and assume the bound is a class
107109
return resolvedTypeVariable.getBounds().get( 0 ).asClassType();
108110
}
@@ -111,7 +113,7 @@ else if ( typeDetails.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
111113
else {
112114
// assume parameterized
113115
final ParameterizedTypeDetails parameterizedType = typeDetails.asParameterizedType();
114-
if ( CollectionHelper.isNotEmpty( parameterizedType.getArguments() ) ) {
116+
if ( CollectionHelper.size( parameterizedType.getArguments() ) == 1 ) {
115117
// and assume the bound is a class
116118
return parameterizedType.getArguments().get( 0 ).asClassType();
117119
}
@@ -146,7 +148,7 @@ public static ClassBasedTypeDetails resolveRelativeClassType(TypeDetails memberT
146148
}
147149
else if ( typeDetails.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
148150
final TypeVariableDetails resolvedTypeVariable = typeDetails.asTypeVariable();
149-
if ( CollectionHelper.isNotEmpty( resolvedTypeVariable.getBounds() ) ) {
151+
if ( CollectionHelper.size( resolvedTypeVariable.getBounds() ) == 1 ) {
150152
// and assume the bound is a class
151153
return resolvedTypeVariable.getBounds().get( 0 ).asClassType();
152154
}
@@ -155,7 +157,7 @@ else if ( typeDetails.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
155157
else {
156158
// assume parameterized
157159
final ParameterizedTypeDetails parameterizedType = typeDetails.asParameterizedType();
158-
if ( CollectionHelper.isNotEmpty( parameterizedType.getArguments() ) ) {
160+
if ( CollectionHelper.size( parameterizedType.getArguments() ) == 1 ) {
159161
// and assume the bound is a class
160162
return parameterizedType.getArguments().get( 0 ).asClassType();
161163
}
@@ -176,4 +178,50 @@ else if ( typeDetails.getTypeKind() == TypeDetails.Kind.TYPE_VARIABLE ) {
176178
}
177179
}
178180
}
181+
182+
public static ClassDetails resolveRawClass(
183+
TypeDetails typeDetails,
184+
SourceModelBuildingContext buildingContext) {
185+
switch ( typeDetails.getTypeKind() ) {
186+
case CLASS, PRIMITIVE, VOID, ARRAY -> {
187+
return ( (ClassBasedTypeDetails) typeDetails ).getClassDetails();
188+
}
189+
case TYPE_VARIABLE -> {
190+
final TypeVariableDetails resolvedTypeVariable = typeDetails.asTypeVariable();
191+
if ( CollectionHelper.size( resolvedTypeVariable.getBounds() ) == 1 ) {
192+
// and assume the bound is a class
193+
return resolvedTypeVariable.getBounds().get( 0 ).asClassType().getClassDetails();
194+
}
195+
return ClassDetails.OBJECT_CLASS_DETAILS;
196+
}
197+
case PARAMETERIZED_TYPE -> {
198+
final ParameterizedTypeDetails parameterizedType = typeDetails.asParameterizedType();
199+
if ( CollectionHelper.size( parameterizedType.getArguments() ) == 1 ) {
200+
// and assume the bound is a class
201+
return parameterizedType.getArguments().get( 0 ).asClassType().getClassDetails();
202+
}
203+
return ClassDetails.OBJECT_CLASS_DETAILS;
204+
}
205+
}
206+
return ClassDetails.OBJECT_CLASS_DETAILS;
207+
}
208+
209+
public static ArrayTypeDetails arrayOf(TypeDetails constituentType, SourceModelBuildingContext buildingContext) {
210+
final ClassDetails arrayClassDetails;
211+
if ( constituentType.getTypeKind() == TypeDetails.Kind.PRIMITIVE ) {
212+
final PrimitiveTypeDetails primitiveType = constituentType.asPrimitiveType();
213+
final PrimitiveKind primitiveKind = primitiveType.getPrimitiveKind();
214+
arrayClassDetails = buildingContext
215+
.getClassDetailsRegistry()
216+
.resolveClassDetails( "[" + primitiveKind.getJavaTypeChar() );
217+
}
218+
else {
219+
final ClassDetails rawComponentType = TypeDetailsHelper.resolveRawClass( constituentType, buildingContext );
220+
final String arrayClassName = "[L" + rawComponentType.getName().replace( '.', '/' ) + ";";
221+
arrayClassDetails = buildingContext
222+
.getClassDetailsRegistry()
223+
.resolveClassDetails( arrayClassName );
224+
}
225+
return new ArrayTypeDetailsImpl( arrayClassDetails, constituentType );
226+
}
179227
}

0 commit comments

Comments
 (0)