mergeObj function
Implementation
WithWarning<Map> mergeObj(Map obj, Map other, String path) {
List<Warning> warnings = <Warning>[];
final Map clone = Map.from(obj);
other.forEach((k, v) {
if (clone[k] == null) {
clone[k] = v;
} else {
final String otherType = getTypeName(v);
final String t = getTypeName(clone[k]);
if (t != otherType) {
if (t == 'int' && otherType == 'double') {
// if double was found instead of int, assign the double
clone[k] = v;
} else if (clone[k].runtimeType != 'double' && v.runtimeType != 'int') {
// if types are not equal, then
warnings.add(newAmbiguousType('$path/$k'));
}
} else if (t == 'List') {
List l = List.from(clone[k]);
l.addAll(other[k]);
final mergeableType = mergeableListType(l);
if (ListType.Object == mergeableType.listType) {
WithWarning<Map> mergedList = mergeObjectList(l, '$path');
warnings.addAll(mergedList.warnings);
clone[k] = List.filled(1, mergedList.result);
} else {
if (l.length > 0) {
clone[k] = List.filled(1, l[0]);
}
if (mergeableType.isAmbigous) {
warnings.add(newAmbiguousType('$path/$k'));
}
}
} else if (t == 'Class') {
WithWarning<Map> mergedObj = mergeObj(clone[k], other[k], '$path/$k');
warnings.addAll(mergedObj.warnings);
clone[k] = mergedObj.result;
}
}
});
return new WithWarning(clone, warnings);
}