swc/common/tests/fold_and_then.rs
강동윤 eebf14fbef
Allow stable rust (#118)
This pr introduces some cargo features. For `swc_common` and `swc_ecma_ast`, it introduces a feature flag `fold`.
`Fold` and `Visit` traits exist only if the feature is enabled.

For `swc_ecma_parser`, flag called `verify` is added. When disabled, we skip checking of validity of some expressions.

e.g. `{foo = bar}`

Verification is disabled by default it requires nightly compiler
2019-01-17 23:17:16 +09:00

68 lines
1.4 KiB
Rust

#![feature(box_patterns)]
#![feature(box_syntax)]
#![feature(specialization)]
#![feature(test)]
#![cfg(feature = "fold")]
#[macro_use]
extern crate swc_common;
extern crate test;
use std::{cell::RefCell, rc::Rc};
use swc_common::{Fold, FoldWith};
struct Named(&'static str, Rc<RefCell<Vec<(&'static str, String)>>>);
impl Fold<String> for Named {
fn fold(&mut self, v: String) -> String {
let name = self.0;
self.1.borrow_mut().push((name, v.clone()));
v
}
}
#[derive(Fold)]
struct Nested<T>(#[fold(bound)] T);
#[test]
fn vec_order() {
let logger = Rc::new(RefCell::default());
vec![
box String::from("foo"),
box String::from("bar"),
box String::from("baz"),
]
.into_iter()
.map(Box::new)
.map(Nested)
.map(Box::new)
.map(Nested)
.map(Nested)
.collect::<Vec<_>>()
.fold_with(&mut chain!(
Named("A", logger.clone()),
Named("B", logger.clone()),
Named("C", logger.clone())
));
let result = Rc::try_unwrap(logger).unwrap();
assert_eq!(
vec![
("A", "foo"),
("B", "foo"),
("C", "foo"),
("A", "bar"),
("B", "bar"),
("C", "bar"),
("A", "baz"),
("B", "baz"),
("C", "baz"),
]
.into_iter()
.map(|(n, v)| (n, String::from(v)))
.collect::<Vec<_>>(),
result.into_inner()
);
}