10
10
11
11
use attr:: HasAttrs ;
12
12
use feature_gate:: { emit_feature_err, EXPLAIN_STMT_ATTR_SYNTAX , Features , get_features, GateIssue } ;
13
- use fold:: Folder ;
14
13
use { fold, attr} ;
15
14
use ast;
16
15
use codemap:: { Spanned , respan} ;
@@ -27,6 +26,40 @@ pub struct StripUnconfigured<'a> {
27
26
pub features : Option < & ' a Features > ,
28
27
}
29
28
29
+ // `cfg_attr`-process the crate's attributes and compute the crate's features.
30
+ pub fn features ( mut krate : ast:: Crate , sess : & ParseSess , should_test : bool )
31
+ -> ( ast:: Crate , Features ) {
32
+ let features;
33
+ {
34
+ let mut strip_unconfigured = StripUnconfigured {
35
+ config : & krate. config . clone ( ) ,
36
+ should_test : should_test,
37
+ sess : sess,
38
+ features : None ,
39
+ } ;
40
+
41
+ let unconfigured_attrs = krate. attrs . clone ( ) ;
42
+ let err_count = sess. span_diagnostic . err_count ( ) ;
43
+ if let Some ( attrs) = strip_unconfigured. configure ( krate. attrs ) {
44
+ krate. attrs = attrs;
45
+ } else { // the entire crate is unconfigured
46
+ krate. attrs = Vec :: new ( ) ;
47
+ krate. module . items = Vec :: new ( ) ;
48
+ return ( krate, Features :: new ( ) ) ;
49
+ }
50
+
51
+ features = get_features ( & sess. span_diagnostic , & krate. attrs ) ;
52
+
53
+ // Avoid reconfiguring malformed `cfg_attr`s
54
+ if err_count == sess. span_diagnostic . err_count ( ) {
55
+ strip_unconfigured. features = Some ( & features) ;
56
+ strip_unconfigured. configure ( unconfigured_attrs) ;
57
+ }
58
+ }
59
+
60
+ ( krate, features)
61
+ }
62
+
30
63
impl < ' a > StripUnconfigured < ' a > {
31
64
fn configure < T : HasAttrs > ( & mut self , node : T ) -> Option < T > {
32
65
let node = self . process_cfg_attrs ( node) ;
@@ -125,34 +158,6 @@ impl<'a> StripUnconfigured<'a> {
125
158
}
126
159
}
127
160
128
- // Support conditional compilation by transforming the AST, stripping out
129
- // any items that do not belong in the current configuration
130
- pub fn strip_unconfigured_items ( mut krate : ast:: Crate , sess : & ParseSess , should_test : bool )
131
- -> ( ast:: Crate , Features ) {
132
- let features;
133
- {
134
- let mut strip_unconfigured = StripUnconfigured {
135
- config : & krate. config . clone ( ) ,
136
- should_test : should_test,
137
- sess : sess,
138
- features : None ,
139
- } ;
140
-
141
- let err_count = sess. span_diagnostic . err_count ( ) ;
142
- let krate_attrs = strip_unconfigured. configure ( krate. attrs . clone ( ) ) . unwrap_or_default ( ) ;
143
- features = get_features ( & sess. span_diagnostic , & krate_attrs) ;
144
- if err_count < sess. span_diagnostic . err_count ( ) {
145
- krate. attrs = krate_attrs. clone ( ) ; // Avoid reconfiguring malformed `cfg_attr`s
146
- }
147
-
148
- strip_unconfigured. features = Some ( & features) ;
149
- krate = strip_unconfigured. fold_crate ( krate) ;
150
- krate. attrs = krate_attrs;
151
- }
152
-
153
- ( krate, features)
154
- }
155
-
156
161
impl < ' a > fold:: Folder for StripUnconfigured < ' a > {
157
162
fn fold_foreign_mod ( & mut self , foreign_mod : ast:: ForeignMod ) -> ast:: ForeignMod {
158
163
ast:: ForeignMod {
0 commit comments