Expr lhs = propagate(expr.lhs, environment, context);
Expr rhs = propagate(expr.rhs, environment, context);
expr.lhs = lhs;
expr.rhs = rhs;
Type lhsRawType = lhs.result().raw();
Type rhsRawType = rhs.result().raw();
boolean lhs_set = Type.isSubtype(Type.T_SET_ANY,
lhsRawType);
boolean rhs_set = Type.isSubtype(Type.T_SET_ANY,
rhsRawType);
boolean lhs_list = Type.isSubtype(Type.T_LIST_ANY,
lhsRawType);
boolean rhs_list = Type.isSubtype(Type.T_LIST_ANY,
rhsRawType);
boolean lhs_str = Type.isSubtype(Type.T_STRING, lhsRawType);
boolean rhs_str = Type.isSubtype(Type.T_STRING, rhsRawType);
Type srcType;
if (lhs_str || rhs_str) {
switch (expr.op) {
case LISTAPPEND: