能够推断出struct数组成员的类型,暂时只支持1层深度
This commit is contained in:
@@ -106,25 +106,41 @@ export class Field {
|
|||||||
if (this.children) {
|
if (this.children) {
|
||||||
let named_fields: {[key: string]: Field[]} = {};
|
let named_fields: {[key: string]: Field[]} = {};
|
||||||
for (const c of this.children) {
|
for (const c of this.children) {
|
||||||
c.constant_array_length = this.constant_array_length;
|
|
||||||
c.build();
|
|
||||||
let arr = named_fields[c.name] || [];
|
let arr = named_fields[c.name] || [];
|
||||||
arr.push(c);
|
arr.push(c);
|
||||||
named_fields[c.name] = arr;
|
named_fields[c.name] = arr;
|
||||||
}
|
}
|
||||||
for (const [name, fields] of Object.entries(named_fields)) {
|
for (const [name, fields] of Object.entries(named_fields)) {
|
||||||
if (fields.length > 1) {
|
if (fields.length > 1) { // 推断数组类型
|
||||||
let indeies = fields.map(f => Field.TYPE_ORDER.indexOf(f.type));
|
const type = this.infer_field_type(fields);
|
||||||
indeies = indeies.filter(idx => idx >= 0);
|
|
||||||
const type = Field.TYPE_ORDER[Math.min(...indeies)];
|
|
||||||
for (const f of fields) {
|
for (const f of fields) {
|
||||||
f._is_array = true;
|
f._is_array = true;
|
||||||
f.type = type;
|
f.type = type;
|
||||||
|
if (type === DataType.struct) { // 数组元素的类型
|
||||||
|
for (const keys of fields.map( f => f.children.map(cf => cf.name) )) {
|
||||||
|
for (const key of keys) {
|
||||||
|
let same_name_fileds = fields.map( f => f.children.find( cf => cf.name === key));
|
||||||
|
const ctype = this.infer_field_type(same_name_fileds);
|
||||||
|
same_name_fileds.forEach( f => { f.type = ctype });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
for (const c of this.children) {
|
||||||
|
c.constant_array_length = this.constant_array_length;
|
||||||
|
c.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected infer_field_type(fields: Field[]) {
|
||||||
|
let indeies = fields.map(f => Field.TYPE_ORDER.indexOf(f.type));
|
||||||
|
indeies = indeies.filter(idx => idx >= 0);
|
||||||
|
const type = Field.TYPE_ORDER[Math.min(...indeies)];
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
/** 解析一条数据 */
|
/** 解析一条数据 */
|
||||||
public parse_row(row: RawTableCell[]) {
|
public parse_row(row: RawTableCell[]) {
|
||||||
|
|||||||
Reference in New Issue
Block a user