Skip to content

Commit 1c136a1

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

34 files changed

+976
-196
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ public boolean isImplementor(Class<?> checkType) {
8383
return constituentType.isImplementor( checkType.getComponentType() );
8484
}
8585

86+
@Override
87+
public TypeDetails resolveTypeVariable(String identifier) {
88+
if ( constituentType.getTypeKind() == Kind.PARAMETERIZED_TYPE ) {
89+
return constituentType.asParameterizedType().resolveTypeVariable( identifier );
90+
}
91+
return null;
92+
}
93+
8694
@Override
8795
public boolean equals(Object o) {
8896
if ( this == o ) {

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.hibernate.models.spi.ClassDetails;
1313
import org.hibernate.models.spi.ClassTypeDetails;
14+
import org.hibernate.models.spi.TypeDetails;
1415

1516
/**
1617
* @author Steve Ebersole
@@ -40,6 +41,11 @@ public Kind getTypeKind() {
4041
return kind;
4142
}
4243

44+
@Override
45+
public TypeDetails resolveTypeVariable(String identifier) {
46+
return getClassDetails().resolveTypeVariable( identifier );
47+
}
48+
4349
@Override
4450
public String toString() {
4551
return "ClassTypeDetails(" + classDetails.getName() + ")";

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import org.hibernate.models.spi.ClassDetails;
1313
import org.hibernate.models.spi.ParameterizedTypeDetails;
1414
import org.hibernate.models.spi.TypeDetails;
15+
import org.hibernate.models.spi.TypeDetailsHelper;
16+
import org.hibernate.models.spi.TypeVariableDetails;
1517

1618
/**
1719
* @author Steve Ebersole
@@ -28,7 +30,7 @@ public ParameterizedTypeDetailsImpl(ClassDetails genericClassDetails, List<TypeD
2830
}
2931

3032
@Override
31-
public ClassDetails getGenericClassDetails() {
33+
public ClassDetails getRawClassDetails() {
3234
return genericClassDetails;
3335
}
3436

@@ -41,4 +43,18 @@ public List<TypeDetails> getArguments() {
4143
public TypeDetails getOwner() {
4244
return owner;
4345
}
46+
47+
@Override
48+
public TypeDetails resolveTypeVariable(String identifier) {
49+
final List<TypeVariableDetails> typeParameters = genericClassDetails.getTypeParameters();
50+
assert typeParameters.size() == arguments.size();
51+
52+
for ( int i = 0; i < typeParameters.size(); i++ ) {
53+
if ( typeParameters.get( i ).getIdentifier().equals( identifier ) ) {
54+
return arguments.get( i );
55+
}
56+
}
57+
58+
return null;
59+
}
4460
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.hibernate.models.spi.ClassDetails;
1111
import org.hibernate.models.spi.PrimitiveTypeDetails;
12+
import org.hibernate.models.spi.TypeDetails;
1213

1314
/**
1415
* @author Steve Ebersole
@@ -28,6 +29,11 @@ public PrimitiveTypeDetails asPrimitiveType() {
2829
return this;
2930
}
3031

32+
@Override
33+
public TypeDetails resolveTypeVariable(String identifier) {
34+
return this;
35+
}
36+
3137
@Override
3238
public ClassDetails getClassDetails() {
3339
return classDetails();

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,30 @@
1616
import org.hibernate.models.internal.util.IndexedConsumer;
1717
import org.hibernate.models.spi.AnnotationDescriptor;
1818
import org.hibernate.models.spi.AnnotationUsage;
19+
import org.hibernate.models.spi.ClassBasedTypeDetails;
1920
import org.hibernate.models.spi.ClassDetails;
2021
import org.hibernate.models.spi.FieldDetails;
2122
import org.hibernate.models.spi.MethodDetails;
2223
import org.hibernate.models.spi.RecordComponentDetails;
2324
import org.hibernate.models.spi.TypeDetails;
25+
import org.hibernate.models.spi.TypeVariableDetails;
2426

2527
/**
2628
* @author Steve Ebersole
2729
*/
2830
public class SimpleClassDetails implements ClassDetails {
2931
private final Class<?> clazz;
3032
private final ClassDetails superTypeDetails;
33+
private final TypeDetails genericSuperTypeDetails;
3134

3235
public SimpleClassDetails(Class<?> clazz) {
33-
this( clazz, ClassDetails.OBJECT_CLASS_DETAILS );
36+
this( clazz, ClassDetails.OBJECT_CLASS_DETAILS, null );
3437
}
3538

36-
public SimpleClassDetails(Class<?> clazz, ClassDetails superTypeDetails) {
39+
public SimpleClassDetails(Class<?> clazz, ClassDetails superTypeDetails, TypeDetails genericSuperTypeDetails) {
3740
this.clazz = clazz;
3841
this.superTypeDetails = superTypeDetails;
42+
this.genericSuperTypeDetails = genericSuperTypeDetails;
3943
}
4044

4145
@Override
@@ -53,6 +57,11 @@ public ClassDetails getSuperType() {
5357
return superTypeDetails;
5458
}
5559

60+
@Override
61+
public TypeDetails getGenericSuperType() {
62+
return genericSuperTypeDetails;
63+
}
64+
5665
@Override
5766
public <X> Class<X> toJavaClass() {
5867
//noinspection unchecked
@@ -84,6 +93,11 @@ public List<TypeDetails> getImplementedInterfaceTypes() {
8493
return Collections.emptyList();
8594
}
8695

96+
@Override
97+
public List<TypeVariableDetails> getTypeParameters() {
98+
return Collections.emptyList();
99+
}
100+
87101
@Override
88102
public boolean isImplementor(Class<?> checkType) {
89103
return checkType.isAssignableFrom( clazz );

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public boolean isImplementor(Class<?> checkType) {
5656
return checkType == Object.class;
5757
}
5858

59+
@Override
60+
public TypeDetails resolveTypeVariable(String identifier) {
61+
return this.identifier.equals( identifier ) ? this : null;
62+
}
63+
5964
@Override
6065
public String toString() {
6166
return "TypeVariableDetails(" + identifier + " : " + name + ")";

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

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

88
package org.hibernate.models.internal;
99

10+
import org.hibernate.models.spi.TypeDetails;
1011
import org.hibernate.models.spi.TypeVariableDetails;
1112
import org.hibernate.models.spi.TypeVariableReferenceDetails;
1213

@@ -58,4 +59,9 @@ public String getName() {
5859
public boolean isImplementor(Class<?> checkType) {
5960
return getTarget().isImplementor( checkType );
6061
}
62+
63+
@Override
64+
public TypeDetails resolveTypeVariable(String identifier) {
65+
return this.identifier.equals( identifier ) ? target : null;
66+
}
6167
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Objects;
1111

1212
import org.hibernate.models.spi.ClassDetails;
13+
import org.hibernate.models.spi.TypeDetails;
1314
import org.hibernate.models.spi.VoidTypeDetails;
1415

1516
/**
@@ -39,6 +40,11 @@ public VoidTypeDetails asVoidType() {
3940
return this;
4041
}
4142

43+
@Override
44+
public TypeDetails resolveTypeVariable(String identifier) {
45+
return this;
46+
}
47+
4248
@Override
4349
public boolean equals(Object o) {
4450
if ( this == o ) {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,9 @@ public boolean isImplementor(Class<?> checkType) {
7272
}
7373
return getExtendsBound().isImplementor( checkType );
7474
}
75+
76+
@Override
77+
public TypeDetails resolveTypeVariable(String identifier) {
78+
return null;
79+
}
7580
}

src/main/java/org/hibernate/models/internal/dynamic/DynamicClassDetails.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.hibernate.models.spi.RecordComponentDetails;
1818
import org.hibernate.models.spi.SourceModelBuildingContext;
1919
import org.hibernate.models.spi.TypeDetails;
20+
import org.hibernate.models.spi.TypeVariableDetails;
2021

2122
/**
2223
* @author Steve Ebersole
@@ -26,31 +27,34 @@ public class DynamicClassDetails extends AbstractAnnotationTarget implements Cla
2627
private final String className;
2728
private final boolean isAbstract;
2829
private final ClassDetails superType;
30+
private final TypeDetails genericSuperType;
2931

3032
private List<FieldDetails> fields;
3133
private List<MethodDetails> methods;
3234

3335
private Class<?> javaType;
3436

3537
public DynamicClassDetails(String name, SourceModelBuildingContext buildingContext) {
36-
this( name, null, buildingContext );
38+
this( name, null, null, buildingContext );
3739
}
3840

39-
public DynamicClassDetails(String name, ClassDetails superType, SourceModelBuildingContext buildingContext) {
40-
this( name, null, false, superType, buildingContext );
41+
public DynamicClassDetails(String name, ClassDetails superType, TypeDetails genericSuperType, SourceModelBuildingContext buildingContext) {
42+
this( name, null, false, superType, genericSuperType, buildingContext );
4143
}
4244

4345
public DynamicClassDetails(
4446
String name,
4547
String className,
4648
boolean isAbstract,
4749
ClassDetails superType,
50+
TypeDetails genericSuperType,
4851
SourceModelBuildingContext buildingContext) {
4952
super( buildingContext );
5053
this.name = name;
5154
this.className = className;
5255
this.isAbstract = isAbstract;
5356
this.superType = superType;
57+
this.genericSuperType = genericSuperType;
5458
}
5559

5660
@Override
@@ -83,12 +87,22 @@ public ClassDetails getSuperType() {
8387
return superType;
8488
}
8589

90+
@Override
91+
public TypeDetails getGenericSuperType() {
92+
return genericSuperType;
93+
}
94+
8695
@Override
8796
public List<TypeDetails> getImplementedInterfaceTypes() {
8897
// todo : do we need these for dynamic classes?
8998
return null;
9099
}
91100

101+
@Override
102+
public List<TypeVariableDetails> getTypeParameters() {
103+
return Collections.emptyList();
104+
}
105+
92106
@Override
93107
public boolean isImplementor(Class<?> checkType) {
94108
return checkType.isAssignableFrom( javaType );

0 commit comments

Comments
 (0)