@@ -162,14 +162,39 @@ impl<T: PartialEq, R: PartialEq> PartialEq for Info<T, R> {
162
162
impl < T : fmt:: Display , R : fmt:: Display > fmt:: Display for Info < T , R > {
163
163
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
164
164
match * self {
165
- Info :: Token ( ref c) => write ! ( f , "{}" , c ) ,
166
- Info :: Range ( ref c) => write ! ( f , "{}" , c ) ,
165
+ Info :: Token ( ref c) => escape_token ( c , '`' , f ) ,
166
+ Info :: Range ( ref c) => escape_token ( c , '`' , f ) ,
167
167
Info :: Owned ( ref s) => write ! ( f, "{}" , s) ,
168
168
Info :: Static ( s) => write ! ( f, "{}" , s) ,
169
169
}
170
170
}
171
171
}
172
172
173
+ fn escape_token < T : fmt:: Display > (
174
+ token : & T ,
175
+ quote : char ,
176
+ f : & mut fmt:: Formatter < ' _ > ,
177
+ ) -> fmt:: Result {
178
+ let token = token. to_string ( ) ;
179
+ for c in token. chars ( ) {
180
+ match c {
181
+ '\t' | '\n' | '\r' => {
182
+ write ! ( f, "{}" , c. escape_debug( ) ) ?;
183
+ }
184
+ c if c. is_ascii_control ( ) => {
185
+ write ! ( f, "{}" , c. escape_debug( ) ) ?;
186
+ }
187
+ c if c == quote => {
188
+ write ! ( f, "\\ {}" , quote) ?;
189
+ }
190
+ _ => {
191
+ write ! ( f, "{}" , c) ?;
192
+ }
193
+ }
194
+ }
195
+ Ok ( ( ) )
196
+ }
197
+
173
198
impl < R > From < char > for Info < char , R > {
174
199
fn from ( s : char ) -> Info < char , R > {
175
200
Info :: Token ( s)
0 commit comments