mirror of
https://github.com/danbulant/oxc
synced 2026-05-21 13:18:59 +00:00
feat(prettier): handle binary in in for statement init (#1512)
This commit is contained in:
parent
7930f90112
commit
ef59f544b4
2 changed files with 35 additions and 2 deletions
|
|
@ -44,6 +44,14 @@ impl<'a> Prettier<'a> {
|
|||
return true;
|
||||
}
|
||||
|
||||
if self.check_kind(kind, parent_kind) {
|
||||
return true;
|
||||
}
|
||||
|
||||
false
|
||||
}
|
||||
|
||||
fn check_kind(&self, kind: AstKind<'a>, parent_kind: AstKind<'a>) -> bool {
|
||||
match kind {
|
||||
AstKind::NumberLiteral(literal) => {
|
||||
matches!(parent_kind, AstKind::MemberExpression(e) if e.object().span() == literal.span)
|
||||
|
|
@ -70,6 +78,12 @@ impl<'a> Prettier<'a> {
|
|||
true
|
||||
}
|
||||
AstKind::AssignmentExpression(_) => false,
|
||||
AstKind::ForStatement(stmt)
|
||||
if stmt.init.as_ref().is_some_and(|e| e.span() == assign_expr.span)
|
||||
|| stmt.update.as_ref().is_some_and(|e| e.span() == assign_expr.span) =>
|
||||
{
|
||||
false
|
||||
}
|
||||
AstKind::ExpressionStatement(_) => matches!(
|
||||
assign_expr.left,
|
||||
AssignmentTarget::AssignmentTargetPattern(
|
||||
|
|
@ -107,6 +121,11 @@ impl<'a> Prettier<'a> {
|
|||
AstKind::LogicalExpression(e) => self.check_binarish(e.span),
|
||||
AstKind::BinaryExpression(e) => match parent_kind {
|
||||
AstKind::UpdateExpression(_) => true,
|
||||
_ if e.operator == BinaryOperator::In
|
||||
&& self.is_path_in_for_statement_initializer(e.span) =>
|
||||
{
|
||||
true
|
||||
}
|
||||
_ => self.check_binarish(e.span),
|
||||
},
|
||||
AstKind::MemberExpression(e) => self.check_member_call(e.span()),
|
||||
|
|
@ -327,6 +346,21 @@ impl<'a> Prettier<'a> {
|
|||
false
|
||||
}
|
||||
|
||||
fn is_path_in_for_statement_initializer(&self, span: Span) -> bool {
|
||||
let mut node = Some(span);
|
||||
let mut parents = self.nodes.iter().rev();
|
||||
while let Some(n) = node {
|
||||
let parent = parents.next();
|
||||
if let Some(AstKind::ForStatement(stmt)) = parent {
|
||||
if stmt.init.as_ref().is_some_and(|init| init.span() == n) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
node = parent.map(GetSpan::span);
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn starts_with_no_lookahead_token(e: &Expression<'a>, span: Span) -> bool {
|
||||
match e {
|
||||
Expression::BinaryExpression(e) => Self::starts_with_no_lookahead_token(&e.left, span),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
Compatibility: 144/597 (24.12%)
|
||||
Compatibility: 145/597 (24.29%)
|
||||
|
||||
# Failed
|
||||
|
||||
|
|
@ -330,7 +330,6 @@ Compatibility: 144/597 (24.12%)
|
|||
* for/continue-and-break-comment-1.js
|
||||
* for/continue-and-break-comment-2.js
|
||||
* for/continue-and-break-comment-without-blocks.js
|
||||
* for/in.js
|
||||
|
||||
### function
|
||||
* function/function_expression.js
|
||||
|
|
|
|||
Loading…
Reference in a new issue