@@ -287,10 +287,7 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
287
287
slice:: raw:: buf_as_slice ( ( * lang) . data ,
288
288
( * lang) . size as uint , |lang| {
289
289
let s = str:: from_utf8 ( lang) . unwrap ( ) ;
290
- ( s. contains ( "should_fail" ) ,
291
- s. contains ( "no_run" ) ,
292
- s. contains ( "ignore" ) ,
293
- s. contains ( "notrust" ) )
290
+ parse_lang_string ( s)
294
291
} )
295
292
} ;
296
293
if notrust { return }
@@ -340,6 +337,35 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
340
337
}
341
338
}
342
339
340
+ fn parse_lang_string ( string : & str ) -> ( bool , bool , bool , bool ) {
341
+ let mut seen_rust_tags = false ;
342
+ let mut seen_other_tags = false ;
343
+ let mut should_fail = false ;
344
+ let mut no_run = false ;
345
+ let mut ignore = false ;
346
+ let mut notrust = false ;
347
+
348
+ let mut tokens = string. as_slice ( ) . split ( |c : char |
349
+ !( c == '_' || c == '-' || c. is_alphanumeric ( ) )
350
+ ) ;
351
+
352
+ for token in tokens {
353
+ match token {
354
+ "" => { } ,
355
+ "should_fail" => { should_fail = true ; seen_rust_tags = true ; } ,
356
+ "no_run" => { no_run = true ; seen_rust_tags = true ; } ,
357
+ "ignore" => { ignore = true ; seen_rust_tags = true ; } ,
358
+ "notrust" => { notrust = true ; seen_rust_tags = true ; } ,
359
+ "rust" => { notrust = false ; seen_rust_tags = true ; } ,
360
+ _ => { seen_other_tags = true }
361
+ }
362
+ }
363
+
364
+ let notrust = notrust || ( seen_other_tags && !seen_rust_tags) ;
365
+
366
+ ( should_fail, no_run, ignore, notrust)
367
+ }
368
+
343
369
/// By default this markdown renderer generates anchors for each header in the
344
370
/// rendered document. The anchor name is the contents of the header spearated
345
371
/// by hyphens, and a task-local map is used to disambiguate among duplicate
@@ -367,3 +393,22 @@ impl<'a> fmt::Show for MarkdownWithToc<'a> {
367
393
render ( fmt, md. as_slice ( ) , true )
368
394
}
369
395
}
396
+
397
+ #[ cfg( test) ]
398
+ mod tests {
399
+ use super :: parse_lang_string;
400
+
401
+ #[ test]
402
+ fn test_parse_lang_string ( ) {
403
+ assert_eq ! ( parse_lang_string( "" ) , ( false , false , false , false ) )
404
+ assert_eq ! ( parse_lang_string( "rust" ) , ( false , false , false , false ) )
405
+ assert_eq ! ( parse_lang_string( "sh" ) , ( false , false , false , true ) )
406
+ assert_eq ! ( parse_lang_string( "notrust" ) , ( false , false , false , true ) )
407
+ assert_eq ! ( parse_lang_string( "ignore" ) , ( false , false , true , false ) )
408
+ assert_eq ! ( parse_lang_string( "should_fail" ) , ( true , false , false , false ) )
409
+ assert_eq ! ( parse_lang_string( "no_run" ) , ( false , true , false , false ) )
410
+ assert_eq ! ( parse_lang_string( "{.no_run .example}" ) , ( false , true , false , false ) )
411
+ assert_eq ! ( parse_lang_string( "{.sh .should_fail}" ) , ( true , false , false , false ) )
412
+ assert_eq ! ( parse_lang_string( "{.example .rust}" ) , ( false , false , false , false ) )
413
+ }
414
+ }
0 commit comments