-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathvisitor.rs
110 lines (94 loc) · 2.64 KB
/
visitor.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use std::{
hash::{Hash, Hasher}, vec
};
use indexmap::IndexMap;
use swc_core::common::{Span, DUMMY_SP};
use swc_core::ecma::ast::*;
use crate::style_propetries::{style_value_type::StyleValueType, traits::ToStyleValue, unit::{Platform, PropertyTuple}};
#[derive(Eq, Clone, Copy, Debug)]
pub struct SpanKey(pub Span);
impl PartialEq for SpanKey {
fn eq(&self, other: &Self) -> bool {
self.0.lo == other.0.lo && self.0.hi == other.0.hi
}
}
impl Hash for SpanKey {
fn hash<H: Hasher>(&self, state: &mut H) {
self.0.lo.hash(state);
self.0.hi.hash(state);
}
}
pub fn parse_style_values(value: Vec<StyleValueType>, platform: Platform) -> Vec<Option<ExprOrSpread>> {
let mut prop_or_spread = vec![];
// 使用有序表
let mut index_map = IndexMap::new();
let mut variable_map = IndexMap::new();
value.into_iter().for_each(|style_value| {
let prop = style_value.to_expr(platform.clone());
match prop {
PropertyTuple::One(id, expr) => {
if let Expr::Invalid(_) = expr { return }
index_map.insert(id.clone(), Box::new(expr));
}
PropertyTuple::Array(prop_arr) => {
prop_arr.into_iter().for_each(|(id, expr)| {
if let Expr::Invalid(_) = expr { return }
index_map.insert(id.clone(), Box::new(expr));
})
}
PropertyTuple::Variable { key, value} => {
variable_map.insert(key.clone(), value.clone());
}
}
});
index_map.into_iter().for_each(|(id, expr)| {
let id_num = id.clone() as u32;
prop_or_spread.push(Expr::Array(ArrayLit {
span: DUMMY_SP,
elems: vec![
Some(ExprOrSpread {
spread: None,
expr: Box::new(Expr::Lit(Lit::Num(Number {
span: DUMMY_SP,
value: id_num as f64,
raw: None
})))
}),
Some(ExprOrSpread {
spread: None,
expr
})
]
}))
});
variable_map.into_iter().for_each(|(key, value)| {
let key_ = key.to_string();
prop_or_spread.push(Expr::Array(ArrayLit {
span: DUMMY_SP,
elems: vec![
Some(ExprOrSpread {
spread: None,
expr: Box::new(Expr::Lit(Lit::Str(Str {
span: DUMMY_SP,
value: MyAtom::new(key_),
raw: None
})))
}),
Some(ExprOrSpread {
spread: None,
expr: Box::new(Expr::Lit(Lit::Str(Str {
span: DUMMY_SP,
value: MyAtom::new(value),
raw: None
})))
})
]
}))
});
prop_or_spread.into_iter().map(|expr| {
Some(ExprOrSpread {
spread: None,
expr: Box::new(expr)
})
}).collect()
}