Skip to content

Commit 0905cf7

Browse files
mbelladesebersole
authored andcommitted
Always consider wildcard types with class bounds as resolved
1 parent 7dde164 commit 0905cf7

File tree

4 files changed

+107
-10
lines changed

4 files changed

+107
-10
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ public Boolean caseParameterizedType(
7575

7676
@Override
7777
public Boolean caseWildcardType(WildcardTypeDetails wildcardType, SourceModelBuildingContext buildingContext) {
78-
return isBound( wildcardType.getBound(), buildingContext );
78+
final TypeDetails bound = wildcardType.getBound();
79+
return bound != null && ( bound.getTypeKind() == TypeDetails.Kind.CLASS || isBound( bound, buildingContext ) );
7980
}
8081

8182
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public TypeDetails getBound() {
2626
}
2727

2828
/**
29-
* Whether the {@linkplain #bound () bound} is an extends - i.e. {@code ? extends Something}.
29+
* Whether the {@linkplain #bound() bound} is an extends - i.e. {@code ? extends Something}.
3030
* False would imply a super - i.e. {@code ? super Something}.
3131
*/
3232
@Override

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class TypeDetailsHelper {
4343
*/
4444
public static TypeDetails resolveRelativeType(TypeDetails type, TypeVariableScope container) {
4545
switch ( type.getTypeKind() ) {
46-
case CLASS, PRIMITIVE, VOID, ARRAY -> {
46+
case CLASS, PRIMITIVE, VOID, ARRAY, WILDCARD_TYPE -> {
4747
return type;
4848
}
4949
case PARAMETERIZED_TYPE -> {
@@ -71,13 +71,6 @@ public static TypeDetails resolveRelativeType(TypeDetails type, TypeVariableScop
7171
case TYPE_VARIABLE_REFERENCE -> {
7272
throw new UnsupportedOperationException( "TypeVariableReferenceDetails not supported for concrete type resolution" );
7373
}
74-
case WILDCARD_TYPE -> {
75-
final WildcardTypeDetails wildcardType = type.asWildcardType();
76-
if ( wildcardType.getBound() != null ) {
77-
return wildcardType.getBound();
78-
}
79-
return OBJECT_TYPE_DETAILS;
80-
}
8174
default -> {
8275
throw new UnsupportedOperationException( "Unknown TypeDetails kind - " + type.getTypeKind() );
8376
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package org.hibernate.models.members;
2+
3+
import java.util.List;
4+
5+
import org.hibernate.models.SourceModelTestHelper;
6+
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
7+
import org.hibernate.models.spi.ClassDetails;
8+
import org.hibernate.models.spi.FieldDetails;
9+
import org.hibernate.models.spi.ParameterizedTypeDetails;
10+
import org.hibernate.models.spi.TypeDetails;
11+
import org.hibernate.models.spi.WildcardTypeDetails;
12+
13+
import org.junit.jupiter.api.Test;
14+
15+
import org.jboss.jandex.Index;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
19+
/**
20+
* @author Marco Belladelli
21+
*/
22+
public class UnboundWildcardTests {
23+
24+
@Test
25+
void testWildcardMembersWithJandex() {
26+
final Index index = SourceModelTestHelper.buildJandexIndex( Thing.class );
27+
testWildcardMembers( index );
28+
}
29+
30+
@Test
31+
void testWildcardMembersWithoutJandex() {
32+
testWildcardMembers( null );
33+
}
34+
35+
void testWildcardMembers(Index index) {
36+
final SourceModelBuildingContextImpl buildingContext = SourceModelTestHelper.createBuildingContext(
37+
index,
38+
Thing.class
39+
);
40+
41+
final ClassDetails classDetails = buildingContext.getClassDetailsRegistry()
42+
.getClassDetails( Thing.class.getName() );
43+
44+
{
45+
final FieldDetails parent = classDetails.findFieldByName( "parent" );
46+
final TypeDetails parentType = parent.getType();
47+
assertThat( parentType.isResolved() ).isTrue();
48+
assertThat( parentType.determineRawClass().toJavaClass() ).isEqualTo( Thing.class );
49+
final WildcardTypeDetails parentWildcard = parentType.asParameterizedType()
50+
.getArguments()
51+
.get( 0 )
52+
.asWildcardType();
53+
assertThat( parentWildcard.isResolved() ).isTrue();
54+
assertThat( parentWildcard.determineRawClass().toJavaClass() ).isEqualTo( Object.class );
55+
56+
final TypeDetails parentRelativeType = parent.resolveRelativeType( classDetails );
57+
assertThat( parentRelativeType.isResolved() ).isTrue();
58+
assertThat( parentRelativeType.determineRawClass().toJavaClass() ).isEqualTo( Thing.class );
59+
final WildcardTypeDetails parentRelativeWildcard = parentRelativeType.asParameterizedType()
60+
.getArguments()
61+
.get( 0 )
62+
.asWildcardType();
63+
assertThat( parentRelativeWildcard.isResolved() ).isTrue();
64+
assertThat( parentRelativeWildcard.determineRawClass().toJavaClass() ).isEqualTo( Object.class );
65+
}
66+
67+
{
68+
final FieldDetails children = classDetails.findFieldByName( "children" );
69+
final TypeDetails childrenType = children.getType();
70+
assertThat( childrenType.isResolved() ).isTrue();
71+
assertThat( childrenType.determineRawClass().toJavaClass() ).isEqualTo( List.class );
72+
final ParameterizedTypeDetails listType = childrenType.asParameterizedType()
73+
.getArguments()
74+
.get( 0 )
75+
.asParameterizedType();
76+
assertThat( listType.isResolved() ).isTrue();
77+
assertThat( listType.determineRawClass().toJavaClass() ).isEqualTo( Thing.class );
78+
final WildcardTypeDetails childrenWildcard = listType.getArguments().get( 0 ).asWildcardType();
79+
assertThat( childrenWildcard.isResolved() ).isTrue();
80+
assertThat( childrenWildcard.determineRawClass().toJavaClass() ).isEqualTo( Object.class );
81+
82+
final TypeDetails childrenRelativeType = children.resolveRelativeType( classDetails );
83+
assertThat( childrenRelativeType.isResolved() ).isTrue();
84+
assertThat( childrenRelativeType.determineRawClass().toJavaClass() ).isEqualTo( List.class );
85+
final ParameterizedTypeDetails listRelativeType = childrenRelativeType.asParameterizedType()
86+
.getArguments()
87+
.get( 0 )
88+
.asParameterizedType();
89+
assertThat( listRelativeType.isResolved() ).isTrue();
90+
assertThat( listRelativeType.determineRawClass().toJavaClass() ).isEqualTo( Thing.class );
91+
final WildcardTypeDetails childrenRelativeWildcard = listRelativeType.getArguments().get( 0 ).asWildcardType();
92+
assertThat( childrenRelativeWildcard.isResolved() ).isTrue();
93+
assertThat( childrenRelativeWildcard.determineRawClass().toJavaClass() ).isEqualTo( Object.class );
94+
}
95+
}
96+
97+
@SuppressWarnings( "unused" )
98+
static class Thing<T> {
99+
Thing<?> parent;
100+
101+
List<Thing<? extends Object>> children;
102+
}
103+
}

0 commit comments

Comments
 (0)