mirror of
https://github.com/swc-project/swc.git
synced 2024-12-19 03:31:45 +03:00
eebf14fbef
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
68 lines
1.4 KiB
Rust
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()
|
|
);
|
|
}
|