Skip to content

Commit 090bd5b

Browse files
mbelladesebersole
authored andcommitted
Improvements to relative generic type resolution
* Introduce the concept of `declaringType` for type variables * Better handling of subtypes re-declaring a type variable with the same identifier * Correctly handle nested recursive type resolution
1 parent df2f29f commit 090bd5b

24 files changed

+441
-146
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.models.spi.ArrayTypeDetails;
1414
import org.hibernate.models.spi.ClassDetails;
1515
import org.hibernate.models.spi.TypeDetails;
16+
import org.hibernate.models.spi.TypeVariableDetails;
1617

1718
/**
1819
* @author Steve Ebersole
@@ -84,9 +85,9 @@ public boolean isImplementor(Class<?> checkType) {
8485
}
8586

8687
@Override
87-
public TypeDetails resolveTypeVariable(String identifier) {
88+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
8889
if ( constituentType.getTypeKind() == Kind.PARAMETERIZED_TYPE ) {
89-
return constituentType.asParameterizedType().resolveTypeVariable( identifier );
90+
return constituentType.asParameterizedType().resolveTypeVariable( typeVariable );
9091
}
9192
return null;
9293
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.models.spi.ClassDetails;
1313
import org.hibernate.models.spi.ClassTypeDetails;
1414
import org.hibernate.models.spi.TypeDetails;
15+
import org.hibernate.models.spi.TypeVariableDetails;
1516

1617
/**
1718
* @author Steve Ebersole
@@ -42,8 +43,8 @@ public Kind getTypeKind() {
4243
}
4344

4445
@Override
45-
public TypeDetails resolveTypeVariable(String identifier) {
46-
return getClassDetails().resolveTypeVariable( identifier );
46+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
47+
return getClassDetails().resolveTypeVariable( typeVariable );
4748
}
4849

4950
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ public TypeDetails caseWildcardType(WildcardTypeDetails wildcardType) {
8686
@Override
8787
public TypeDetails caseTypeVariable(TypeVariableDetails typeVariable) {
8888
if ( typeVariable.isImplementor( Collection.class ) ) {
89-
return memberTypeDetails.resolveTypeVariable( typeVariable.getIdentifier() );
89+
return memberTypeDetails.resolveTypeVariable( typeVariable );
9090
}
9191
return null;
9292
}
9393

9494
@Override
9595
public TypeDetails caseTypeVariableReference(TypeVariableReferenceDetails typeVariableReference) {
9696
if ( typeVariableReference.isImplementor( Collection.class ) ) {
97-
return memberTypeDetails.resolveTypeVariable( typeVariableReference.getIdentifier() );
97+
return memberTypeDetails.resolveTypeVariable( typeVariableReference.getTarget() );
9898
}
9999
return null;
100100
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ public TypeDetails caseWildcardType(WildcardTypeDetails wildcardType) {
8686
@Override
8787
public TypeDetails caseTypeVariable(TypeVariableDetails typeVariable) {
8888
if ( typeVariable.isImplementor( Map.class ) ) {
89-
return memberTypeDetails.resolveTypeVariable( typeVariable.getIdentifier() );
89+
return memberTypeDetails.resolveTypeVariable( typeVariable );
9090
}
9191
return null;
9292
}
9393

9494
@Override
9595
public TypeDetails caseTypeVariableReference(TypeVariableReferenceDetails typeVariableReference) {
9696
if ( typeVariableReference.isImplementor( Map.class ) ) {
97-
return memberTypeDetails.resolveTypeVariable( typeVariableReference.getIdentifier() );
97+
return memberTypeDetails.resolveTypeVariable( typeVariableReference.getTarget() );
9898
}
9999
return null;
100100
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ public TypeDetails caseWildcardType(WildcardTypeDetails wildcardType) {
8686
@Override
8787
public TypeDetails caseTypeVariable(TypeVariableDetails typeVariable) {
8888
if ( typeVariable.isImplementor( Map.class ) ) {
89-
return memberTypeDetails.resolveTypeVariable( typeVariable.getIdentifier() );
89+
return memberTypeDetails.resolveTypeVariable( typeVariable );
9090
}
9191
return null;
9292
}
9393

9494
@Override
9595
public TypeDetails caseTypeVariableReference(TypeVariableReferenceDetails typeVariableReference) {
9696
if ( typeVariableReference.isImplementor( Map.class ) ) {
97-
return memberTypeDetails.resolveTypeVariable( typeVariableReference.getIdentifier() );
97+
return memberTypeDetails.resolveTypeVariable( typeVariableReference.getTarget() );
9898
}
9999
return null;
100100
}

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.hibernate.models.spi.TypeVariableDetails;
1616
import org.hibernate.models.spi.TypeVariableScope;
1717

18+
import static org.hibernate.models.spi.TypeDetailsHelper.resolveTypeVariableFromParameterizedType;
19+
1820
/**
1921
* @author Steve Ebersole
2022
*/
@@ -45,16 +47,7 @@ public TypeVariableScope getOwner() {
4547
}
4648

