Skip to content

Commit 6efbaa9

Browse files
authored
Bugfix/retain generics (#10)
* Reworked how generics work - huge improvement * Change version number
1 parent a34bd86 commit 6efbaa9

35 files changed

Lines changed: 289 additions & 123 deletions

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ apply plugin: 'maven'
1515
apply from: 'publish.gradle'
1616

1717
group = 'com.jparams'
18-
version = '2.0.2'
18+
version = '2.0.3'
1919

2020
sourceCompatibility = 1.8
2121

src/main/java/com/jparams/object/builder/ObjectBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private ObjectBuilder(final ObjectFactory objectFactory)
3333
*/
3434
public <T> Build<T> buildInstanceOf(final Class<T> clazz)
3535
{
36-
final Type<?> type = TypeResolver.resolve(ifNotNull(clazz));
36+
final Type<?> type = TypeResolver.resolveType(ifNotNull(clazz));
3737
final Path path = new Path("$", type, null);
3838
return objectFactory.create(path);
3939
}

src/main/java/com/jparams/object/builder/provider/ArrayProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public boolean supports(final Type<?> type)
1818
public Object[] provide(final Context context)
1919
{
2020
final Class<?> componentType = context.getPath().getType().getJavaType().getComponentType();
21-
final Type<?> type = TypeResolver.resolve(componentType);
21+
final Type<?> type = TypeResolver.resolveType(context.getPath(), componentType);
2222
final Object[] array = (Object[]) Array.newInstance(componentType, 1);
2323
array[0] = context.createChild("[0]", type);
2424
return array;

src/main/java/com/jparams/object/builder/provider/ConcurrentMapProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public boolean supports(final Type<?> type)
2525
return map;
2626
}
2727

28-
final Type<?> keyType = context.getPath().getType().getGenerics().get(0);
29-
final Type<?> valueType = context.getPath().getType().getGenerics().get(1);
28+
final Type<?> keyType = context.getPath().getType().getGenerics().get(0).getType();
29+
final Type<?> valueType = context.getPath().getType().getGenerics().get(1).getType();
3030
final Object key = context.createChild("[0.key]", keyType);
3131
final Object value = context.createChild("[0.value]", valueType);
3232
map.put(key, value);

src/main/java/com/jparams/object/builder/provider/DequeProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public Deque<?> provide(final Context context)
2525
return deque;
2626
}
2727

28-
final Type<?> type = context.getPath().getType().getGenerics().get(0);
28+
final Type<?> type = context.getPath().getType().getGenerics().get(0).getType();
2929
deque.add(context.createChild("[0]", type));
3030
return deque;
3131
}

src/main/java/com/jparams/object/builder/provider/InterfaceProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public Object invoke(final Object proxy, final Method method, final Object[] arg
4646
}
4747

4848
final String methodName = String.format("%s(%s)", method.getName(), args == null || args.length == 0 ? "" : Arrays.toString(args));
49-
final Type<?> type = TypeResolver.resolve(method);
49+
final Type<?> type = TypeResolver.resolveReturnType(context.getPath(), method);
5050

5151
if (type == null)
5252
{

src/main/java/com/jparams/object/builder/provider/ListProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public List<?> provide(final Context context)
2323
return Collections.emptyList();
2424
}
2525

26-
final Type<?> type = context.getPath().getType().getGenerics().get(0);
26+
final Type<?> type = context.getPath().getType().getGenerics().get(0).getType();
2727
final Object child = context.createChild("[0]", type);
2828
return Collections.singletonList(child);
2929
}

src/main/java/com/jparams/object/builder/provider/MapProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public boolean supports(final Type<?> type)
2323
return Collections.emptyMap();
2424
}
2525

26-
final Type<?> keyType = context.getPath().getType().getGenerics().get(0);
27-
final Type<?> valueType = context.getPath().getType().getGenerics().get(1);
26+
final Type<?> keyType = context.getPath().getType().getGenerics().get(0).getType();
27+
final Type<?> valueType = context.getPath().getType().getGenerics().get(1).getType();
2828
final Object key = context.createChild("[0.key]", keyType);
2929
final Object value = context.createChild("[0.value]", valueType);
3030
return Collections.singletonMap(key, value);

src/main/java/com/jparams/object/builder/provider/ObjectProvider.java

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

1111
import com.jparams.object.builder.BuildStrategy;
1212
import com.jparams.object.builder.Context;
13+
import com.jparams.object.builder.path.Path;
1314
import com.jparams.object.builder.type.Type;
1415
import com.jparams.object.builder.type.TypeMap;
1516
import com.jparams.object.builder.type.TypeResolver;
@@ -85,7 +86,7 @@ private Object createInstanceWithConstructor(final Context context, final Constr
8586
for (int i = 0; i < constructor.getParameters().length; i++)
8687
{
8788
final Parameter parameter = constructor.getParameters()[i];
88-
final Type<?> type = TypeResolver.resolve(parameter);
89+
final Type<?> type = TypeResolver.resolveParameterType(context.getPath(), parameter);
8990
arguments[i] = context.createChild(name + "[" + i + "]", type);
9091
}
9192

@@ -131,19 +132,40 @@ private Object createInstanceWithFieldInjection(final Context context)
131132

132133
private void injectFields(final Object object, final Context context)
133134
{
134-
for (final Field field : ObjectUtils.getFields(object.getClass()))
135+
Path path = context.getPath();
136+
137+
while (true)
135138
{
136-
try
139+
final Class<?> clazz = path.getType().getJavaType();
140+
141+
for (final Field field : clazz.getDeclaredFields())
137142
{
138-
final Type<?> type = TypeResolver.resolve(field);
139-
final Object instance = context.createChild(field.getName(), type);
140-
field.setAccessible(true);
141-
field.set(object, instance);
143+
if (Modifier.isStatic(field.getModifiers()))
144+
{
145+
continue;
146+
}
147+
148+
try
149+
{
150+
final Type<?> type = TypeResolver.resolveFieldType(path, field);
151+
final Object instance = context.createChild(field.getName(), type);
152+
field.setAccessible(true);
153+
field.set(object, instance);
154+
}
155+
catch (final Exception e)
156+
{
157+
context.logError("Failed to inject field [" + field.getName() + "]", e);
158+
}
142159
}
143-
catch (final Exception e)
160+
161+
final Type<?> superClass = TypeResolver.resolveType(path, clazz.getGenericSuperclass());
162+
163+
if (superClass == null)
144164
{
145-
context.logError("Failed to inject field [" + field.getName() + "]", e);
165+
return;
146166
}
167+
168+
path = new Path("$super", superClass, path);
147169
}
148170
}
149171
}

src/main/java/com/jparams/object/builder/provider/QueueProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public Queue<?> provide(final Context context)
2525
return queue;
2626
}
2727

28-
final Type<?> type = context.getPath().getType().getGenerics().get(0);
28+
final Type<?> type = context.getPath().getType().getGenerics().get(0).getType();
2929
queue.add(context.createChild("[0]", type));
3030
return queue;
3131
}

0 commit comments

Comments
 (0)