Open
Description
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)`