Skip to content

Commit 4edb600

Browse files
mbelladesebersole
authored andcommitted
Improvements to generics and type resolution
1 parent 26691ed commit 4edb600

11 files changed

+69
-179
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@
1313
import org.hibernate.models.spi.ParameterizedTypeDetails;
1414
import org.hibernate.models.spi.TypeDetails;
1515
import org.hibernate.models.spi.TypeVariableDetails;
16+
import org.hibernate.models.spi.TypeVariableScope;
1617

1718
/**
1819
* @author Steve Ebersole
1920
*/
2021
public class ParameterizedTypeDetailsImpl implements ParameterizedTypeDetails {
2122
private final ClassDetails genericClassDetails;
2223
private final List<TypeDetails> arguments;
23-
private final TypeDetails owner;
24+
private final TypeVariableScope owner;
2425

25-
public ParameterizedTypeDetailsImpl(ClassDetails genericClassDetails, List<TypeDetails> arguments, TypeDetails owner) {
26+
public ParameterizedTypeDetailsImpl(ClassDetails genericClassDetails, List<TypeDetails> arguments, TypeVariableScope owner) {
2627
this.genericClassDetails = genericClassDetails;
2728
this.arguments = arguments;
2829
this.owner = owner;
@@ -39,7 +40,7 @@ public List<TypeDetails> getArguments() {
3940
}
4041

4142
@Override
42-
public TypeDetails getOwner() {
43+
public TypeVariableScope getOwner() {
4344
return owner;
4445
}
4546

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.models.spi.FieldDetails;
1616
import org.hibernate.models.spi.SourceModelBuildingContext;
1717
import org.hibernate.models.spi.TypeDetails;
18+
import org.hibernate.models.spi.TypeVariableScope;
1819

1920
/**
2021
* @author Steve Ebersole
@@ -86,12 +87,7 @@ public Member toJavaMember() {
8687
}
8788

8889
@Override
89-
public TypeDetails resolveRelativeType(TypeDetails container) {
90-
return type;
91-
}
92-
93-
@Override
94-
public TypeDetails resolveRelativeType(ClassDetails container) {
90+
public TypeDetails resolveRelativeType(TypeVariableScope container) {
9591
return type;
9692
}
9793

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

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.hibernate.models.spi.MethodDetails;
1717
import org.hibernate.models.spi.SourceModelBuildingContext;
1818
import org.hibernate.models.spi.TypeDetails;
19+
import org.hibernate.models.spi.TypeVariableScope;
1920

2021
/**
2122
* @author Steve Ebersole
@@ -102,12 +103,7 @@ public Member toJavaMember() {
102103
}
103104

104105
@Override
105-
public TypeDetails resolveRelativeType(TypeDetails container) {
106-
return type;
107-
}
108-
109-
@Override
110-
public TypeDetails resolveRelativeType(ClassDetails container) {
106+
public TypeDetails resolveRelativeType(TypeVariableScope container) {
111107
return type;
112108
}
113109

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

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.models.spi.SourceModelBuildingContext;
2222
import org.hibernate.models.spi.TypeDetails;
2323
import org.hibernate.models.spi.TypeDetailsHelper;
24+
import org.hibernate.models.spi.TypeVariableScope;
2425

2526
import org.jboss.jandex.AnnotationTarget;
2627
import org.jboss.jandex.MethodInfo;
@@ -132,31 +133,15 @@ public Method toJavaMember() {
132133
}
133134

134135
@Override
135-
public TypeDetails resolveRelativeType(TypeDetails container) {
136+
public TypeDetails resolveRelativeType(TypeVariableScope container) {
136137
if ( methodKind == GETTER || methodKind == SETTER ) {
137138
return type.determineRelativeType( container );
138139
}
139140
throw new IllegalStateException( "Method does not have a type - " + this );
140141
}
141142

142143
@Override
143-
public TypeDetails resolveRelativeType(ClassDetails container) {
144-
if ( methodKind == GETTER || methodKind == SETTER ) {
145-
return TypeDetailsHelper.resolveRelativeType( type, container );
146-
}
147-
throw new IllegalStateException( "Method does not have a type - " + this );
148-
}
149-
150-
@Override
151-
public ClassBasedTypeDetails resolveRelativeClassType(TypeDetails container) {
152-
if ( methodKind == GETTER || methodKind == SETTER ) {
153-
return TypeDetailsHelper.resolveRelativeClassType( type, container );
154-
}
155-
throw new IllegalStateException( "Method does not have a type - " + this );
156-
}
157-
158-
@Override
159-
public ClassBasedTypeDetails resolveRelativeClassType(ClassDetails container) {
144+
public ClassBasedTypeDetails resolveRelativeClassType(TypeVariableScope container) {
160145
if ( methodKind == GETTER || methodKind == SETTER ) {
161146
return TypeDetailsHelper.resolveRelativeClassType( type, container );
162147
}

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

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.models.spi.SourceModelBuildingContext;
2222
import org.hibernate.models.spi.TypeDetails;
2323
import org.hibernate.models.spi.TypeDetailsHelper;
24+
import org.hibernate.models.spi.TypeVariableScope;
2425

2526
import static org.hibernate.models.spi.MethodDetails.MethodKind.GETTER;
2627
import static org.hibernate.models.spi.MethodDetails.MethodKind.SETTER;
@@ -124,7 +125,7 @@ public Method toJavaMember() {
124125
}
125126

126127
@Override
127-
public TypeDetails resolveRelativeType(TypeDetails container) {
128+
public TypeDetails resolveRelativeType(TypeVariableScope container) {
128129
if ( methodKind == GETTER || methodKind == SETTER ) {
129130
return type.determineRelativeType( container );
130131
}
@@ -133,24 +134,7 @@ public TypeDetails resolveRelativeType(TypeDetails container) {
133134
}
134135

135136
@Override
136-
public TypeDetails resolveRelativeType(ClassDetails container) {
137-
if ( methodKind == GETTER || methodKind == SETTER ) {
138-
return TypeDetailsHelper.resolveRelativeType( type, container );
139-
}
140-
141-
throw new IllegalStateException( "Method does not have a type - " + this );
142-
}
143-
144-
@Override
145-
public ClassBasedTypeDetails resolveRelativeClassType(TypeDetails container) {
146-
if ( methodKind == GETTER || methodKind == SETTER ) {
147-
return TypeDetailsHelper.resolveRelativeClassType( type, container );
148-
}
149-
throw new IllegalStateException( "Method does not have a type - " + this );
150-
}
151-
152-
@Override
153-
public ClassBasedTypeDetails resolveRelativeClassType(ClassDetails container) {
137+
public ClassBasedTypeDetails resolveRelativeClassType(TypeVariableScope container) {
154138
if ( methodKind == GETTER || methodKind == SETTER ) {
155139
return TypeDetailsHelper.resolveRelativeClassType( type, container );
156140
}

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ default TypeDetails resolveTypeVariable(String identifier) {
128128
identifier,
129129
getTypeParameters()
130130
);
131-
if ( local != null ) {
131+
if ( local != null && local.isResolved() ) {
132132
return local;
133133
}
134134

@@ -166,10 +166,18 @@ default TypeDetails resolveTypeVariable(String identifier) {
166166
}
167167

168168
if ( getSuperClass() != null ) {
169-
return getSuperClass().resolveTypeVariable( identifier );
169+
final TypeDetails typeDetails = getSuperClass().resolveTypeVariable( identifier );
170+
if ( typeDetails != ClassBasedTypeDetails.OBJECT_TYPE_DETAILS ) {
171+
return typeDetails;
172+
}
170173
}
171174

172-
return ClassBasedTypeDetails.OBJECT_TYPE_DETAILS;
175+
return local != null ? local : ClassBasedTypeDetails.OBJECT_TYPE_DETAILS;
176+
}
177+
178+
@Override
179+
default ClassDetails determineRawClass() {
180+
return this;
173181
}
174182

175183
/**

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

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -237,33 +237,17 @@ default boolean isField() {
237237
* @apiNote It is only valid to call this on members which have a type, i.e. fields,
238238
* getters, setters and record components.
239239
*/
240-
default TypeDetails resolveRelativeType(TypeDetails container) {
241-
return getType().determineRelativeType( container );
242-
}
243-
244-
/**
245-
* Determine the type of the member relative to the given {@code container} class.
246-
*
247-
* @see #resolveRelativeType(TypeDetails)
248-
*/
249-
default TypeDetails resolveRelativeType(ClassDetails container) {
240+
default TypeDetails resolveRelativeType(TypeVariableScope container) {
250241
return getType().determineRelativeType( container );
251242
}
252243

253244
/**
254245
* Determine the concrete class of the member relative to the given {@code container} type.
255246
* <p/>
256-
* Similar to {@linkplain #resolveRelativeType(TypeDetails)}, but fully resolving the result
247+
* Similar to {@linkplain #resolveRelativeType(TypeVariableScope)}, but fully resolving the result
257248
* into the concrete class.
258249
*/
259-
default ClassBasedTypeDetails resolveRelativeClassType(TypeDetails container) {
260-
return TypeDetailsHelper.resolveRelativeClassType( getType(), container );
261-
}
262-
263-
/**
264-
* @see #resolveRelativeClassType(TypeDetails)
265-
*/
266-
default ClassBasedTypeDetails resolveRelativeClassType(ClassDetails container) {
250+
default ClassBasedTypeDetails resolveRelativeClassType(TypeVariableScope container) {
267251
return TypeDetailsHelper.resolveRelativeClassType( getType(), container );
268252
}
269253

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public interface ParameterizedTypeDetails extends ClassBasedTypeDetails {
2727

2828
List<TypeDetails> getArguments();
2929

30-
TypeDetails getOwner();
30+
TypeVariableScope getOwner();
3131

3232
@Override
3333
default ClassDetails getClassDetails() {

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

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,25 +122,11 @@ default boolean isResolved() {
122122
* <li>Passing {@code AnotherThing}, the result would be {@code ClassTypeDetails(Integer)}</li>
123123
* </ul>
124124
*/
125-
default TypeDetails determineRelativeType(TypeDetails container) {
125+
default TypeDetails determineRelativeType(TypeVariableScope container) {
126126
return TypeDetailsHelper.resolveRelativeType( this, container );
127127
}
128128

129-
/**
130-
* Determine the type relative to the passed {@code container}.
131-
* <p/>
132-
* Overload of {@linkplain #determineRelativeType(TypeDetails)}
133-
*/
134-
default TypeDetails determineRelativeType(ClassDetails container) {
135-
return TypeDetailsHelper.resolveRelativeType( this, container );
136-
}
137-
138-
/**
139-
* Determine the raw {@linkplain ClassDetails class} for the given type. Never returns {@code null}, opting
140-
* to return {@linkplain ClassDetails#OBJECT_CLASS_DETAILS Object} instead if the raw class is not known
141-
*
142-
* @return The raw class details, or {@linkplain ClassDetails#OBJECT_CLASS_DETAILS Object} if "not known".
143-
*/
129+
@Override
144130
default ClassDetails determineRawClass() {
145131
return TypeDetailsHelper.resolveRawClass( this );
146132
}

0 commit comments

Comments
 (0)