@@ -4,12 +4,10 @@ use rustc_errors::{self, AddToDiagnostic, Diagnostic, IntoDiagnosticArg, Subdiag
4
4
use rustc_middle:: ty:: { self , TyCtxt } ;
5
5
use rustc_span:: { symbol:: kw, Span } ;
6
6
7
- #[ derive( Default ) ]
8
7
struct DescriptionCtx < ' a > {
9
8
span : Option < Span > ,
10
9
kind : & ' a str ,
11
10
arg : String ,
12
- num_arg : u32 ,
13
11
}
14
12
15
13
impl < ' a > DescriptionCtx < ' a > {
@@ -18,102 +16,74 @@ impl<'a> DescriptionCtx<'a> {
18
16
region : ty:: Region < ' tcx > ,
19
17
alt_span : Option < Span > ,
20
18
) -> Option < Self > {
21
- let mut me = DescriptionCtx :: default ( ) ;
22
- me. span = alt_span;
23
- match * region {
24
- ty:: ReEarlyBound ( _) | ty:: ReFree ( _) => {
25
- return Self :: from_early_bound_and_free_regions ( tcx, region) ;
26
- }
27
- ty:: ReStatic => {
28
- me. kind = "restatic" ;
29
- }
30
-
31
- ty:: RePlaceholder ( _) => return None ,
32
-
33
- ty:: ReError ( _) => return None ,
34
-
35
- // FIXME(#13998) RePlaceholder should probably print like
36
- // ReFree rather than dumping Debug output on the user.
37
- //
38
- // We shouldn't really be having unification failures with ReVar
39
- // and ReLateBound though.
40
- ty:: ReVar ( _) | ty:: ReLateBound ( ..) | ty:: ReErased => {
41
- me. kind = "revar" ;
42
- me. arg = format ! ( "{:?}" , region) ;
43
- }
44
- } ;
45
- Some ( me)
46
- }
47
-
48
- fn from_early_bound_and_free_regions < ' tcx > (
49
- tcx : TyCtxt < ' tcx > ,
50
- region : ty:: Region < ' tcx > ,
51
- ) -> Option < Self > {
52
- let mut me = DescriptionCtx :: default ( ) ;
53
- let scope = region. free_region_binding_scope ( tcx) . expect_local ( ) ;
54
- match * region {
19
+ let ( span, kind, arg) = match * region {
55
20
ty:: ReEarlyBound ( ref br) => {
56
- let mut sp = tcx. def_span ( scope ) ;
57
- if let Some ( param) =
21
+ let scope = region . free_region_binding_scope ( tcx) . expect_local ( ) ;
22
+ let span = if let Some ( param) =
58
23
tcx. hir ( ) . get_generics ( scope) . and_then ( |generics| generics. get_named ( br. name ) )
59
24
{
60
- sp = param. span ;
61
- }
62
- if br. has_name ( ) {
63
- me. kind = "as_defined" ;
64
- me. arg = br. name . to_string ( ) ;
25
+ param. span
65
26
} else {
66
- me . kind = "as_defined_anon" ;
27
+ tcx . def_span ( scope )
67
28
} ;
68
- me. span = Some ( sp)
29
+ if br. has_name ( ) {
30
+ ( Some ( span) , "as_defined" , br. name . to_string ( ) )
31
+ } else {
32
+ ( Some ( span) , "as_defined_anon" , String :: new ( ) )
33
+ }
69
34
}
70
35
ty:: ReFree ( ref fr) => {
71
36
if !fr. bound_region . is_named ( )
72
37
&& let Some ( ( ty, _) ) = find_anon_type ( tcx, region, & fr. bound_region )
73
38
{
74
- me. kind = "defined_here" ;
75
- me. span = Some ( ty. span ) ;
39
+ ( Some ( ty. span ) , "defined_here" , String :: new ( ) )
76
40
} else {
41
+ let scope = region. free_region_binding_scope ( tcx) . expect_local ( ) ;
77
42
match fr. bound_region {
78
43
ty:: BoundRegionKind :: BrNamed ( _, name) => {
79
- let mut sp = tcx. def_span ( scope) ;
80
- if let Some ( param) =
81
- tcx. hir ( ) . get_generics ( scope) . and_then ( |generics| generics. get_named ( name) )
44
+ let span = if let Some ( param) = tcx
45
+ . hir ( )
46
+ . get_generics ( scope)
47
+ . and_then ( |generics| generics. get_named ( name) )
82
48
{
83
- sp = param. span ;
84
- }
85
- if name == kw:: UnderscoreLifetime {
86
- me. kind = "as_defined_anon" ;
49
+ param. span
87
50
} else {
88
- me. kind = "as_defined" ;
89
- me. arg = name. to_string ( ) ;
51
+ tcx. def_span ( scope)
90
52
} ;
91
- me. span = Some ( sp) ;
53
+ if name == kw:: UnderscoreLifetime {
54
+ ( Some ( span) , "as_defined_anon" , String :: new ( ) )
55
+ } else {
56
+ ( Some ( span) , "as_defined" , name. to_string ( ) )
57
+ }
92
58
}
93
59
ty:: BrAnon ( span) => {
94
- me. kind = "defined_here" ;
95
- me. span = match span {
60
+ let span = match span {
96
61
Some ( _) => span,
97
62
None => Some ( tcx. def_span ( scope) ) ,
98
- }
99
- } ,
63
+ } ;
64
+ ( span, "defined_here" , String :: new ( ) )
65
+ }
100
66
_ => {
101
- me. kind = "defined_here_reg" ;
102
- me. arg = region. to_string ( ) ;
103
- me. span = Some ( tcx. def_span ( scope) ) ;
104
- } ,
67
+ ( Some ( tcx. def_span ( scope) ) , "defined_here_reg" , region. to_string ( ) )
68
+ }
105
69
}
106
70
}
107
71
}
108
- _ => bug ! ( ) ,
109
- }
110
- Some ( me)
111
- }
112
72
113
- fn add_to ( self , diag : & mut rustc_errors:: Diagnostic ) {
114
- diag. set_arg ( "desc_kind" , self . kind ) ;
115
- diag. set_arg ( "desc_arg" , self . arg ) ;
116
- diag. set_arg ( "desc_num_arg" , self . num_arg ) ;
73
+ ty:: ReStatic => ( alt_span, "restatic" , String :: new ( ) ) ,
74
+
75
+ ty:: RePlaceholder ( _) | ty:: ReError ( _) => return None ,
76
+
77
+ // FIXME(#13998) RePlaceholder should probably print like
78
+ // ReFree rather than dumping Debug output on the user.
79
+ //
80
+ // We shouldn't really be having unification failures with ReVar
81
+ // and ReLateBound though.
82
+ ty:: ReVar ( _) | ty:: ReLateBound ( ..) | ty:: ReErased => {
83
+ ( alt_span, "revar" , format ! ( "{:?}" , region) )
84
+ }
85
+ } ;
86
+ Some ( DescriptionCtx { span, kind, arg } )
117
87
}
118
88
}
119
89
@@ -198,10 +168,11 @@ impl AddToDiagnostic for RegionExplanation<'_> {
198
168
{
199
169
diag. set_arg ( "pref_kind" , self . prefix ) ;
200
170
diag. set_arg ( "suff_kind" , self . suffix ) ;
201
- let desc_span = self . desc . span ;
202
- self . desc . add_to ( diag) ;
171
+ diag. set_arg ( "desc_kind" , self . desc . kind ) ;
172
+ diag. set_arg ( "desc_arg" , self . desc . arg ) ;
173
+
203
174
let msg = f ( diag, fluent:: infer_region_explanation. into ( ) ) ;
204
- if let Some ( span) = desc_span {
175
+ if let Some ( span) = self . desc . span {
205
176
diag. span_note ( span, msg) ;
206
177
} else {
207
178
diag. note ( msg) ;
0 commit comments