Skip to content

Commit db5b526

Browse files
committed
Minor clean up wrt #33
1 parent fecf425 commit db5b526

File tree

6 files changed

+61
-17
lines changed

6 files changed

+61
-17
lines changed

VERSION.txt

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ Java ClassMate project: licensed under Apache License 2.0
33

44
Release notes:
55

6+
1.3.3 (28-Sep-2016)
7+
8+
#33: "ghost" type parameter in field
9+
(reported, fix contributed by web-online@github)
10+
611
1.3.2 (25-Sep-2016)
712

813
#30: ArrayIndexOutOfBoundsException when resolving Object.class

src/main/java/com/fasterxml/classmate/ResolvedType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public final boolean canCreateSubtype(Class<?> subtype) {
9191
/**
9292
* Returns ordered list of interfaces (in declaration order) that this type
9393
* implements.
94-
*
94+
*
9595
* @return List of interfaces this type implements, if any; empty list if none
9696
*/
9797
public abstract List<ResolvedType> getImplementedInterfaces();

src/main/java/com/fasterxml/classmate/TypeResolver.java

+5-7
Original file line numberDiff line numberDiff line change
@@ -404,19 +404,17 @@ private ResolvedType _constructType(ClassStack context, Class<?> rawType, TypeBi
404404
ResolvedType elementType = _fromAny(context, rawType.getComponentType(), typeBindings);
405405
return new ResolvedArrayType(rawType, typeBindings, elementType);
406406
}
407+
// Work-around/fix for [#33]: if the type has no type parameters, don't include
408+
// typeBindings in the ResolvedType
409+
if (!typeBindings.isEmpty() && rawType.getTypeParameters().length == 0) {
410+
typeBindings = TypeBindings.emptyBindings();
411+
}
407412
// For other types super interfaces are needed...
408413
if (rawType.isInterface()) {
409414
return new ResolvedInterfaceType(rawType, typeBindings,
410415
_resolveSuperInterfaces(context, rawType, typeBindings));
411416

412417
}
413-
// for issue 33: if the type has no type parameters,
414-
// don't include typeBindings in the ResolvedType
415-
if (rawType.getTypeParameters().length == 0) {
416-
return new ResolvedObjectType(rawType, null,
417-
_resolveSuperClass(context, rawType, typeBindings),
418-
_resolveSuperInterfaces(context, rawType, typeBindings));
419-
}
420418
return new ResolvedObjectType(rawType, typeBindings,
421419
_resolveSuperClass(context, rawType, typeBindings),
422420
_resolveSuperInterfaces(context, rawType, typeBindings));

src/main/java/com/fasterxml/classmate/types/ResolvedInterfaceType.java

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
public class ResolvedInterfaceType extends ResolvedType
1111
{
12-
1312
/**
1413
* List of interfaces this type implements; may be empty but never null
1514
*/

src/test/java/com/fasterxml/classmate/TestSubtypeResolution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public void testValidGenericSubClass()
178178

179179
// and must look the same in other respects too:
180180
assertEquals("Ljava/util/HashMap<Ljava/lang/String;Ljava/lang/Long;>;", subtype.getSignature());
181-
assertEquals("java.util.HashMap<java.lang.String,java.lang.Long> extends java.util.AbstractMap<java.lang.String,java.lang.Long> implements java.util.Map<java.lang.String,java.lang.Long>,java.lang.Cloneable<java.lang.String,java.lang.Long>,java.io.Serializable<java.lang.String,java.lang.Long>",
181+
assertEquals("java.util.HashMap<java.lang.String,java.lang.Long> extends java.util.AbstractMap<java.lang.String,java.lang.Long> implements java.util.Map<java.lang.String,java.lang.Long>,java.lang.Cloneable,java.io.Serializable",
182182
subtype.getFullDescription());
183183
}
184184

src/test/java/com/fasterxml/classmate/members/GhostTypeParameterInFieldTest.java

+49-7
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,26 @@
66

77
import com.fasterxml.classmate.*;
88

9-
// for issue "ghost" type parameter in field:
9+
// for [#33]: "ghost" parameter
1010
public class GhostTypeParameterInFieldTest
1111
extends TestCase
1212
{
13-
public static class A<T extends Number> {
13+
public static class GenericWithClass<T extends Number> {
1414
public List<T> listOfT;
1515
public T t;
1616
public Integer i;
1717
}
1818

19-
public void testGhostTypeParameterInField()
19+
public static class GenericWithInterface<T extends Number> {
20+
public List<T> listOfT;
21+
public T t;
22+
public Number i;
23+
}
24+
25+
public void testGhostTypeParameterWithClass()
2026
{
2127
TypeResolver resolver = new TypeResolver();
22-
ResolvedType resolvedType = resolver.resolve(A.class, Integer.class);
28+
ResolvedType resolvedType = resolver.resolve(GenericWithClass.class, Integer.class);
2329
MemberResolver memberResolver = new MemberResolver(resolver);
2430
ResolvedTypeWithMembers resolvedTypeWithMembers = memberResolver.resolve(resolvedType, null, null);
2531
ResolvedField[] fields = resolvedTypeWithMembers.getMemberFields();
@@ -33,7 +39,7 @@ public void testGhostTypeParameterInField()
3339
ResolvedType listOfT_Type = listOfT_Field.getType();
3440
assertEquals(List.class, listOfT_Type.getErasedType());
3541
List<ResolvedType> listOfT_TypeParams = listOfT_Type.getTypeParameters();
36-
assertEquals("Expected 1 type paramter for listOfT, got " + listOfT_TypeParams.size() + ": " + listOfT_TypeParams, 1, listOfT_TypeParams.size());
42+
assertEquals("Expected 1 type parameter for listOfT, got " + listOfT_TypeParams.size() + ": " + listOfT_TypeParams, 1, listOfT_TypeParams.size());
3743
assertEquals(Integer.class, listOfT_TypeParams.get(0).getErasedType());
3844

3945
// field t
@@ -42,15 +48,51 @@ public void testGhostTypeParameterInField()
4248
ResolvedType t_Type = t_Field.getType();
4349
assertEquals(Integer.class, t_Type.getErasedType());
4450
List<ResolvedType> t_TypeParams = t_Type.getTypeParameters();
45-
assertEquals("Expected 0 type paramter for t, got " + t_TypeParams.size() + ": " + t_TypeParams, 0, t_TypeParams.size());
51+
assertEquals("Expected 0 type parameter for t, got " + t_TypeParams.size() + ": " + t_TypeParams, 0, t_TypeParams.size());
4652

4753
// field i
4854
ResolvedField i_Field = fields[2];
4955
assertEquals("i", i_Field.getName());
5056
ResolvedType i_Type = i_Field.getType();
5157
assertEquals(Integer.class, i_Type.getErasedType());
5258
List<ResolvedType> i_TypeParams = i_Type.getTypeParameters();
53-
assertEquals("Expected 0 type paramter for i, got " + i_TypeParams.size() + ": " + i_TypeParams, 0, i_TypeParams.size());
59+
assertEquals("Expected 0 type parameter for i, got " + i_TypeParams.size() + ": " + i_TypeParams, 0, i_TypeParams.size());
5460
}
5561

62+
public void testGhostTypeParameterWithInterface()
63+
{
64+
TypeResolver resolver = new TypeResolver();
65+
ResolvedType resolvedType = resolver.resolve(GenericWithInterface.class, Integer.class);
66+
MemberResolver memberResolver = new MemberResolver(resolver);
67+
ResolvedTypeWithMembers resolvedTypeWithMembers = memberResolver.resolve(resolvedType, null, null);
68+
ResolvedField[] fields = resolvedTypeWithMembers.getMemberFields();
69+
70+
// test fields
71+
assertEquals(3, fields.length);
72+
73+
// field List<T> listOfT
74+
ResolvedField listOfT_Field = fields[0];
75+
assertEquals("listOfT", listOfT_Field.getName());
76+
ResolvedType listOfT_Type = listOfT_Field.getType();
77+
assertEquals(List.class, listOfT_Type.getErasedType());
78+
List<ResolvedType> listOfT_TypeParams = listOfT_Type.getTypeParameters();
79+
assertEquals("Expected 1 type parameter for listOfT, got " + listOfT_TypeParams.size() + ": " + listOfT_TypeParams, 1, listOfT_TypeParams.size());
80+
assertEquals(Integer.class, listOfT_TypeParams.get(0).getErasedType());
81+
82+
// field t
83+
ResolvedField t_Field = fields[1];
84+
assertEquals("t", t_Field.getName());
85+
ResolvedType t_Type = t_Field.getType();
86+
assertEquals(Integer.class, t_Type.getErasedType());
87+
List<ResolvedType> t_TypeParams = t_Type.getTypeParameters();
88+
assertEquals("Expected 0 type parameter for t, got " + t_TypeParams.size() + ": " + t_TypeParams, 0, t_TypeParams.size());
89+
90+
// field i
91+
ResolvedField i_Field = fields[2];
92+
assertEquals("i", i_Field.getName());
93+
ResolvedType i_Type = i_Field.getType();
94+
assertEquals(Number.class, i_Type.getErasedType());
95+
List<ResolvedType> i_TypeParams = i_Type.getTypeParameters();
96+
assertEquals("Expected 0 type parameter for i, got " + i_TypeParams.size() + ": " + i_TypeParams, 0, i_TypeParams.size());
97+
}
5698
}

0 commit comments

Comments
 (0)