4749
@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;
50+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
51+
return resolveTypeVariableFromParameterizedType( this, typeVariable );
5952
}
6053
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.hibernate.models.spi.ClassDetails;
1111
import org.hibernate.models.spi.PrimitiveTypeDetails;
1212
import org.hibernate.models.spi.TypeDetails;
13+
import org.hibernate.models.spi.TypeVariableDetails;
1314

1415
/**
1516
* @author Steve Ebersole
@@ -31,7 +32,7 @@ public PrimitiveTypeDetails asPrimitiveType() {
3132
}
3233

3334
@Override
34-
public TypeDetails resolveTypeVariable(String identifier) {
35+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
3536
return this;
3637
}
3738

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

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

1010
import java.util.List;
1111

12+
import org.hibernate.models.spi.ClassDetails;
1213
import org.hibernate.models.spi.TypeDetails;
1314
import org.hibernate.models.spi.TypeVariableDetails;
1415

@@ -17,12 +18,14 @@
1718
*/
1819
public class TypeVariableDetailsImpl implements TypeVariableDetails {
1920
private final String identifier;
21+
private final ClassDetails declaringType;
2022
private final List<TypeDetails> bounds;
2123

2224
private final String name;
2325

24-
public TypeVariableDetailsImpl(String identifier, List<TypeDetails> bounds) {
26+
public TypeVariableDetailsImpl(String identifier, ClassDetails declaringType, List<TypeDetails> bounds) {
2527
this.identifier = identifier;
28+
this.declaringType = declaringType;
2629
this.bounds = bounds;
2730

2831
this.name = calculateName( bounds );
@@ -39,6 +42,10 @@ private String calculateName(List<TypeDetails> bounds) {
3942
return identifier;
4043
}
4144

45+
@Override public ClassDetails getDeclaringType() {
46+
return declaringType;
47+
}
48+
4249
@Override public List<TypeDetails> getBounds() {
4350
return bounds;
4451
}
@@ -57,8 +64,8 @@ public boolean isImplementor(Class<?> checkType) {
5764
}
5865

5966
@Override
60-
public TypeDetails resolveTypeVariable(String identifier) {
61-
return this.identifier.equals( identifier ) ? this : null;
67+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
68+
return identifier.equals( typeVariable.getIdentifier() ) ? this : null;
6269
}
6370

6471
@Override

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public boolean isImplementor(Class<?> checkType) {
6161
}
6262

6363
@Override
64-
public TypeDetails resolveTypeVariable(String identifier) {
65-
return this.identifier.equals( identifier ) ? target : null;
64+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
65+
return this.identifier.equals( typeVariable.getIdentifier() ) ? target : null;
6666
}
6767
}

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

Lines changed: 2 additions & 1 deletion
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.TypeDetails;
14+
import org.hibernate.models.spi.TypeVariableDetails;
1415
import org.hibernate.models.spi.VoidTypeDetails;
1516

1617
/**
@@ -41,7 +42,7 @@ public VoidTypeDetails asVoidType() {
4142
}
4243

4344
@Override
44-
public TypeDetails resolveTypeVariable(String identifier) {
45+
public TypeDetails resolveTypeVariable(TypeVariableDetails typeVariable) {
4546
return this;
4647
}
4748

0 commit comments

Comments
 (0)