traversal the constraints and refine the conflic constraints. The remain constraits are creadiable.
(constraints: Vec<Constraint>)
| 319 | |
| 320 | /// traversal the constraints and refine the conflic constraints. The remain constraits are creadiable. |
| 321 | fn refine_constraints_for_func(constraints: Vec<Constraint>) -> Vec<Constraint> { |
| 322 | let mut refined = Vec::new(); |
| 323 | // refine for arg_tuple |
| 324 | let mut tuple_constraints: HashMap<ArgTuple, Vec<Constraint>> = HashMap::new(); |
| 325 | for constraint in constraints { |
| 326 | if let Some(tuple) = constraint.get_arg_tuple() { |
| 327 | if let Some(cs) = tuple_constraints.get_mut(tuple) { |
| 328 | cs.push(constraint); |
| 329 | } else { |
| 330 | let cs = vec![constraint.clone()]; |
| 331 | tuple_constraints.insert(*tuple, cs); |
| 332 | } |
| 333 | } else { |
| 334 | refined.push(constraint); |
| 335 | } |
| 336 | } |
| 337 | |
| 338 | for (_, constraints) in tuple_constraints { |
| 339 | let refined_arg_cs = refine_constraints_for_arg_tuple(constraints); |
| 340 | refined.extend(refined_arg_cs); |
| 341 | } |
| 342 | |
| 343 | // refine for array arg |
| 344 | let mut arg_constraints: HashMap<usize, Vec<Constraint>> = HashMap::new(); |
| 345 | for constraint in refined { |
| 346 | let array_pos = constraint.get_array_arg(); |
| 347 | if let Some(cs) = arg_constraints.get_mut(&array_pos) { |
| 348 | cs.push(constraint); |
| 349 | } else { |
| 350 | let cs = vec![constraint]; |
| 351 | arg_constraints.insert(array_pos, cs); |
| 352 | } |
| 353 | } |
| 354 | |
| 355 | let mut refined = Vec::new(); |
| 356 | for (_, constraints) in arg_constraints { |
| 357 | let refined_arg_cs = refine_constraints_for_array_arg(constraints); |
| 358 | refined.extend(refined_arg_cs); |
| 359 | } |
| 360 | |
| 361 | // refine for integer arg |
| 362 | let mut arg_constraints: HashMap<usize, Vec<Constraint>> = HashMap::new(); |
| 363 | for constraint in refined { |
| 364 | let integer_pos = constraint.get_integer_arg(); |
| 365 | if let Some(cs) = arg_constraints.get_mut(&integer_pos) { |
| 366 | cs.push(constraint); |
| 367 | } else { |
| 368 | let cs = vec![constraint]; |
| 369 | arg_constraints.insert(integer_pos, cs); |
| 370 | } |
| 371 | } |
| 372 | |
| 373 | let mut refined = Vec::new(); |
| 374 | for (_, constraints) in arg_constraints { |
| 375 | let refined_arg_cs = refine_constraints_for_integer_arg(constraints); |
| 376 | refined.extend(refined_arg_cs); |
| 377 | } |
| 378 | refined |
no test coverage detected