From 39fccf3bc78c53924dd0b5676dc114d62ab8d1b0 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 30 Jun 2011 13:04:02 -0700 Subject: [PATCH] Conditionally compile items declared as statements. Issue #489 --- src/comp/front/config.rs | 31 +++++++++++++++++++++++- src/test/run-pass/conditional-compile.rs | 13 ++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/comp/front/config.rs b/src/comp/front/config.rs index 04429481b5a..5d10ea05816 100644 --- a/src/comp/front/config.rs +++ b/src/comp/front/config.rs @@ -11,7 +11,8 @@ export strip_unconfigured_items; fn strip_unconfigured_items(@ast::crate crate) -> @ast::crate { auto cfg = crate.node.config; - auto precursor = rec(fold_mod = bind fold_mod(cfg, _, _) + auto precursor = rec(fold_mod = bind fold_mod(cfg, _, _), + fold_block = bind fold_block(cfg, _, _) with *fold::default_ast_fold()); auto fold = fold::make_fold(precursor); @@ -38,6 +39,34 @@ fn fold_mod(&ast::crate_cfg cfg, &ast::_mod m, items=vec::map(fld.fold_item, filtered_items)); } +fn filter_stmt(&ast::crate_cfg cfg, + &@ast::stmt stmt) -> option::t[@ast::stmt] { + alt (stmt.node) { + case (ast::stmt_decl(?decl, _)) { + alt (decl.node) { + case (ast::decl_item(?item)) { + if (in_cfg(cfg, item)) { + option::some(stmt) + } else { + option::none + } + } + case (_) { option::some(stmt) } + } + } + case (_) { option::some(stmt) } + } +} + +fn fold_block(&ast::crate_cfg cfg, &ast::block_ b, + fold::ast_fold fld) -> ast::block_ { + auto filter = bind filter_stmt(cfg, _); + auto filtered_stmts = vec::filter_map(filter, b.stmts); + ret rec(stmts=vec::map(fld.fold_stmt, filtered_stmts), + expr=option::map(fld.fold_expr, b.expr), + id=b.id); +} + // Determine if an item should be translated in the current crate // configuration based on the item's attributes fn in_cfg(&ast::crate_cfg cfg, &@ast::item item) -> bool { diff --git a/src/test/run-pass/conditional-compile.rs b/src/test/run-pass/conditional-compile.rs index bfc9e4d8e6c..6acc399dfea 100644 --- a/src/test/run-pass/conditional-compile.rs +++ b/src/test/run-pass/conditional-compile.rs @@ -70,5 +70,18 @@ fn main() { assert b; let t x = true; let tg y = bar; + + test_in_fn_ctxt(); } +fn test_in_fn_ctxt() { + #[cfg(bogus)] + fn f() { fail } + fn f() {} + f(); + + #[cfg(bogus)] + const int i = 0; + const int i = 1; + assert i == 1; +}