### What it does
Lints usage of `if let Some(v) = ... { y } else { x }` and
`match .. { Some(v) => y, None/_ => x }` which are more
idiomatically done with `Option::map_or` (if the else bit is a pure
expression) or `Option::map_or_else` (if the else bit is an impure
expression).

### Why is this bad?
Using the dedicated functions of the `Option` type is clearer and
more concise than an `if let` expression.

### Known problems
This lint uses a deliberately conservative metric for checking
if the inside of either body contains breaks or continues which will
cause it to not suggest a fix if either block contains a loop with
continues or breaks contained within the loop.

### Example
```
let _ = if let Some(foo) = optional {
    foo
} else {
    5
};
let _ = match optional {
    Some(val) => val + 1,
    None => 5
};
let _ = if let Some(foo) = optional {
    foo
} else {
    let y = do_complicated_function();
    y*y
};
```

should be

```
let _ = optional.map_or(5, |foo| foo);
let _ = optional.map_or(5, |val| val + 1);
let _ = optional.map_or_else(||{
    let y = do_complicated_function();
    y*y
}, |foo| foo);
```