@@ -975,6 +975,13 @@ pub impl Parser {
975
975
}
976
976
}
977
977
978
+ fn token_is_lifetime ( & self , tok : & token:: Token ) -> bool {
979
+ match * tok {
980
+ token:: LIFETIME ( _) => true ,
981
+ _ => false
982
+ }
983
+ }
984
+
978
985
fn parse_lifetime ( & self ) -> ast:: Lifetime {
979
986
/*!
980
987
*
@@ -1041,6 +1048,11 @@ pub impl Parser {
1041
1048
}
1042
1049
}
1043
1050
1051
+ fn token_is_mutability ( & self , tok : & token:: Token ) -> bool {
1052
+ self . token_is_keyword ( & ~"mut ", tok) ||
1053
+ self.token_is_keyword(&~" const", tok)
1054
+ }
1055
+
1044
1056
fn parse_mutability ( & self ) -> mutability {
1045
1057
if self . eat_keyword ( & ~"mut ") {
1046
1058
m_mutbl
@@ -2844,14 +2856,63 @@ pub impl Parser {
2844
2856
}
2845
2857
}
2846
2858
2859
+ fn maybe_parse_borrowed_self_ty (
2860
+ self : & Parser
2861
+ ) -> ast:: self_ty_ {
2862
+ // The following things are possible to see here:
2863
+ //
2864
+ // fn(&self)
2865
+ // fn(&mut self)
2866
+ // fn(&'lt self)
2867
+ // fn(&'lt mut self)
2868
+ //
2869
+ // We already know that the current token is `&`.
2870
+
2871
+ if (
2872
+ self . token_is_keyword ( & ~"self ", & self . look_ahead ( 1 ) ) )
2873
+ {
2874
+ self . bump ( ) ;
2875
+ self . expect_self_ident ( ) ;
2876
+ sty_region ( None , m_imm)
2877
+ } else if (
2878
+ self . token_is_mutability ( & self . look_ahead ( 1 ) ) &&
2879
+ self . token_is_keyword ( & ~"self ", & self . look_ahead ( 2 ) ) )
2880
+ {
2881
+ self . bump ( ) ;
2882
+ let mutability = self . parse_mutability ( ) ;
2883
+ self . expect_self_ident ( ) ;
2884
+ sty_region ( None , mutability)
2885
+ } else if (
2886
+ self . token_is_lifetime ( & self . look_ahead ( 1 ) ) &&
2887
+ self . token_is_keyword ( & ~"self ", & self . look_ahead ( 2 ) ) )
2888
+ {
2889
+ self . bump ( ) ;
2890
+ let lifetime = @self . parse_lifetime ( ) ;
2891
+ self . expect_self_ident ( ) ;
2892
+ sty_region ( Some ( lifetime) , m_imm)
2893
+ } else if (
2894
+ self . token_is_lifetime ( & self . look_ahead ( 1 ) ) &&
2895
+ self . token_is_mutability ( & self . look_ahead ( 2 ) ) &&
2896
+ self . token_is_keyword ( & ~"self ", & self . look_ahead ( 3 ) ) )
2897
+ {
2898
+ self . bump ( ) ;
2899
+ let lifetime = @self . parse_lifetime ( ) ;
2900
+ let mutability = self . parse_mutability ( ) ;
2901
+ self . expect_self_ident ( ) ;
2902
+ sty_region ( Some ( lifetime) , mutability)
2903
+ } else {
2904
+ sty_by_ref
2905
+ }
2906
+ }
2907
+
2847
2908
self . expect ( & token:: LPAREN ) ;
2848
2909
2849
2910
// A bit of complexity and lookahead is needed here in order to to be
2850
2911
// backwards compatible.
2851
2912
let lo = self . span . lo ;
2852
2913
let self_ty = match * self . token {
2853
2914
token:: BINOP ( token:: AND ) => {
2854
- maybe_parse_self_ty ( sty_region , self )
2915
+ maybe_parse_borrowed_self_ty ( self )
2855
2916
}
2856
2917
token:: AT => {
2857
2918
maybe_parse_self_ty ( sty_box, self )
0 commit comments