From 18fa8e45a4f254a5ce1b0886cdda22afdabf56df Mon Sep 17 00:00:00 2001 From: Boshen Date: Sun, 19 Nov 2023 17:48:09 +0800 Subject: [PATCH] feat(prettier): format `for((let) of ..` (#1429) --- crates/oxc_prettier/src/format/mod.rs | 40 ++++++++++++++++++++- tasks/prettier_conformance/prettier.snap.md | 6 +--- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/crates/oxc_prettier/src/format/mod.rs b/crates/oxc_prettier/src/format/mod.rs index f7ed65f60..8c55dce39 100644 --- a/crates/oxc_prettier/src/format/mod.rs +++ b/crates/oxc_prettier/src/format/mod.rs @@ -243,7 +243,45 @@ impl<'a> Format<'a> for ForOfStatement<'a> { parts.push(ss!(" await")); } parts.push(ss!(" (")); - parts.push(format!(p, self.left)); + + // for ((async) of []); + // for ((let) of []); + // for ((let.a) of []); + let mut should_hug = false; + if let ForStatementLeft::AssignmentTarget(AssignmentTarget::SimpleAssignmentTarget( + target, + )) = &self.left + { + if let SimpleAssignmentTarget::AssignmentTargetIdentifier(ident) = target { + if ident.name == "let" { + should_hug = true; + } + if ident.name == "async" && !self.r#await { + should_hug = true; + } + } + if let SimpleAssignmentTarget::MemberAssignmentTarget(member_expr) = target { + let object = match &**member_expr { + MemberExpression::ComputedMemberExpression(e) => Some(&e.object), + MemberExpression::StaticMemberExpression(e) => Some(&e.object), + MemberExpression::PrivateFieldExpression(e) => None, + }; + if let Some(Expression::Identifier(ident)) = object { + if ident.name == "let" { + should_hug = true; + } + } + } + } + + if should_hug { + parts.push(ss!("(")); + parts.push(format!(p, self.left)); + parts.push(ss!(")")); + } else { + parts.push(format!(p, self.left)); + } + parts.push(ss!(" of ")); parts.push(format!(p, self.right)); parts.push(ss!(")")); diff --git a/tasks/prettier_conformance/prettier.snap.md b/tasks/prettier_conformance/prettier.snap.md index c4b29535e..8fd70a50a 100644 --- a/tasks/prettier_conformance/prettier.snap.md +++ b/tasks/prettier_conformance/prettier.snap.md @@ -1,4 +1,4 @@ -Compatibility: 119/838 (14.20%) +Compatibility: 121/838 (14.44%) # Failed @@ -476,9 +476,6 @@ Compatibility: 119/838 (14.20%) ### for-await * for-await/for-await.js -### for-of -* for-of/async-identifier.js - ### function * function/function_expression.js * function/issue-10277.js @@ -514,7 +511,6 @@ Compatibility: 119/838 (14.20%) * generator/function-name-starts-with-get.js ### identifier/for-of -* identifier/for-of/await.js * identifier/for-of/let.js ### identifier/parentheses