mergeObjectList function
Implementation
WithWarning<Map> mergeObjectList(List<dynamic> list, String path,
[int idx = -1]) {
List<Warning> warnings = <Warning>[];
Map obj = new Map();
for (var i = 0; i < list.length; i++) {
final toMerge = list[i];
if (toMerge is Map) {
toMerge.forEach((k, v) {
final String t = getTypeName(obj[k]);
if (obj[k] == null) {
obj[k] = v;
} else {
final String otherType = getTypeName(v);
if (t != otherType) {
if (t == 'int' && otherType == 'double') {
// if double was found instead of int, assign the double
obj[k] = v;
} else if (t != 'double' && otherType != 'int') {
// if types are not equal, then
int realIndex = i;
if (idx != -1) {
realIndex = idx - i;
}
final String ambiguosTypePath = '$path[$realIndex]/$k';
warnings.add(newAmbiguousType(ambiguosTypePath));
}
} else if (t == 'List') {
List l = List.from(obj[k]);
final int beginIndex = l.length;
l.addAll(v);
// bug is here
final mergeableType = mergeableListType(l);
if (ListType.Object == mergeableType.listType) {
WithWarning<Map> mergedList =
mergeObjectList(l, '$path[$i]/$k', beginIndex);
warnings.addAll(mergedList.warnings);
obj[k] = List.filled(1, mergedList.result);
} else {
if (l.length > 0) {
obj[k] = List.filled(1, l[0]);
}
if (mergeableType.isAmbigous) {
warnings.add(newAmbiguousType('$path[$i]/$k'));
}
}
} else if (t == 'Class') {
int properIndex = i;
if (idx != -1) {
properIndex = i - idx;
}
WithWarning<Map> mergedObj = mergeObj(
obj[k],
v,
'$path[$properIndex]/$k',
);
warnings.addAll(mergedObj.warnings);
obj[k] = mergedObj.result;
}
}
});
}
}
return new WithWarning(obj, warnings);
}