Make suggestion have a more targetted underline
This commit is contained in:
parent
fd9133b9c3
commit
ff297fafbf
4 changed files with 21 additions and 23 deletions
|
@ -70,7 +70,7 @@ use rustc_middle::ty::{
|
||||||
subst::{Subst, SubstsRef},
|
subst::{Subst, SubstsRef},
|
||||||
Region, Ty, TyCtxt, TypeFoldable,
|
Region, Ty, TyCtxt, TypeFoldable,
|
||||||
};
|
};
|
||||||
use rustc_span::{DesugaringKind, Pos, Span};
|
use rustc_span::{BytePos, DesugaringKind, Pos, Span};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
use std::{cmp, fmt};
|
use std::{cmp, fmt};
|
||||||
|
|
||||||
|
@ -731,16 +731,12 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
||||||
return_sp: Span,
|
return_sp: Span,
|
||||||
arm_spans: impl Iterator<Item = Span>,
|
arm_spans: impl Iterator<Item = Span>,
|
||||||
) {
|
) {
|
||||||
let snippet = self
|
err.multipart_suggestion(
|
||||||
.tcx
|
|
||||||
.sess
|
|
||||||
.source_map()
|
|
||||||
.span_to_snippet(return_sp)
|
|
||||||
.unwrap_or_else(|_| "dyn Trait".to_string());
|
|
||||||
err.span_suggestion_verbose(
|
|
||||||
return_sp,
|
|
||||||
"you could change the return type to be a boxed trait object",
|
"you could change the return type to be a boxed trait object",
|
||||||
format!("Box<dyn {}>", &snippet[5..]),
|
vec![
|
||||||
|
(return_sp.with_hi(return_sp.lo() + BytePos(4)), "Box<dyn".to_string()),
|
||||||
|
(return_sp.shrink_to_hi(), ">".to_string()),
|
||||||
|
],
|
||||||
Applicability::MaybeIncorrect,
|
Applicability::MaybeIncorrect,
|
||||||
);
|
);
|
||||||
let sugg = arm_spans
|
let sugg = arm_spans
|
||||||
|
|
|
@ -51,7 +51,7 @@ use rustc_middle::ty::subst::SubstsRef;
|
||||||
use rustc_middle::ty::{self, Ty, TypeAndMut};
|
use rustc_middle::ty::{self, Ty, TypeAndMut};
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{self, Span};
|
use rustc_span::{self, BytePos, Span};
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
use rustc_trait_selection::traits::error_reporting::InferCtxtExt;
|
use rustc_trait_selection::traits::error_reporting::InferCtxtExt;
|
||||||
use rustc_trait_selection::traits::{self, ObligationCause, ObligationCauseCode};
|
use rustc_trait_selection::traits::{self, ObligationCause, ObligationCauseCode};
|
||||||
|
@ -1523,10 +1523,12 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> {
|
||||||
};
|
};
|
||||||
if has_impl {
|
if has_impl {
|
||||||
if is_object_safe {
|
if is_object_safe {
|
||||||
err.span_suggestion_verbose(
|
err.multipart_suggestion(
|
||||||
return_sp,
|
|
||||||
"you could change the return type to be a boxed trait object",
|
"you could change the return type to be a boxed trait object",
|
||||||
format!("Box<dyn {}>", &snippet[5..]),
|
vec![
|
||||||
|
(return_sp.with_hi(return_sp.lo() + BytePos(4)), "Box<dyn".to_string()),
|
||||||
|
(return_sp.shrink_to_hi(), ">".to_string()),
|
||||||
|
],
|
||||||
Applicability::MachineApplicable,
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -35,7 +35,7 @@ LL | B
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn cat() -> Box<dyn ObjectSafe> {
|
LL | fn cat() -> Box<dyn ObjectSafe> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ LL | 1u32
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn foo() -> Box<dyn std::fmt::Display> {
|
LL | fn foo() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:12:16
|
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:12:16
|
||||||
|
@ -38,7 +38,7 @@ LL | return 1u32;
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn bar() -> Box<dyn std::fmt::Display> {
|
LL | fn bar() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:20:9
|
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:20:9
|
||||||
|
@ -59,7 +59,7 @@ LL | 1u32
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn baz() -> Box<dyn std::fmt::Display> {
|
LL | fn baz() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error[E0308]: `if` and `else` have incompatible types
|
error[E0308]: `if` and `else` have incompatible types
|
||||||
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:28:9
|
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:28:9
|
||||||
|
@ -76,7 +76,7 @@ LL | | }
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn qux() -> Box<dyn std::fmt::Display> {
|
LL | fn qux() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
help: if you change the return type to expect trait objects box the returned expressions
|
help: if you change the return type to expect trait objects box the returned expressions
|
||||||
|
|
|
|
||||||
LL | Box::new(0i32)
|
LL | Box::new(0i32)
|
||||||
|
@ -102,7 +102,7 @@ LL | _ => 1u32,
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn bat() -> Box<dyn std::fmt::Display> {
|
LL | fn bat() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:40:5
|
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:40:5
|
||||||
|
@ -124,7 +124,7 @@ LL | | }
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn can() -> Box<dyn std::fmt::Display> {
|
LL | fn can() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:53:13
|
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:53:13
|
||||||
|
@ -145,7 +145,7 @@ LL | 1u32
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn cat() -> Box<dyn std::fmt::Display> {
|
LL | fn cat() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
|
|
||||||
error[E0308]: `match` arms have incompatible types
|
error[E0308]: `match` arms have incompatible types
|
||||||
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:61:14
|
--> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:61:14
|
||||||
|
@ -162,7 +162,7 @@ LL | | }
|
||||||
help: you could change the return type to be a boxed trait object
|
help: you could change the return type to be a boxed trait object
|
||||||
|
|
|
|
||||||
LL | fn dog() -> Box<dyn std::fmt::Display> {
|
LL | fn dog() -> Box<dyn std::fmt::Display> {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^ ^
|
||||||
help: if you change the return type to expect trait objects box the returned expressions
|
help: if you change the return type to expect trait objects box the returned expressions
|
||||||
|
|
|
|
||||||
LL | 0 => Box::new(0i32),
|
LL | 0 => Box::new(0i32),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue