diff options
| author | John Renner <john@jrenner.net> | 2018-09-02 09:03:24 -0700 |
|---|---|---|
| committer | John Renner <john@jrenner.net> | 2018-09-04 22:33:23 -0700 |
| commit | 0593dc7e3c9783f1c0bbbc8f017f9e914114e057 (patch) | |
| tree | 851bd551452a99115a72773b871f0d0f1433fcc4 /src/libsyntax | |
| parent | e5ed10571690b2ee4fc64319967973b2e50b517f (diff) | |
| download | rust-0593dc7e3c9783f1c0bbbc8f017f9e914114e057.tar.gz rust-0593dc7e3c9783f1c0bbbc8f017f9e914114e057.zip | |
Move #[test_case] to a syntax extension
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/config.rs | 15 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 50 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/test.rs | 2 |
5 files changed, 17 insertions, 65 deletions
diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs index 900d830b4c0..5233267e3a9 100644 --- a/src/libsyntax/config.rs +++ b/src/libsyntax/config.rs @@ -21,18 +21,16 @@ use ptr::P; /// A folder that strips out items that do not belong in the current configuration. pub struct StripUnconfigured<'a> { - pub should_test: bool, pub sess: &'a ParseSess, pub features: Option<&'a Features>, } // `cfg_attr`-process the crate's attributes and compute the crate's features. -pub fn features(mut krate: ast::Crate, sess: &ParseSess, should_test: bool, edition: Edition) +pub fn features(mut krate: ast::Crate, sess: &ParseSess, edition: Edition) -> (ast::Crate, Features) { let features; { let mut strip_unconfigured = StripUnconfigured { - should_test, sess, features: None, }; @@ -118,11 +116,6 @@ impl<'a> StripUnconfigured<'a> { // Determine if a node with the given attributes should be included in this configuration. pub fn in_cfg(&mut self, attrs: &[ast::Attribute]) -> bool { attrs.iter().all(|attr| { - // When not compiling with --test we should not compile the #[test] functions - if !self.should_test && is_test(attr) { - return false; - } - let mis = if !is_cfg(attr) { return true; } else if let Some(mis) = attr.meta_item_list() { @@ -249,7 +242,7 @@ impl<'a> StripUnconfigured<'a> { // // NB: This is intentionally not part of the fold_expr() function // in order for fold_opt_expr() to be able to avoid this check - if let Some(attr) = expr.attrs().iter().find(|a| is_cfg(a) || is_test(a)) { + if let Some(attr) = expr.attrs().iter().find(|a| is_cfg(a)) { let msg = "removing an expression is not supported in this position"; self.sess.span_diagnostic.span_err(attr.span, msg); } @@ -352,7 +345,3 @@ impl<'a> fold::Folder for StripUnconfigured<'a> { fn is_cfg(attr: &ast::Attribute) -> bool { attr.check_name("cfg") } - -pub fn is_test(att: &ast::Attribute) -> bool { - att.check_name("test_case") -} diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 956e086b01b..3bb19121ee3 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -450,14 +450,12 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let (fragment_with_placeholders, invocations) = { let mut collector = InvocationCollector { cfg: StripUnconfigured { - should_test: self.cx.ecfg.should_test, sess: self.cx.parse_sess, features: self.cx.ecfg.features, }, cx: self.cx, invocations: Vec::new(), monotonic: self.monotonic, - tests_nameable: true, }; (fragment.fold_with(&mut collector), collector.invocations) }; @@ -475,7 +473,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> { fn fully_configure(&mut self, item: Annotatable) -> Annotatable { let mut cfg = StripUnconfigured { - should_test: self.cx.ecfg.should_test, sess: self.cx.parse_sess, features: self.cx.ecfg.features, }; @@ -1047,11 +1044,6 @@ struct InvocationCollector<'a, 'b: 'a> { cfg: StripUnconfigured<'a>, invocations: Vec<Invocation>, monotonic: bool, - - /// Test functions need to be nameable. Tests inside functions or in other - /// unnameable locations need to be ignored. `tests_nameable` tracks whether - /// any test functions found in the current context would be nameable. - tests_nameable: bool, } impl<'a, 'b> InvocationCollector<'a, 'b> { @@ -1069,20 +1061,6 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { placeholder(fragment_kind, NodeId::placeholder_from_mark(mark)) } - /// Folds the item allowing tests to be expanded because they are still nameable. - /// This should probably only be called with module items - fn fold_nameable(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> { - fold::noop_fold_item(item, self) - } - - /// Folds the item but doesn't allow tests to occur within it - fn fold_unnameable(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> { - let was_nameable = mem::replace(&mut self.tests_nameable, false); - let items = fold::noop_fold_item(item, self); - self.tests_nameable = was_nameable; - items - } - fn collect_bang(&mut self, mac: ast::Mac, span: Span, kind: AstFragmentKind) -> AstFragment { self.collect(kind, InvocationKind::Bang { mac: mac, ident: None, span: span }) } @@ -1297,7 +1275,7 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> { fn fold_item(&mut self, item: P<ast::Item>) -> OneVector<P<ast::Item>> { let item = configure!(self, item); - let (attr, traits, mut item) = self.classify_item(item); + let (attr, traits, item) = self.classify_item(item); if attr.is_some() || !traits.is_empty() { let item = Annotatable::Item(item); return self.collect_attr(attr, traits, item, AstFragmentKind::Items).make_items(); @@ -1319,7 +1297,7 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> { } ast::ItemKind::Mod(ast::Mod { inner, .. }) => { if item.ident == keywords::Invalid.ident() { - return self.fold_nameable(item); + return noop_fold_item(item, self); } let orig_directory_ownership = self.cx.current_expansion.directory_ownership; @@ -1359,32 +1337,13 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> { let orig_module = mem::replace(&mut self.cx.current_expansion.module, Rc::new(module)); - let result = self.fold_nameable(item); + let result = noop_fold_item(item, self); self.cx.current_expansion.module = orig_module; self.cx.current_expansion.directory_ownership = orig_directory_ownership; result } - // Ensure that test items can be exported by the harness generator. - // #[test] fn foo() {} - // becomes: - // #[test] pub fn foo_gensym(){} - ast::ItemKind::Const(..) - | ast::ItemKind::Static(..) - | ast::ItemKind::Fn(..) if self.cx.ecfg.should_test => { - if self.tests_nameable && attr::contains_name(&item.attrs, "test_case") { - // Publicize the item under gensymed name to avoid pollution - // This means #[test_case] items can't be referenced by user code - item = item.map(|mut item| { - item.vis = respan(item.vis.span, ast::VisibilityKind::Public); - item.ident = item.ident.gensym(); - item - }); - } - - self.fold_unnameable(item) - } - _ => self.fold_unnameable(item), + _ => noop_fold_item(item, self), } } @@ -1609,6 +1568,7 @@ impl<'feat> ExpansionConfig<'feat> { feature_tests! { fn enable_quotes = quote, fn enable_asm = asm, + fn enable_custom_test_frameworks = custom_test_frameworks, fn enable_global_asm = global_asm, fn enable_log_syntax = log_syntax, fn enable_concat_idents = concat_idents, diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index c94c7874a05..e3ea3563d85 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -777,10 +777,6 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG ("no_link", Normal, Ungated), ("derive", Normal, Ungated), ("should_panic", Normal, Ungated), - ("test_case", Normal, Gated(Stability::Unstable, - "custom_test_frameworks", - "Custom test frameworks are experimental", - cfg_fn!(custom_test_frameworks))), ("ignore", Normal, Ungated), ("no_implicit_prelude", Normal, Ungated), ("reexport_test_harness_main", Normal, Ungated), @@ -965,6 +961,11 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG attribute is just used for rustc unit \ tests and will never be stable", cfg_fn!(rustc_attrs))), + ("rustc_test_marker", Normal, Gated(Stability::Unstable, + "rustc_attrs", + "the `#[rustc_test_marker]` attribute \ + is used internally to track tests", + cfg_fn!(rustc_attrs))), // RFC #2094 ("nll", Whitelisted, Gated(Stability::Unstable, @@ -1164,7 +1165,7 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG ("type_length_limit", CrateLevel, Ungated), ("test_runner", CrateLevel, Gated(Stability::Unstable, "custom_test_frameworks", - "Custom Test Frameworks is an unstable feature", + EXPLAIN_CUSTOM_TEST_FRAMEWORKS, cfg_fn!(custom_test_frameworks))), ]; @@ -1382,6 +1383,9 @@ pub const EXPLAIN_ASM: &'static str = pub const EXPLAIN_GLOBAL_ASM: &'static str = "`global_asm!` is not stable enough for use and is subject to change"; +pub const EXPLAIN_CUSTOM_TEST_FRAMEWORKS: &'static str = + "custom test frameworks are an unstable feature"; + pub const EXPLAIN_LOG_SYNTAX: &'static str = "`log_syntax!` is not stable enough for use and is subject to change"; diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 3862877c3d9..5f80af77f49 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -6272,7 +6272,6 @@ impl<'a> Parser<'a> { let (in_cfg, outer_attrs) = { let mut strip_unconfigured = ::config::StripUnconfigured { sess: self.sess, - should_test: false, // irrelevant features: None, // don't perform gated feature checking }; let outer_attrs = strip_unconfigured.process_cfg_attrs(outer_attrs.to_owned()); diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs index 91c63227d30..ab67736c389 100644 --- a/src/libsyntax/test.rs +++ b/src/libsyntax/test.rs @@ -433,7 +433,7 @@ fn visible_path(cx: &TestCtxt, path: &[Ident]) -> Vec<Ident>{ } fn is_test_case(i: &ast::Item) -> bool { - attr::contains_name(&i.attrs, "test_case") + attr::contains_name(&i.attrs, "rustc_test_marker") } fn get_test_runner(sd: &errors::Handler, krate: &ast::Crate) -> Option<ast::Path> { |
