@@ -24,8 +24,8 @@ use std::fs::File;
2424use  std:: io:: prelude:: * ; 
2525use  std:: path:: Path ; 
2626
27- #[ derive( PartialEq ) ]  
28- enum  Status  { 
27+ #[ derive( Debug ,   PartialEq ) ]  
28+ pub   enum  Status  { 
2929    Stable , 
3030    Removed , 
3131    Unstable , 
@@ -42,78 +42,21 @@ impl fmt::Display for Status {
4242    } 
4343} 
4444
45- struct  Feature  { 
46-     level :  Status , 
47-     since :  String , 
48-     has_gate_test :  bool , 
45+ #[ derive( Debug ) ]  
46+ pub  struct  Feature  { 
47+     pub  level :  Status , 
48+     pub  since :  String , 
49+     pub  has_gate_test :  bool , 
4950} 
5051
5152pub  fn  check ( path :  & Path ,  bad :  & mut  bool )  { 
52-     let  mut  features = collect_lang_features ( & path. join ( "libsyntax/feature_gate.rs" ) ) ; 
53+     let  mut  features = collect_lang_features ( path) ; 
5354    assert ! ( !features. is_empty( ) ) ; 
54-     let  mut  lib_features = HashMap :: < String ,  Feature > :: new ( ) ; 
55- 
56-     let  mut  contents = String :: new ( ) ; 
57-     super :: walk ( path, 
58-                 & mut  |path| super :: filter_dirs ( path)  || path. ends_with ( "src/test" ) , 
59-                 & mut  |file| { 
60-         let  filename = file. file_name ( ) . unwrap ( ) . to_string_lossy ( ) ; 
61-         if  !filename. ends_with ( ".rs" )  || filename == "features.rs"  ||
62-            filename == "diagnostic_list.rs"  { 
63-             return ; 
64-         } 
65- 
66-         contents. truncate ( 0 ) ; 
67-         t ! ( t!( File :: open( & file) ,  & file) . read_to_string( & mut  contents) ) ; 
6855
69-         for  ( i,  line)  in  contents. lines ( ) . enumerate ( )  { 
70-             let  mut  err = |msg :  & str | { 
71-                 println ! ( "{}:{}: {}" ,  file. display( ) ,  i + 1 ,  msg) ; 
72-                 * bad = true ; 
73-             } ; 
74-             let  level = if  line. contains ( "[unstable(" )  { 
75-                 Status :: Unstable 
76-             }  else  if  line. contains ( "[stable(" )  { 
77-                 Status :: Stable 
78-             }  else  { 
79-                 continue ; 
80-             } ; 
81-             let  feature_name = match  find_attr_val ( line,  "feature" )  { 
82-                 Some ( name)  => name, 
83-                 None  => { 
84-                     err ( "malformed stability attribute" ) ; 
85-                     continue ; 
86-                 } 
87-             } ; 
88-             let  since = match  find_attr_val ( line,  "since" )  { 
89-                 Some ( name)  => name, 
90-                 None  if  level == Status :: Stable  => { 
91-                     err ( "malformed stability attribute" ) ; 
92-                     continue ; 
93-                 } 
94-                 None  => "None" , 
95-             } ; 
56+     let  lib_features = collect_lib_features ( path,  bad,  & features) ; 
57+     assert ! ( !lib_features. is_empty( ) ) ; 
9658
97-             if  features. contains_key ( feature_name)  { 
98-                 err ( "duplicating a lang feature" ) ; 
99-             } 
100-             if  let  Some ( ref  s)  = lib_features. get ( feature_name)  { 
101-                 if  s. level  != level { 
102-                     err ( "different stability level than before" ) ; 
103-                 } 
104-                 if  s. since  != since { 
105-                     err ( "different `since` than before" ) ; 
106-                 } 
107-                 continue ; 
108-             } 
109-             lib_features. insert ( feature_name. to_owned ( ) , 
110-                                 Feature  { 
111-                                     level :  level, 
112-                                     since :  since. to_owned ( ) , 
113-                                     has_gate_test :  false , 
114-                                 } ) ; 
115-         } 
116-     } ) ; 
59+     let  mut  contents = String :: new ( ) ; 
11760
11861    super :: walk_many ( & [ & path. join ( "test/compile-fail" ) , 
11962                       & path. join ( "test/compile-fail-fulldeps" ) , 
@@ -233,8 +176,9 @@ fn test_filen_gate(filen_underscore: &str,
233176    return  false ; 
234177} 
235178
236- fn  collect_lang_features ( path :  & Path )  -> HashMap < String ,  Feature >  { 
179+ pub   fn  collect_lang_features ( base_src_path :  & Path )  -> HashMap < String ,  Feature >  { 
237180    let  mut  contents = String :: new ( ) ; 
181+     let  path = base_src_path. join ( "libsyntax/feature_gate.rs" ) ; 
238182    t ! ( t!( File :: open( path) ) . read_to_string( & mut  contents) ) ; 
239183
240184    contents. lines ( ) 
@@ -257,3 +201,71 @@ fn collect_lang_features(path: &Path) -> HashMap<String, Feature> {
257201        } ) 
258202        . collect ( ) 
259203} 
204+ 
205+ pub  fn  collect_lib_features ( base_src_path :  & Path , 
206+                             bad :  & mut  bool , 
207+                             features :  & HashMap < String ,  Feature > )  -> HashMap < String ,  Feature >  { 
208+     let  mut  lib_features = HashMap :: < String ,  Feature > :: new ( ) ; 
209+     let  mut  contents = String :: new ( ) ; 
210+     super :: walk ( base_src_path, 
211+                 & mut  |path| super :: filter_dirs ( path)  || path. ends_with ( "src/test" ) , 
212+                 & mut  |file| { 
213+         let  filename = file. file_name ( ) . unwrap ( ) . to_string_lossy ( ) ; 
214+         if  !filename. ends_with ( ".rs" )  || filename == "features.rs"  ||
215+            filename == "diagnostic_list.rs"  { 
216+             return ; 
217+         } 
218+ 
219+         contents. truncate ( 0 ) ; 
220+         t ! ( t!( File :: open( & file) ,  & file) . read_to_string( & mut  contents) ) ; 
221+ 
222+         for  ( i,  line)  in  contents. lines ( ) . enumerate ( )  { 
223+             let  mut  err = |msg :  & str | { 
224+                 println ! ( "{}:{}: {}" ,  file. display( ) ,  i + 1 ,  msg) ; 
225+                 * bad = true ; 
226+             } ; 
227+             let  level = if  line. contains ( "[unstable(" )  { 
228+                 Status :: Unstable 
229+             }  else  if  line. contains ( "[stable(" )  { 
230+                 Status :: Stable 
231+             }  else  { 
232+                 continue ; 
233+             } ; 
234+             let  feature_name = match  find_attr_val ( line,  "feature" )  { 
235+                 Some ( name)  => name, 
236+                 None  => { 
237+                     err ( "malformed stability attribute" ) ; 
238+                     continue ; 
239+                 } 
240+             } ; 
241+             let  since = match  find_attr_val ( line,  "since" )  { 
242+                 Some ( name)  => name, 
243+                 None  if  level == Status :: Stable  => { 
244+                     err ( "malformed stability attribute" ) ; 
245+                     continue ; 
246+                 } 
247+                 None  => "None" , 
248+             } ; 
249+ 
250+             if  features. contains_key ( feature_name)  { 
251+                 err ( "duplicating a lang feature" ) ; 
252+             } 
253+             if  let  Some ( ref  s)  = lib_features. get ( feature_name)  { 
254+                 if  s. level  != level { 
255+                     err ( "different stability level than before" ) ; 
256+                 } 
257+                 if  s. since  != since { 
258+                     err ( "different `since` than before" ) ; 
259+                 } 
260+                 continue ; 
261+             } 
262+             lib_features. insert ( feature_name. to_owned ( ) , 
263+                                 Feature  { 
264+                                     level :  level, 
265+                                     since :  since. to_owned ( ) , 
266+                                     has_gate_test :  false , 
267+                                 } ) ; 
268+         } 
269+     } ) ; 
270+     lib_features
271+ } 
0 commit comments