@@ -721,7 +721,7 @@ pub fn integer_lit(s: &str, sd: &SpanHandler, sp: Span) -> ast::Lit_ {
721
721
mod test {
722
722
use super :: * ;
723
723
use serialize:: json;
724
- use codemap:: { Span , BytePos , Spanned , NO_EXPANSION } ;
724
+ use codemap:: { Span , BytePos , Pos , Spanned , NO_EXPANSION } ;
725
725
use owned_slice:: OwnedSlice ;
726
726
use ast;
727
727
use abi;
@@ -1121,6 +1121,46 @@ mod test {
1121
1121
span: sp( 0 , 21 ) } ) ) ) ;
1122
1122
}
1123
1123
1124
+ fn get_spans_of_pat_idents ( src : & str ) -> Vec < Span > {
1125
+ let item = string_to_item ( src. to_string ( ) ) . unwrap ( ) ;
1126
+
1127
+ struct PatIdentVisitor {
1128
+ spans : Vec < Span >
1129
+ }
1130
+ impl < ' v > :: visit:: Visitor < ' v > for PatIdentVisitor {
1131
+ fn visit_pat ( & mut self , p : & ' v ast:: Pat ) {
1132
+ match p. node {
1133
+ ast:: PatIdent ( _ , ref spannedident, _) => {
1134
+ self . spans . push ( spannedident. span . clone ( ) ) ;
1135
+ }
1136
+ _ => {
1137
+ :: visit:: walk_pat ( self , p) ;
1138
+ }
1139
+ }
1140
+ }
1141
+ }
1142
+ let mut v = PatIdentVisitor { spans : Vec :: new ( ) } ;
1143
+ :: visit:: walk_item ( & mut v, & * item) ;
1144
+ return v. spans ;
1145
+ }
1146
+
1147
+ #[ test] fn span_of_self_arg_pat_idents_are_correct ( ) {
1148
+
1149
+ let srcs = [ "impl z { fn a (&self, &myarg: int) {} }" ,
1150
+ "impl z { fn a (&mut self, &myarg: int) {} }" ,
1151
+ "impl z { fn a (&'a self, &myarg: int) {} }" ,
1152
+ "impl z { fn a (self, &myarg: int) {} }" ,
1153
+ "impl z { fn a (self: Foo, &myarg: int) {} }" ,
1154
+ ] ;
1155
+
1156
+ for & src in srcs. iter ( ) {
1157
+ let spans = get_spans_of_pat_idents ( src) ;
1158
+ let Span { lo : lo, hi : hi, ..} = spans[ 0 ] ;
1159
+ assert ! ( "self" == src. slice( lo. to_uint( ) , hi. to_uint( ) ) ,
1160
+ "\" {}\" != \" self\" . src=\" {}\" " ,
1161
+ src. slice( lo. to_uint( ) , hi. to_uint( ) ) , src)
1162
+ }
1163
+ }
1124
1164
1125
1165
#[ test] fn parse_exprs ( ) {
1126
1166
// just make sure that they parse....
0 commit comments