File tree Expand file tree Collapse file tree 3 files changed +36
-7
lines changed
src/tools/rust-analyzer/crates Expand file tree Collapse file tree 3 files changed +36
-7
lines changed Original file line number Diff line number Diff line change @@ -191,7 +191,7 @@ impl Name {
191191 // FIXME: Remove this in favor of `display`, see fixme on `as_str`
192192 #[ doc( hidden) ]
193193 pub fn display_no_db ( & self , edition : Edition ) -> impl fmt:: Display + ' _ {
194- Display { name : self , needs_escaping : is_raw_identifier ( self . symbol . as_str ( ) , edition) }
194+ Display { name : self , edition }
195195 }
196196
197197 pub fn symbol ( & self ) -> & Symbol {
@@ -201,15 +201,28 @@ impl Name {
201201
202202struct Display < ' a > {
203203 name : & ' a Name ,
204- needs_escaping : bool ,
204+ edition : Edition ,
205205}
206206
207207impl fmt:: Display for Display < ' _ > {
208208 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
209- if self . needs_escaping {
210- write ! ( f, "r#" ) ?;
209+ let mut symbol = self . name . symbol . as_str ( ) ;
210+
211+ if symbol == "'static" {
212+ // FIXME: '`static` can also be a label, and there it does need escaping.
213+ // But knowing where it is will require adding a parameter to `display()`,
214+ // and that is an infectious change.
215+ return f. write_str ( symbol) ;
216+ }
217+
218+ if let Some ( s) = symbol. strip_prefix ( '\'' ) {
219+ f. write_str ( "'" ) ?;
220+ symbol = s;
221+ }
222+ if is_raw_identifier ( symbol, self . edition ) {
223+ f. write_str ( "r#" ) ?;
211224 }
212- fmt :: Display :: fmt ( self . name . symbol . as_str ( ) , f )
225+ f . write_str ( symbol )
213226 }
214227}
215228
Original file line number Diff line number Diff line change @@ -116,13 +116,13 @@ fn foo<'lifetime>(foo: &'a$0) {}
116116 check (
117117 r#"
118118struct Foo;
119- impl<'impl> Foo {
119+ impl<'r# impl> Foo {
120120 fn foo<'func>(&'a$0 self) {}
121121}
122122"# ,
123123 expect ! [ [ r#"
124124 lt 'func
125- lt 'impl
125+ lt 'r# impl
126126 lt 'static
127127 "# ] ] ,
128128 ) ;
Original file line number Diff line number Diff line change @@ -2110,3 +2110,19 @@ fn foo() {
21102110 "# ] ] ,
21112111 ) ;
21122112}
2113+
2114+ #[ test]
2115+ fn escaped_label ( ) {
2116+ check (
2117+ r#"
2118+ fn main() {
2119+ 'r#break: {
2120+ break '$0;
2121+ }
2122+ }
2123+ "# ,
2124+ expect ! [ [ r#"
2125+ lb 'r#break
2126+ "# ] ] ,
2127+ ) ;
2128+ }
You can’t perform that action at this time.
0 commit comments