@@ -37,6 +37,7 @@ use std::fmt::{self, Write};
37
37
use std:: borrow:: Cow ;
38
38
use std:: ops:: Range ;
39
39
use std:: str;
40
+ use syntax:: edition:: Edition ;
40
41
41
42
use html:: toc:: TocBuilder ;
42
43
use html:: highlight;
@@ -170,13 +171,15 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'a, I> {
170
171
let event = self . inner . next ( ) ;
171
172
let compile_fail;
172
173
let ignore;
174
+ let edition;
173
175
if let Some ( Event :: Start ( Tag :: CodeBlock ( lang) ) ) = event {
174
176
let parse_result = LangString :: parse ( & lang, self . check_error_codes ) ;
175
177
if !parse_result. rust {
176
178
return Some ( Event :: Start ( Tag :: CodeBlock ( lang) ) ) ;
177
179
}
178
180
compile_fail = parse_result. compile_fail ;
179
181
ignore = parse_result. ignore ;
182
+ edition = parse_result. edition ;
180
183
} else {
181
184
return event;
182
185
}
@@ -212,6 +215,17 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'a, I> {
212
215
} else {
213
216
""
214
217
} ;
218
+
219
+ let edition_string = if let Some ( e @ Edition :: Edition2018 ) = edition {
220
+ format ! ( "&edition={}{}" , e,
221
+ if channel == "&version=nightly" { "" }
222
+ else { "&version=nightly" } )
223
+ } else if let Some ( e) = edition {
224
+ format ! ( "&edition={}" , e)
225
+ } else {
226
+ "" . to_owned ( )
227
+ } ;
228
+
215
229
// These characters don't need to be escaped in a URI.
216
230
// FIXME: use a library function for percent encoding.
217
231
fn dont_escape ( c : u8 ) -> bool {
@@ -231,26 +245,44 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'a, I> {
231
245
}
232
246
}
233
247
Some ( format ! (
234
- r#"<a class="test-arrow" target="_blank" href="{}?code={}{}">Run</a>"# ,
235
- url, test_escaped, channel
248
+ r#"<a class="test-arrow" target="_blank" href="{}?code={}{}{} ">Run</a>"# ,
249
+ url, test_escaped, channel, edition_string
236
250
) )
237
251
} ) ;
252
+
238
253
let tooltip = if ignore {
239
- Some ( ( "This example is not tested" , "ignore" ) )
254
+ Some ( ( "This example is not tested" . to_owned ( ) , "ignore" ) )
240
255
} else if compile_fail {
241
- Some ( ( "This example deliberately fails to compile" , "compile_fail" ) )
256
+ Some ( ( "This example deliberately fails to compile" . to_owned ( ) , "compile_fail" ) )
257
+ } else if let Some ( e) = edition {
258
+ Some ( ( format ! ( "This code runs with edition {}" , e) , "edition" ) )
242
259
} else {
243
260
None
244
261
} ;
245
- s. push_str ( & highlight:: render_with_highlighting (
246
- & text,
247
- Some ( & format ! ( "rust-example-rendered{}" ,
248
- if ignore { " ignore" }
249
- else if compile_fail { " compile_fail" }
250
- else { "" } ) ) ,
251
- playground_button. as_ref ( ) . map ( String :: as_str) ,
252
- tooltip) ) ;
253
- Some ( Event :: Html ( s. into ( ) ) )
262
+
263
+ if let Some ( ( s1, s2) ) = tooltip {
264
+ s. push_str ( & highlight:: render_with_highlighting (
265
+ & text,
266
+ Some ( & format ! ( "rust-example-rendered{}" ,
267
+ if ignore { " ignore" }
268
+ else if compile_fail { " compile_fail" }
269
+ else if edition. is_some( ) { " edition " }
270
+ else { "" } ) ) ,
271
+ playground_button. as_ref ( ) . map ( String :: as_str) ,
272
+ Some ( ( s1. as_str ( ) , s2) ) ) ) ;
273
+ Some ( Event :: Html ( s. into ( ) ) )
274
+ } else {
275
+ s. push_str ( & highlight:: render_with_highlighting (
276
+ & text,
277
+ Some ( & format ! ( "rust-example-rendered{}" ,
278
+ if ignore { " ignore" }
279
+ else if compile_fail { " compile_fail" }
280
+ else if edition. is_some( ) { " edition " }
281
+ else { "" } ) ) ,
282
+ playground_button. as_ref ( ) . map ( String :: as_str) ,
283
+ None ) ) ;
284
+ Some ( Event :: Html ( s. into ( ) ) )
285
+ }
254
286
} )
255
287
}
256
288
}
@@ -577,6 +609,7 @@ pub struct LangString {
577
609
pub compile_fail : bool ,
578
610
pub error_codes : Vec < String > ,
579
611
pub allow_fail : bool ,
612
+ pub edition : Option < Edition >
580
613
}
581
614
582
615
impl LangString {
@@ -591,6 +624,7 @@ impl LangString {
591
624
compile_fail : false ,
592
625
error_codes : Vec :: new ( ) ,
593
626
allow_fail : false ,
627
+ edition : None ,
594
628
}
595
629
}
596
630
@@ -625,6 +659,11 @@ impl LangString {
625
659
seen_rust_tags = !seen_other_tags || seen_rust_tags;
626
660
data. no_run = true ;
627
661
}
662
+ x if allow_error_code_check && x. starts_with ( "edition" ) => {
663
+ // allow_error_code_check is true if we're on nightly, which
664
+ // is needed for edition support
665
+ data. edition = x[ 7 ..] . parse :: < Edition > ( ) . ok ( ) ;
666
+ }
628
667
x if allow_error_code_check && x. starts_with ( "E" ) && x. len ( ) == 5 => {
629
668
if x[ 1 ..] . parse :: < u32 > ( ) . is_ok ( ) {
630
669
data. error_codes . push ( x. to_owned ( ) ) ;
@@ -925,12 +964,14 @@ mod tests {
925
964
use super :: { ErrorCodes , LangString , Markdown , MarkdownHtml , IdMap } ;
926
965
use super :: plain_summary_line;
927
966
use std:: cell:: RefCell ;
967
+ use syntax:: edition:: Edition ;
928
968
929
969
#[ test]
930
970
fn test_lang_string_parse ( ) {
931
971
fn t ( s : & str ,
932
972
should_panic : bool , no_run : bool , ignore : bool , rust : bool , test_harness : bool ,
933
- compile_fail : bool , allow_fail : bool , error_codes : Vec < String > ) {
973
+ compile_fail : bool , allow_fail : bool , error_codes : Vec < String > ,
974
+ edition : Option < Edition > ) {
934
975
assert_eq ! ( LangString :: parse( s, ErrorCodes :: Yes ) , LangString {
935
976
should_panic,
936
977
no_run,
@@ -941,30 +982,34 @@ mod tests {
941
982
error_codes,
942
983
original: s. to_owned( ) ,
943
984
allow_fail,
985
+ edition,
944
986
} )
945
987
}
946
988
947
989
fn v ( ) -> Vec < String > {
948
990
Vec :: new ( )
949
991
}
950
992
951
- // marker | should_panic| no_run| ignore| rust | test_harness| compile_fail
952
- // | allow_fail | error_codes
953
- t ( "" , false , false , false , true , false , false , false , v ( ) ) ;
954
- t ( "rust" , false , false , false , true , false , false , false , v ( ) ) ;
955
- t ( "sh" , false , false , false , false , false , false , false , v ( ) ) ;
956
- t ( "ignore" , false , false , true , true , false , false , false , v ( ) ) ;
957
- t ( "should_panic" , true , false , false , true , false , false , false , v ( ) ) ;
958
- t ( "no_run" , false , true , false , true , false , false , false , v ( ) ) ;
959
- t ( "test_harness" , false , false , false , true , true , false , false , v ( ) ) ;
960
- t ( "compile_fail" , false , true , false , true , false , true , false , v ( ) ) ;
961
- t ( "allow_fail" , false , false , false , true , false , false , true , v ( ) ) ;
962
- t ( "{.no_run .example}" , false , true , false , true , false , false , false , v ( ) ) ;
963
- t ( "{.sh .should_panic}" , true , false , false , false , false , false , false , v ( ) ) ;
964
- t ( "{.example .rust}" , false , false , false , true , false , false , false , v ( ) ) ;
965
- t ( "{.test_harness .rust}" , false , false , false , true , true , false , false , v ( ) ) ;
966
- t ( "text, no_run" , false , true , false , false , false , false , false , v ( ) ) ;
967
- t ( "text,no_run" , false , true , false , false , false , false , false , v ( ) ) ;
993
+ // ignore-tidy-linelength
994
+ // marker | should_panic | no_run | ignore | rust | test_harness
995
+ // | compile_fail | allow_fail | error_codes | edition
996
+ t ( "" , false , false , false , true , false , false , false , v ( ) , None ) ;
997
+ t ( "rust" , false , false , false , true , false , false , false , v ( ) , None ) ;
998
+ t ( "sh" , false , false , false , false , false , false , false , v ( ) , None ) ;
999
+ t ( "ignore" , false , false , true , true , false , false , false , v ( ) , None ) ;
1000
+ t ( "should_panic" , true , false , false , true , false , false , false , v ( ) , None ) ;
1001
+ t ( "no_run" , false , true , false , true , false , false , false , v ( ) , None ) ;
1002
+ t ( "test_harness" , false , false , false , true , true , false , false , v ( ) , None ) ;
1003
+ t ( "compile_fail" , false , true , false , true , false , true , false , v ( ) , None ) ;
1004
+ t ( "allow_fail" , false , false , false , true , false , false , true , v ( ) , None ) ;
1005
+ t ( "{.no_run .example}" , false , true , false , true , false , false , false , v ( ) , None ) ;
1006
+ t ( "{.sh .should_panic}" , true , false , false , false , false , false , false , v ( ) , None ) ;
1007
+ t ( "{.example .rust}" , false , false , false , true , false , false , false , v ( ) , None ) ;
1008
+ t ( "{.test_harness .rust}" , false , false , false , true , true , false , false , v ( ) , None ) ;
1009
+ t ( "text, no_run" , false , true , false , false , false , false , false , v ( ) , None ) ;
1010
+ t ( "text,no_run" , false , true , false , false , false , false , false , v ( ) , None ) ;
1011
+ t ( "edition2015" , false , false , false , true , false , false , false , v ( ) , Some ( Edition :: Edition2015 ) ) ;
1012
+ t ( "edition2018" , false , false , false , true , false , false , false , v ( ) , Some ( Edition :: Edition2018 ) ) ;
968
1013
}
969
1014
970
1015
#[ test]
0 commit comments