Skip to content

Commit 06b9aab

Browse files
committed
fix: transformation
1 parent 644dd6e commit 06b9aab

File tree

4 files changed

+39
-59
lines changed

4 files changed

+39
-59
lines changed

crates/jsshaker/src/nodes/expr/literals.rs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use oxc::ast::ast::{
2-
BigIntLiteral, BooleanLiteral, NullLiteral, NumberBase, NumericLiteral, RegExpLiteral,
3-
StringLiteral,
2+
BigIntLiteral, BooleanLiteral, Expression, NullLiteral, NumberBase, NumericLiteral,
3+
RegExpLiteral, StringLiteral,
44
};
55

6-
use crate::{Analyzer, entity::Entity, utils::ast::AstKind2};
6+
use crate::{Analyzer, entity::Entity, transformer::Transformer, utils::ast::AstKind2};
77

88
impl<'a> Analyzer<'a> {
99
pub fn exec_string_literal(&mut self, node: &'a StringLiteral) -> Entity<'a> {
10-
self.mangler.use_constant_node(AstKind2::StringLiteral(node), &node.value).into()
10+
self.exec_mangable_static_string(AstKind2::StringLiteral(node), &node.value)
1111
}
1212

1313
pub fn exec_numeric_literal(&mut self, node: &'a NumericLiteral) -> Entity<'a> {
@@ -34,3 +34,20 @@ impl<'a> Analyzer<'a> {
3434
self.factory.unknown
3535
}
3636
}
37+
38+
impl<'a> Transformer<'a> {
39+
pub fn transform_string_literal(
40+
&self,
41+
node: &'a StringLiteral,
42+
need_val: bool,
43+
) -> Option<Expression<'a>> {
44+
let StringLiteral { span, value, .. } = node;
45+
need_val.then(|| {
46+
self.ast.expression_string_literal(
47+
*span,
48+
self.transform_mangable_static_string(AstKind2::StringLiteral(node), value),
49+
None,
50+
)
51+
})
52+
}
53+
}

crates/jsshaker/src/nodes/expr/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ impl<'a> Transformer<'a> {
125125
match_member_expression!(Expression) => {
126126
self.transform_member_expression_read(node.to_member_expression(), need_val)
127127
}
128-
Expression::StringLiteral(_)
129-
| Expression::NumericLiteral(_)
128+
Expression::StringLiteral(node) => self.transform_string_literal(node, need_val),
129+
Expression::NumericLiteral(_)
130130
| Expression::BigIntLiteral(_)
131131
| Expression::BooleanLiteral(_)
132132
| Expression::NullLiteral(_)

crates/jsshaker/src/nodes/expr/template_literal.rs

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
1-
use std::mem;
2-
31
use oxc::{
42
allocator::FromIn,
53
ast::ast::{Expression, TemplateElementValue, TemplateLiteral},
6-
span::{Atom, GetSpan, SPAN},
4+
span::Atom,
75
};
86

9-
use crate::{
10-
analyzer::Analyzer, build_effect, entity::Entity, transformer::Transformer, utils::ast::AstKind2,
11-
};
7+
use crate::{analyzer::Analyzer, build_effect, entity::Entity, transformer::Transformer};
128

139
impl<'a> Analyzer<'a> {
1410
pub fn exec_template_literal(&mut self, node: &'a TemplateLiteral<'a>) -> Entity<'a> {
@@ -36,52 +32,19 @@ impl<'a> Transformer<'a> {
3632
let mut quasis_iter = quasis.into_iter();
3733
let mut transformed_exprs = self.ast.vec();
3834
let mut transformed_quasis = vec![];
39-
let mut pending_effects = vec![];
4035
transformed_quasis
4136
.push(quasis_iter.next().unwrap().value.cooked.as_ref().unwrap().to_string());
42-
let exprs_len = expressions.len();
43-
for (index, expr) in expressions.into_iter().enumerate() {
44-
let is_last = index == exprs_len - 1;
45-
let expr_span = expr.span();
37+
for expr in expressions {
38+
let expr = self.transform_expression(expr, true).unwrap();
39+
transformed_exprs.push(expr);
40+
4641
let quasi_str = quasis_iter.next().unwrap().value.cooked.as_ref().unwrap().to_string();
47-
if let Some(literal) = self.get_folded_literal(AstKind2::Expression(expr)) {
48-
if let Some(effect) = self.transform_expression(expr, false) {
49-
pending_effects.push(Some(effect));
50-
}
51-
if !pending_effects.is_empty() && is_last {
52-
transformed_exprs.push(build_effect!(
53-
&self.ast,
54-
expr_span,
55-
mem::take(&mut pending_effects);
56-
literal.build_expr(self, SPAN, None)
57-
));
58-
transformed_quasis.push(quasi_str);
59-
} else {
60-
let last_quasi = transformed_quasis.pop().unwrap();
61-
let expr_str = literal.to_string(self.allocator);
62-
transformed_quasis.push(format!("{}{}{}", last_quasi, expr_str, quasi_str));
63-
}
64-
} else {
65-
let expr = self.transform_expression(expr, true).unwrap();
66-
transformed_exprs.push(build_effect!(
67-
&self.ast,
68-
expr_span,
69-
mem::take(&mut pending_effects);
70-
expr
71-
));
72-
transformed_quasis.push(quasi_str);
73-
}
42+
transformed_quasis.push(quasi_str);
7443
}
7544
if transformed_exprs.is_empty() {
7645
let s = transformed_quasis.pop().unwrap();
77-
Some(build_effect!(
78-
&self.ast,
79-
*span,
80-
pending_effects;
81-
self.ast.expression_string_literal(*span, self.ast.atom(&s), None)
82-
))
46+
Some(self.ast.expression_string_literal(*span, self.ast.atom(&s), None))
8347
} else {
84-
assert!(pending_effects.is_empty());
8548
let mut quasis = self.ast.vec();
8649
let quasis_len = transformed_quasis.len();
8750
for (index, quasi) in transformed_quasis.into_iter().enumerate() {

crates/jsshaker/tests/snapshots/test@template_literal.js.snap

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)