@@ -68,6 +68,58 @@ pub fn expand_stringify(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree])
68
68
token:: intern_and_get_ident ( s. as_slice ( ) ) ) )
69
69
}
70
70
71
+ pub fn expand_lower ( cx : & mut ExtCtxt , sp : Span , tts : & [ ast:: TokenTree ] )
72
+ -> Box < base:: MacResult > {
73
+ expand_cased ( cx, sp, tts, |c| { c. to_lowercase ( ) } )
74
+ }
75
+
76
+ pub fn expand_upper ( cx : & mut ExtCtxt , sp : Span , tts : & [ ast:: TokenTree ] )
77
+ -> Box < base:: MacResult > {
78
+ expand_cased ( cx, sp, tts, |c| { c. to_uppercase ( ) } )
79
+ }
80
+
81
+ fn expand_cased ( cx : & mut ExtCtxt , sp : Span , tts : & [ ast:: TokenTree ] , transform: |char| -> char)
82
+ -> Box < base:: MacResult > {
83
+ let es = match base:: get_exprs_from_tts ( cx, sp, tts) {
84
+ Some ( e) => e,
85
+ None => return base:: DummyResult :: expr ( sp)
86
+ } ;
87
+
88
+ let mut it = es. iter ( ) ;
89
+ let res = match it. next ( ) {
90
+ // FIXME (#13910): nested matches are necessary to get through Gc<>
91
+ Some ( expr) => match expr. node {
92
+ ast:: ExprLit ( ref lit) => match lit. node {
93
+ ast:: LitStr ( ref s, _) => Some ( ( s, lit. span ) ) ,
94
+ _ => {
95
+ cx. span_err ( expr. span , "expected a string literal" ) ;
96
+ None
97
+ }
98
+ } ,
99
+ _ => {
100
+ cx. span_err ( expr. span , "expected a string literal" ) ;
101
+ None
102
+ }
103
+ } ,
104
+ None => {
105
+ cx. span_err ( sp, "expected 1 argument, found 0" ) ;
106
+ None
107
+ }
108
+ } ;
109
+ match ( res, it. count ( ) ) {
110
+ ( Some ( ( s, span) ) , 0 ) => {
111
+ let new_s = s. get ( ) . chars ( ) . map ( transform) . collect :: < String > ( ) ;
112
+ base:: MacExpr :: new ( cx. expr_str ( span, token:: intern_and_get_ident ( new_s. as_slice ( ) ) ) )
113
+ }
114
+ ( _, rest) => {
115
+ if rest > 0 {
116
+ cx. span_err ( sp, format ! ( "expected 1 argument, found {}" , rest+1 ) . as_slice ( ) ) ;
117
+ }
118
+ base:: DummyResult :: expr ( sp)
119
+ }
120
+ }
121
+ }
122
+
71
123
pub fn expand_mod ( cx : & mut ExtCtxt , sp : Span , tts : & [ ast:: TokenTree ] )
72
124
-> Box < base:: MacResult > {
73
125
base:: check_zero_tts ( cx, sp, tts, "module_path!" ) ;
0 commit comments