@@ -17,24 +17,33 @@ use core::result;
1717use syntax:: ast;
1818use syntax:: codemap:: span;
1919
20+ pub struct RegionError {
21+ msg : ~str ,
22+ replacement : ty:: Region
23+ }
24+
2025pub trait region_scope {
21- fn anon_region ( & self , span : span ) -> Result < ty:: Region , ~ str > ;
22- fn self_region ( & self , span : span ) -> Result < ty:: Region , ~ str > ;
26+ fn anon_region ( & self , span : span ) -> Result < ty:: Region , RegionError > ;
27+ fn self_region ( & self , span : span ) -> Result < ty:: Region , RegionError > ;
2328 fn named_region ( & self , span : span , id : ast:: ident )
24- -> Result < ty:: Region , ~ str > ;
29+ -> Result < ty:: Region , RegionError > ;
2530}
2631
2732pub enum empty_rscope { empty_rscope }
2833impl region_scope for empty_rscope {
29- fn anon_region ( & self , _span : span ) -> Result < ty:: Region , ~str > {
30- result:: Err ( ~"only the static region is allowed here")
34+ fn anon_region ( & self , _span : span ) -> Result < ty:: Region , RegionError > {
35+ result:: Err ( RegionError {
36+ msg : ~"only ' static is allowed here",
37+ replacement: ty:: re_static
38+ } )
3139 }
32- fn self_region ( & self , _span : span ) -> Result < ty:: Region , ~ str > {
33- result :: Err ( ~"only the static region is allowed here" )
40+ fn self_region ( & self , _span : span ) -> Result < ty:: Region , RegionError > {
41+ self . anon_region ( _span )
3442 }
3543 fn named_region ( & self , _span : span , _id : ast:: ident )
36- -> Result < ty:: Region , ~str > {
37- result:: Err ( ~"only the static region is allowed here")
44+ -> Result < ty:: Region , RegionError >
45+ {
46+ self . anon_region ( _span)
3847 }
3948}
4049
@@ -43,38 +52,59 @@ pub struct MethodRscope {
4352 region_parameterization : Option < ty:: region_variance >
4453}
4554impl region_scope for MethodRscope {
46- fn anon_region ( & self , _span : span ) -> Result < ty:: Region , ~str > {
47- result:: Err ( ~"anonymous region types are not permitted here")
55+ fn anon_region ( & self , _span : span ) -> Result < ty:: Region , RegionError > {
56+ result:: Err ( RegionError {
57+ msg : ~"anonymous lifetimes are not permitted here",
58+ replacement : ty:: re_bound ( ty:: br_self)
59+ } )
4860 }
49- fn self_region ( & self , _span : span ) -> Result < ty:: Region , ~ str > {
61+ fn self_region ( & self , _span : span ) -> Result < ty:: Region , RegionError > {
5062 assert self. region_parameterization . is_some ( ) ||
5163 self . self_ty . is_borrowed ( ) ;
5264 result:: Ok ( ty:: re_bound ( ty:: br_self) )
5365 }
5466 fn named_region ( & self , span : span , id : ast:: ident )
55- -> Result < ty:: Region , ~ str > {
67+ -> Result < ty:: Region , RegionError > {
5668 do empty_rscope. named_region ( span, id) . chain_err |_e| {
57- result:: Err ( ~"region is not in scope here")
69+ result:: Err ( RegionError {
70+ msg : ~"lifetime is not in scope",
71+ replacement : ty:: re_bound ( ty:: br_self)
72+ } )
5873 }
5974 }
6075}
6176
6277pub enum type_rscope = Option < ty : : region_variance > ;
78+ impl type_rscope {
79+ priv fn replacement ( & self ) -> ty:: Region {
80+ if self . is_some ( ) {
81+ ty:: re_bound ( ty:: br_self)
82+ } else {
83+ ty:: re_static
84+ }
85+ }
86+ }
6387impl region_scope for type_rscope {
64- fn anon_region ( & self , _span: span) -> Result <ty:: Region , ~str > {
65- result:: Err ( ~"anonymous region types are not permitted here")
88+ fn anon_region ( & self , _span : span ) -> Result < ty:: Region , RegionError > {
89+ result:: Err ( RegionError {
90+ msg : ~"anonymous lifetimes are not permitted here",
91+ replacement : self . replacement ( )
92+ } )
6693 }
67- fn self_region( & self , _span: span) -> Result <ty:: Region , ~ str > {
94+ fn self_region ( & self , _span : span ) -> Result < ty:: Region , RegionError > {
6895 // if the self region is used, region parameterization should
6996 // have inferred that this type is RP
7097 assert self. is_some ( ) ;
7198 result:: Ok ( ty:: re_bound ( ty:: br_self) )
7299 }
73100 fn named_region( & self , span : span , id : ast:: ident )
74- -> Result <ty:: Region , ~ str > {
101+ -> Result < ty:: Region , RegionError > {
75102 do empty_rscope. named_region ( span, id) . chain_err |_e| {
76- result:: Err ( ~"named regions other than `self ` are not \
77- allowed as part of a type declaration ")
103+ result:: Err ( RegionError {
104+ msg: ~"only ' self is allowed allowed as \
105+ part of a type declaration",
106+ replacement: self . replacement( )
107+ } )
78108 }
79109 }
80110}
@@ -98,17 +128,17 @@ pub fn in_binding_rscope<RS:region_scope + Copy + Durable>(self: &RS)
98128 binding_rscope { base: base, anon_bindings: @mut 0 }
99129}
100130impl region_scope for binding_rscope {
101- fn anon_region ( & self , _span : span ) -> Result < ty:: Region , ~ str > {
131+ fn anon_region( & self , _span: span) -> Result <ty:: Region , RegionError > {
102132 let idx = * self . anon_bindings;
103133 * self . anon_bindings += 1 ;
104134 result:: Ok ( ty:: re_bound( ty:: br_anon( idx) ) )
105135 }
106- fn self_region ( & self , span : span ) -> Result < ty:: Region , ~ str > {
136+ fn self_region( & self , span: span) -> Result <ty:: Region , RegionError > {
107137 self . base. self_region( span)
108138 }
109139 fn named_region( & self ,
110140 span: span,
111- id : ast:: ident ) -> Result < ty:: Region , ~ str >
141+ id: ast:: ident) -> Result <ty:: Region , RegionError >
112142 {
113143 do self . base. named_region( span, id) . chain_err |_e| {
114144 result:: Ok ( ty:: re_bound( ty:: br_named( id) ) )
0 commit comments