aboutsummaryrefslogtreecommitdiff
path: root/gen/src/mod.rs
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2022-01-18 00:31:18 -0800
committerDavid Tolnay <dtolnay@gmail.com>2022-01-18 00:39:25 -0800
commitc1f21761543caf9a94b1eab4b1e87add71a12fa0 (patch)
tree2daad92702fbb0cb720b7aad89cde60173721109 /gen/src/mod.rs
parentabc64e24d179b1b986759d2875eb2513964489b1 (diff)
downloadcxx-c1f21761543caf9a94b1eab4b1e87add71a12fa0.tar.gz
Handle module-level cfg attributes
Diffstat (limited to 'gen/src/mod.rs')
-rw-r--r--gen/src/mod.rs33
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);