diff options
author | David Tolnay <dtolnay@gmail.com> | 2022-01-18 00:31:18 -0800 |
---|---|---|
committer | David Tolnay <dtolnay@gmail.com> | 2022-01-18 00:39:25 -0800 |
commit | c1f21761543caf9a94b1eab4b1e87add71a12fa0 (patch) | |
tree | 2daad92702fbb0cb720b7aad89cde60173721109 /gen/src/mod.rs | |
parent | abc64e24d179b1b986759d2875eb2513964489b1 (diff) | |
download | cxx-c1f21761543caf9a94b1eab4b1e87add71a12fa0.tar.gz |
Handle module-level cfg attributes
Diffstat (limited to 'gen/src/mod.rs')
-rw-r--r-- | gen/src/mod.rs | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/gen/src/mod.rs b/gen/src/mod.rs index 35b13fe8..351ac187 100644 --- a/gen/src/mod.rs +++ b/gen/src/mod.rs @@ -20,8 +20,10 @@ use self::cfg::UnsupportedCfgEvaluator; use self::error::{format_err, Result}; use self::file::File; use self::include::Include; +use crate::syntax::cfg::CfgExpr; use crate::syntax::report::Errors; -use crate::syntax::{self, Types}; +use crate::syntax::{self, attrs, Types}; +use std::collections::BTreeSet as Set; use std::path::Path; pub(super) use self::error::Error; @@ -132,18 +134,31 @@ pub(super) fn generate(syntax: File, opt: &Opt) -> Result<GeneratedCode> { let ref mut apis = Vec::new(); let ref mut errors = Errors::new(); + let ref mut cfg_errors = Set::new(); for bridge in syntax.modules { - let ref namespace = bridge.namespace; - let trusted = bridge.unsafety.is_some(); - apis.extend(syntax::parse_items( + let mut cfg = CfgExpr::Unconditional; + attrs::parse( errors, - bridge.content, - trusted, - namespace, - )); + bridge.attrs, + attrs::Parser { + cfg: Some(&mut cfg), + ignore_unrecognized: true, + ..Default::default() + }, + ); + if cfg::eval(errors, cfg_errors, opt.cfg_evaluator.as_ref(), &cfg) { + let ref namespace = bridge.namespace; + let trusted = bridge.unsafety.is_some(); + apis.extend(syntax::parse_items( + errors, + bridge.content, + trusted, + namespace, + )); + } } - cfg::strip(errors, opt.cfg_evaluator.as_ref(), apis); + cfg::strip(errors, cfg_errors, opt.cfg_evaluator.as_ref(), apis); errors.propagate()?; let ref types = Types::collect(errors, apis); |