Repository: rust
Issue: Handle fully enclosed multiline spans gracefully in emitter
Labels: C-enhancement,A-diagnostics,P-low,T-compiler

Currently the solution to overlapping multiline spans is _correct_, but doesn't handle spans that are completely enclosed by others in any way, simply using span ordering and growing towards the left as needed. The following is a representative example of the problem:

```
error[E0308]: if and else have incompatible types
    --> src/libsyntax/parse/parser.rs:2640:33
     |
2636 |                                 let (span, msg) = if self.token == token::Token::Eof && self.is_subparser {
     |    _______________________________________________-
2637 |   |                                 (self.sess.source_map().next_point(self.span),
     |  _|_________________________________-
2638 | | |                                  "expected expression, found end of macro arguments")
     | |_|_____________________________________________________________________________________- expected because of this
2639 |   |                             } else {
2640 | / |                                 (self.span, format!(
2641 | | |                                     "expected expression, found {}",
2642 | | |                                     self.this_token_descr(),
2643 | | |                                 ))
     | |_|__________________________________^ expected &str, found struct `std::string::String`
2644 |   |                             };
     |   |_____________________________- if and else have incompatible types
     |
     = note: expected type `(syntax_pos::span_encoding::Span, &str)`
                found type `(syntax_pos::span_encoding::Span, std::string::String)`
```

Ideally, the emitter should handle this case by identifying that there are overlapping spans that are fully enclosed and special case the output to make it easier to read:

```
error[E0308]: if and else have incompatible types
    --> src/libsyntax/parse/parser.rs:2640:33
     |
2636 |                                let (span, msg) = if self.token == token::Token::Eof && self.is_subparser {
     |  ________________________________________________-
2637 | | /                                (self.sess.source_map().next_point(self.span),
2638 | | |                                 "expected expression, found end of macro arguments")
     | | |____________________________________________________________________________________- expected because of this
2639 | |                              } else {
2640 | | /                                (self.span, format!(
2641 | | |                                    "expected expression, found {}",
2642 | | |                                    self.this_token_descr(),
2643 | | |                                ))
     | | |_________________________________^ expected &str, found struct `std::string::String`
2644 | |                              };
     | |______________________________- if and else have incompatible types
     |
     = note: expected type `(syntax_pos::span_encoding::Span, &str)`
                found type `(syntax_pos::span_encoding::Span, std::string::String)`
```