diff --git a/src/main/java/ru/mingun/kaitai/struct/tree/ChunkNode.java b/src/main/java/ru/mingun/kaitai/struct/tree/ChunkNode.java index b6d1838..ee37f85 100644 --- a/src/main/java/ru/mingun/kaitai/struct/tree/ChunkNode.java +++ b/src/main/java/ru/mingun/kaitai/struct/tree/ChunkNode.java @@ -77,9 +77,9 @@ public abstract class ChunkNode extends ValueNode { * @throws ReflectiveOperationException If {@code value} is {@link KaitaiStruct} * and it was compiled without debug info (which includes position information) */ - protected ChunkNode create(String name, Object value, long offset, long start, long end) throws ReflectiveOperationException { + protected ChunkNode create(String name, Object value, Class valueClass, long offset, long start, long end) throws ReflectiveOperationException { return value instanceof KaitaiStruct ? new StructNode(name, (KaitaiStruct)value, this, offset, start, end) - : new SimpleNode(name, value, this, offset, start, end); + : new SimpleNode(name, value, valueClass, this, offset, start, end); } } diff --git a/src/main/java/ru/mingun/kaitai/struct/tree/ListNode.java b/src/main/java/ru/mingun/kaitai/struct/tree/ListNode.java index e160668..5bbd8c8 100644 --- a/src/main/java/ru/mingun/kaitai/struct/tree/ListNode.java +++ b/src/main/java/ru/mingun/kaitai/struct/tree/ListNode.java @@ -23,11 +23,12 @@ */ package ru.mingun.kaitai.struct.tree; +import javax.swing.tree.TreeNode; import java.util.ArrayList; -import static java.util.Collections.enumeration; import java.util.Enumeration; import java.util.List; -import javax.swing.tree.TreeNode; + +import static java.util.Collections.enumeration; /** * Node, that represents a repeated data in struct definition. An each repeated value @@ -37,6 +38,10 @@ */ public class ListNode extends ChunkNode { private final List value; + + /** The parameter type of value. */ + private final Class valueClass; + /** Lazy populated list of child nodes. */ private List children; /** Start positions in root stream of each value object in {@link #value}. */ @@ -44,13 +49,14 @@ public class ListNode extends ChunkNode { /** Endo positions in root stream of each value object in {@link #value} (exclusive). */ private final List arrEnd; - ListNode(String name, List value, StructNode parent, + ListNode(String name, List value, Class valueClass, StructNode parent, long offset, long start, long end, List arrStart, List arrEnd ) { super(name, parent, offset, start, end); this.value = value; + this.valueClass = valueClass; this.arrStart = arrStart; this.arrEnd = arrEnd; } @@ -91,7 +97,7 @@ private List init() { try { final int s = arrStart.get(index); final int e = arrEnd.get(index); - children.add(create("[" + index + ']', obj, 0, s, e)); + children.add(create("[" + index + ']', obj, valueClass, 0, s, e)); ++index; } catch (ReflectiveOperationException ex) { throw new UnsupportedOperationException("Can't get list value at index " + index, ex); diff --git a/src/main/java/ru/mingun/kaitai/struct/tree/SimpleNode.java b/src/main/java/ru/mingun/kaitai/struct/tree/SimpleNode.java index 30c6939..23932ca 100644 --- a/src/main/java/ru/mingun/kaitai/struct/tree/SimpleNode.java +++ b/src/main/java/ru/mingun/kaitai/struct/tree/SimpleNode.java @@ -37,14 +37,20 @@ public class SimpleNode extends ChunkNode { /** Parsed value of non-constructed type. */ private final Object value; - SimpleNode(String name, Object value, ChunkNode parent, long offset, long start, long end) { + /** Static type of value, to identify the type when value is null. */ + private final Class valueClass; + + SimpleNode(String name, Object value, Class valueClass, ChunkNode parent, long offset, long start, long end) { super(name, parent, offset, start, end); this.value = value; + this.valueClass = valueClass; } @Override public Object getValue() { return value; } + public Class getValueClass() { return valueClass; } + // @Override public ChunkNode getChildAt(int childIndex) { diff --git a/src/main/java/ru/mingun/kaitai/struct/tree/StructNode.java b/src/main/java/ru/mingun/kaitai/struct/tree/StructNode.java index 918ce80..e330cfb 100644 --- a/src/main/java/ru/mingun/kaitai/struct/tree/StructNode.java +++ b/src/main/java/ru/mingun/kaitai/struct/tree/StructNode.java @@ -26,6 +26,8 @@ import io.kaitai.struct.KaitaiStruct; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import static java.util.Collections.enumeration; @@ -160,9 +162,13 @@ private ChunkNode create(Method getter) throws ReflectiveOperationException { if (List.class.isAssignableFrom(getter.getReturnType())) { final List sa = arrStart.get(name); final List se = arrEnd.get(name); - return new ListNode(name, (List)field, this, offset, s, e, sa, se); + + final ParameterizedType returnType = (ParameterizedType) getter.getGenericReturnType(); + final Type typeArgument = returnType.getActualTypeArguments()[0]; + + return new ListNode(name, (List) field, (Class) typeArgument, this, offset, s, e, sa, se); } - return create(name, field, start, s, e); + return create(name, field, getter.getReturnType(), start, s, e); } private ArrayList init() {