From 79d2af3e6a9457618bfa8d4c8de02f235032ea20 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Mon, 12 Sep 2022 23:38:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20more=20strict=20constrai?= =?UTF-8?q?nt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/src/generated.rs | 306 ++++++++-------- .../src/js/any/left_hand_side_expression.rs | 18 +- crates/rome_js_syntax/src/generated/nodes.rs | 333 +++++++++++++++--- xtask/codegen/js.ungram | 30 +- 4 files changed, 479 insertions(+), 208 deletions(-) diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index 5bd2fc3e1097..f7c2a920890d 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -2856,6 +2856,134 @@ impl IntoFormat for rome_js_syntax::JsxTagExpression { ) } } +impl FormatRule for crate::jsx::tag::element::FormatJsxElement { + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsxElement, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxElement { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxElement, + crate::jsx::tag::element::FormatJsxElement, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) + } +} +impl IntoFormat for rome_js_syntax::JsxElement { + type Format = + FormatOwnedWithRule; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) + } +} +impl FormatRule + for crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt( + &self, + node: &rome_js_syntax::JsxSelfClosingElement, + f: &mut JsFormatter, + ) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxSelfClosingElement { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxSelfClosingElement, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsxSelfClosingElement { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsxSelfClosingElement, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), + ) + } +} +impl FormatRule for crate::jsx::tag::fragment::FormatJsxFragment { + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsxFragment, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxFragment { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxFragment, + crate::jsx::tag::fragment::FormatJsxFragment, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::jsx::tag::fragment::FormatJsxFragment::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsxFragment { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsxFragment, + crate::jsx::tag::fragment::FormatJsxFragment, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::jsx::tag::fragment::FormatJsxFragment::default(), + ) + } +} +impl FormatRule + for crate::js::auxiliary::private_name::FormatJsPrivateName +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsPrivateName, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsPrivateName { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsPrivateName, + crate::js::auxiliary::private_name::FormatJsPrivateName, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::js::auxiliary::private_name::FormatJsPrivateName::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsPrivateName { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsPrivateName, + crate::js::auxiliary::private_name::FormatJsPrivateName, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::js::auxiliary::private_name::FormatJsPrivateName::default(), + ) + } +} impl FormatRule for crate::ts::expressions::type_arguments::FormatTsTypeArguments { @@ -3280,40 +3408,6 @@ impl IntoFormat for rome_js_syntax::JsReferenceIdentifie ) } } -impl FormatRule - for crate::js::auxiliary::private_name::FormatJsPrivateName -{ - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsPrivateName, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsPrivateName { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsPrivateName, - crate::js::auxiliary::private_name::FormatJsPrivateName, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::js::auxiliary::private_name::FormatJsPrivateName::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsPrivateName { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsPrivateName, - crate::js::auxiliary::private_name::FormatJsPrivateName, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::js::auxiliary::private_name::FormatJsPrivateName::default(), - ) - } -} impl FormatRule for crate::js::objects::literal_member_name::FormatJsLiteralMemberName { @@ -8796,100 +8890,6 @@ impl IntoFormat for rome_js_syntax::TsQualifiedName { ) } } -impl FormatRule for crate::jsx::tag::element::FormatJsxElement { - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsxElement, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxElement { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxElement, - crate::jsx::tag::element::FormatJsxElement, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) - } -} -impl IntoFormat for rome_js_syntax::JsxElement { - type Format = - FormatOwnedWithRule; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) - } -} -impl FormatRule - for crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement -{ - type Context = JsFormatContext; - #[inline(always)] - fn fmt( - &self, - node: &rome_js_syntax::JsxSelfClosingElement, - f: &mut JsFormatter, - ) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxSelfClosingElement { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxSelfClosingElement, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsxSelfClosingElement { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsxSelfClosingElement, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), - ) - } -} -impl FormatRule for crate::jsx::tag::fragment::FormatJsxFragment { - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsxFragment, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxFragment { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxFragment, - crate::jsx::tag::fragment::FormatJsxFragment, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::jsx::tag::fragment::FormatJsxFragment::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsxFragment { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsxFragment, - crate::jsx::tag::fragment::FormatJsxFragment, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::jsx::tag::fragment::FormatJsxFragment::default(), - ) - } -} impl FormatRule for crate::jsx::tag::opening_element::FormatJsxOpeningElement { @@ -10839,6 +10839,31 @@ impl IntoFormat for rome_js_syntax::JsAnyLiteralExpressi ) } } +impl<'a> AsFormat<'a> for rome_js_syntax::JsLeftHandSideExpression { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsLeftHandSideExpression, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsLeftHandSideExpression { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsLeftHandSideExpression, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), + ) + } +} impl<'a> AsFormat<'a> for rome_js_syntax::JsAnyTemplateElement { type Format = FormatRefWithRule< 'a, @@ -11983,31 +12008,6 @@ impl IntoFormat for rome_js_syntax::TsAnyTemplateElement ) } } -impl<'a> AsFormat<'a> for rome_js_syntax::JsLeftHandSideExpression { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsLeftHandSideExpression, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsLeftHandSideExpression { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsLeftHandSideExpression, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), - ) - } -} impl<'a> AsFormat<'a> for rome_js_syntax::JsxAnyTag { type Format = FormatRefWithRule<'a, rome_js_syntax::JsxAnyTag, crate::jsx::any::tag::FormatJsxAnyTag>; diff --git a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs index d28bd45493c7..142053291cc9 100644 --- a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs +++ b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs @@ -8,13 +8,25 @@ impl FormatRule for FormatJsLeftHandSideExpression { type Context = JsFormatContext; fn fmt(&self, node: &JsLeftHandSideExpression, f: &mut JsFormatter) -> FormatResult<()> { match node { - JsLeftHandSideExpression::JsParenthesizedExpression(node) => node.format().fmt(f), JsLeftHandSideExpression::JsStaticMemberExpression(node) => node.format().fmt(f), JsLeftHandSideExpression::JsComputedMemberExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsNewExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsCallExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsxElement(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsxSelfClosingElement(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsxFragment(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsTemplate(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsArrayExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsParenthesizedExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsObjectExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsClassExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsFunctionExpression(node) => node.format().fmt(f), JsLeftHandSideExpression::JsIdentifierExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsAnyLiteralExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::TsInstantiationExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsThisExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsPrivateName(node) => node.format().fmt(f), JsLeftHandSideExpression::TsNonNullAssertionExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::TsTypeAssertionExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::TsAsExpression(node) => node.format().fmt(f), } } } diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 8d382b5877c1..6c1f2fbeaf08 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -13820,54 +13820,138 @@ impl JsAnyTemplateElement { #[derive(Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize))] pub enum JsLeftHandSideExpression { + JsAnyLiteralExpression(JsAnyLiteralExpression), + JsArrayExpression(JsArrayExpression), + JsCallExpression(JsCallExpression), + JsClassExpression(JsClassExpression), JsComputedMemberExpression(JsComputedMemberExpression), + JsFunctionExpression(JsFunctionExpression), JsIdentifierExpression(JsIdentifierExpression), + JsNewExpression(JsNewExpression), + JsObjectExpression(JsObjectExpression), JsParenthesizedExpression(JsParenthesizedExpression), + JsPrivateName(JsPrivateName), JsStaticMemberExpression(JsStaticMemberExpression), - TsAsExpression(TsAsExpression), + JsTemplate(JsTemplate), + JsThisExpression(JsThisExpression), + JsxElement(JsxElement), + JsxFragment(JsxFragment), + JsxSelfClosingElement(JsxSelfClosingElement), + TsInstantiationExpression(TsInstantiationExpression), TsNonNullAssertionExpression(TsNonNullAssertionExpression), - TsTypeAssertionExpression(TsTypeAssertionExpression), } impl JsLeftHandSideExpression { + pub fn as_js_any_literal_expression(&self) -> Option<&JsAnyLiteralExpression> { + match &self { + JsLeftHandSideExpression::JsAnyLiteralExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_array_expression(&self) -> Option<&JsArrayExpression> { + match &self { + JsLeftHandSideExpression::JsArrayExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_call_expression(&self) -> Option<&JsCallExpression> { + match &self { + JsLeftHandSideExpression::JsCallExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_class_expression(&self) -> Option<&JsClassExpression> { + match &self { + JsLeftHandSideExpression::JsClassExpression(item) => Some(item), + _ => None, + } + } pub fn as_js_computed_member_expression(&self) -> Option<&JsComputedMemberExpression> { match &self { JsLeftHandSideExpression::JsComputedMemberExpression(item) => Some(item), _ => None, } } + pub fn as_js_function_expression(&self) -> Option<&JsFunctionExpression> { + match &self { + JsLeftHandSideExpression::JsFunctionExpression(item) => Some(item), + _ => None, + } + } pub fn as_js_identifier_expression(&self) -> Option<&JsIdentifierExpression> { match &self { JsLeftHandSideExpression::JsIdentifierExpression(item) => Some(item), _ => None, } } + pub fn as_js_new_expression(&self) -> Option<&JsNewExpression> { + match &self { + JsLeftHandSideExpression::JsNewExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_object_expression(&self) -> Option<&JsObjectExpression> { + match &self { + JsLeftHandSideExpression::JsObjectExpression(item) => Some(item), + _ => None, + } + } pub fn as_js_parenthesized_expression(&self) -> Option<&JsParenthesizedExpression> { match &self { JsLeftHandSideExpression::JsParenthesizedExpression(item) => Some(item), _ => None, } } + pub fn as_js_private_name(&self) -> Option<&JsPrivateName> { + match &self { + JsLeftHandSideExpression::JsPrivateName(item) => Some(item), + _ => None, + } + } pub fn as_js_static_member_expression(&self) -> Option<&JsStaticMemberExpression> { match &self { JsLeftHandSideExpression::JsStaticMemberExpression(item) => Some(item), _ => None, } } - pub fn as_ts_as_expression(&self) -> Option<&TsAsExpression> { + pub fn as_js_template(&self) -> Option<&JsTemplate> { match &self { - JsLeftHandSideExpression::TsAsExpression(item) => Some(item), + JsLeftHandSideExpression::JsTemplate(item) => Some(item), _ => None, } } - pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { + pub fn as_js_this_expression(&self) -> Option<&JsThisExpression> { match &self { - JsLeftHandSideExpression::TsNonNullAssertionExpression(item) => Some(item), + JsLeftHandSideExpression::JsThisExpression(item) => Some(item), _ => None, } } - pub fn as_ts_type_assertion_expression(&self) -> Option<&TsTypeAssertionExpression> { + pub fn as_jsx_element(&self) -> Option<&JsxElement> { + match &self { + JsLeftHandSideExpression::JsxElement(item) => Some(item), + _ => None, + } + } + pub fn as_jsx_fragment(&self) -> Option<&JsxFragment> { match &self { - JsLeftHandSideExpression::TsTypeAssertionExpression(item) => Some(item), + JsLeftHandSideExpression::JsxFragment(item) => Some(item), + _ => None, + } + } + pub fn as_jsx_self_closing_element(&self) -> Option<&JsxSelfClosingElement> { + match &self { + JsLeftHandSideExpression::JsxSelfClosingElement(item) => Some(item), + _ => None, + } + } + pub fn as_ts_instantiation_expression(&self) -> Option<&TsInstantiationExpression> { + match &self { + JsLeftHandSideExpression::TsInstantiationExpression(item) => Some(item), + _ => None, + } + } + pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { + match &self { + JsLeftHandSideExpression::TsNonNullAssertionExpression(item) => Some(item), _ => None, } } @@ -29365,29 +29449,89 @@ impl From for SyntaxElement { node.into() } } +impl From for JsLeftHandSideExpression { + fn from(node: JsArrayExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsArrayExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsCallExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsCallExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsClassExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsClassExpression(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsComputedMemberExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsComputedMemberExpression(node) } } +impl From for JsLeftHandSideExpression { + fn from(node: JsFunctionExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsFunctionExpression(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsIdentifierExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsIdentifierExpression(node) } } +impl From for JsLeftHandSideExpression { + fn from(node: JsNewExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsNewExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsObjectExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsObjectExpression(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsParenthesizedExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsParenthesizedExpression(node) } } +impl From for JsLeftHandSideExpression { + fn from(node: JsPrivateName) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsPrivateName(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsStaticMemberExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsStaticMemberExpression(node) } } -impl From for JsLeftHandSideExpression { - fn from(node: TsAsExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::TsAsExpression(node) +impl From for JsLeftHandSideExpression { + fn from(node: JsTemplate) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsTemplate(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsThisExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsThisExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsxElement) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsxElement(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsxFragment) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsxFragment(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsxSelfClosingElement) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsxSelfClosingElement(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: TsInstantiationExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::TsInstantiationExpression(node) } } impl From for JsLeftHandSideExpression { @@ -29395,115 +29539,216 @@ impl From for JsLeftHandSideExpression { JsLeftHandSideExpression::TsNonNullAssertionExpression(node) } } -impl From for JsLeftHandSideExpression { - fn from(node: TsTypeAssertionExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::TsTypeAssertionExpression(node) - } -} impl AstNode for JsLeftHandSideExpression { type Language = Language; - const KIND_SET: SyntaxKindSet = JsComputedMemberExpression::KIND_SET + const KIND_SET: SyntaxKindSet = JsAnyLiteralExpression::KIND_SET + .union(JsArrayExpression::KIND_SET) + .union(JsCallExpression::KIND_SET) + .union(JsClassExpression::KIND_SET) + .union(JsComputedMemberExpression::KIND_SET) + .union(JsFunctionExpression::KIND_SET) .union(JsIdentifierExpression::KIND_SET) + .union(JsNewExpression::KIND_SET) + .union(JsObjectExpression::KIND_SET) .union(JsParenthesizedExpression::KIND_SET) + .union(JsPrivateName::KIND_SET) .union(JsStaticMemberExpression::KIND_SET) - .union(TsAsExpression::KIND_SET) - .union(TsNonNullAssertionExpression::KIND_SET) - .union(TsTypeAssertionExpression::KIND_SET); + .union(JsTemplate::KIND_SET) + .union(JsThisExpression::KIND_SET) + .union(JsxElement::KIND_SET) + .union(JsxFragment::KIND_SET) + .union(JsxSelfClosingElement::KIND_SET) + .union(TsInstantiationExpression::KIND_SET) + .union(TsNonNullAssertionExpression::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { - matches!( - kind, - JS_COMPUTED_MEMBER_EXPRESSION - | JS_IDENTIFIER_EXPRESSION - | JS_PARENTHESIZED_EXPRESSION - | JS_STATIC_MEMBER_EXPRESSION - | TS_AS_EXPRESSION - | TS_NON_NULL_ASSERTION_EXPRESSION - | TS_TYPE_ASSERTION_EXPRESSION - ) + match kind { + JS_ARRAY_EXPRESSION + | JS_CALL_EXPRESSION + | JS_CLASS_EXPRESSION + | JS_COMPUTED_MEMBER_EXPRESSION + | JS_FUNCTION_EXPRESSION + | JS_IDENTIFIER_EXPRESSION + | JS_NEW_EXPRESSION + | JS_OBJECT_EXPRESSION + | JS_PARENTHESIZED_EXPRESSION + | JS_PRIVATE_NAME + | JS_STATIC_MEMBER_EXPRESSION + | JS_TEMPLATE + | JS_THIS_EXPRESSION + | JSX_ELEMENT + | JSX_FRAGMENT + | JSX_SELF_CLOSING_ELEMENT + | TS_INSTANTIATION_EXPRESSION + | TS_NON_NULL_ASSERTION_EXPRESSION => true, + k if JsAnyLiteralExpression::can_cast(k) => true, + _ => false, + } } fn cast(syntax: SyntaxNode) -> Option { let res = match syntax.kind() { + JS_ARRAY_EXPRESSION => { + JsLeftHandSideExpression::JsArrayExpression(JsArrayExpression { syntax }) + } + JS_CALL_EXPRESSION => { + JsLeftHandSideExpression::JsCallExpression(JsCallExpression { syntax }) + } + JS_CLASS_EXPRESSION => { + JsLeftHandSideExpression::JsClassExpression(JsClassExpression { syntax }) + } JS_COMPUTED_MEMBER_EXPRESSION => { JsLeftHandSideExpression::JsComputedMemberExpression(JsComputedMemberExpression { syntax, }) } + JS_FUNCTION_EXPRESSION => { + JsLeftHandSideExpression::JsFunctionExpression(JsFunctionExpression { syntax }) + } JS_IDENTIFIER_EXPRESSION => { JsLeftHandSideExpression::JsIdentifierExpression(JsIdentifierExpression { syntax }) } + JS_NEW_EXPRESSION => { + JsLeftHandSideExpression::JsNewExpression(JsNewExpression { syntax }) + } + JS_OBJECT_EXPRESSION => { + JsLeftHandSideExpression::JsObjectExpression(JsObjectExpression { syntax }) + } JS_PARENTHESIZED_EXPRESSION => { JsLeftHandSideExpression::JsParenthesizedExpression(JsParenthesizedExpression { syntax, }) } + JS_PRIVATE_NAME => JsLeftHandSideExpression::JsPrivateName(JsPrivateName { syntax }), JS_STATIC_MEMBER_EXPRESSION => { JsLeftHandSideExpression::JsStaticMemberExpression(JsStaticMemberExpression { syntax, }) } - TS_AS_EXPRESSION => JsLeftHandSideExpression::TsAsExpression(TsAsExpression { syntax }), + JS_TEMPLATE => JsLeftHandSideExpression::JsTemplate(JsTemplate { syntax }), + JS_THIS_EXPRESSION => { + JsLeftHandSideExpression::JsThisExpression(JsThisExpression { syntax }) + } + JSX_ELEMENT => JsLeftHandSideExpression::JsxElement(JsxElement { syntax }), + JSX_FRAGMENT => JsLeftHandSideExpression::JsxFragment(JsxFragment { syntax }), + JSX_SELF_CLOSING_ELEMENT => { + JsLeftHandSideExpression::JsxSelfClosingElement(JsxSelfClosingElement { syntax }) + } + TS_INSTANTIATION_EXPRESSION => { + JsLeftHandSideExpression::TsInstantiationExpression(TsInstantiationExpression { + syntax, + }) + } TS_NON_NULL_ASSERTION_EXPRESSION => { JsLeftHandSideExpression::TsNonNullAssertionExpression( TsNonNullAssertionExpression { syntax }, ) } - TS_TYPE_ASSERTION_EXPRESSION => { - JsLeftHandSideExpression::TsTypeAssertionExpression(TsTypeAssertionExpression { - syntax, - }) + _ => { + if let Some(js_any_literal_expression) = JsAnyLiteralExpression::cast(syntax) { + return Some(JsLeftHandSideExpression::JsAnyLiteralExpression( + js_any_literal_expression, + )); + } + return None; } - _ => return None, }; Some(res) } fn syntax(&self) -> &SyntaxNode { match self { + JsLeftHandSideExpression::JsArrayExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsCallExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsClassExpression(it) => &it.syntax, JsLeftHandSideExpression::JsComputedMemberExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsFunctionExpression(it) => &it.syntax, JsLeftHandSideExpression::JsIdentifierExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsNewExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsObjectExpression(it) => &it.syntax, JsLeftHandSideExpression::JsParenthesizedExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsPrivateName(it) => &it.syntax, JsLeftHandSideExpression::JsStaticMemberExpression(it) => &it.syntax, - JsLeftHandSideExpression::TsAsExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsTemplate(it) => &it.syntax, + JsLeftHandSideExpression::JsThisExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsxElement(it) => &it.syntax, + JsLeftHandSideExpression::JsxFragment(it) => &it.syntax, + JsLeftHandSideExpression::JsxSelfClosingElement(it) => &it.syntax, + JsLeftHandSideExpression::TsInstantiationExpression(it) => &it.syntax, JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => &it.syntax, - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.syntax(), } } fn into_syntax(self) -> SyntaxNode { match self { + JsLeftHandSideExpression::JsArrayExpression(it) => it.syntax, + JsLeftHandSideExpression::JsCallExpression(it) => it.syntax, + JsLeftHandSideExpression::JsClassExpression(it) => it.syntax, JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.syntax, + JsLeftHandSideExpression::JsFunctionExpression(it) => it.syntax, JsLeftHandSideExpression::JsIdentifierExpression(it) => it.syntax, + JsLeftHandSideExpression::JsNewExpression(it) => it.syntax, + JsLeftHandSideExpression::JsObjectExpression(it) => it.syntax, JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.syntax, + JsLeftHandSideExpression::JsPrivateName(it) => it.syntax, JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.syntax, - JsLeftHandSideExpression::TsAsExpression(it) => it.syntax, + JsLeftHandSideExpression::JsTemplate(it) => it.syntax, + JsLeftHandSideExpression::JsThisExpression(it) => it.syntax, + JsLeftHandSideExpression::JsxElement(it) => it.syntax, + JsLeftHandSideExpression::JsxFragment(it) => it.syntax, + JsLeftHandSideExpression::JsxSelfClosingElement(it) => it.syntax, + JsLeftHandSideExpression::TsInstantiationExpression(it) => it.syntax, JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.syntax, - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => it.syntax, + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.into_syntax(), } } } impl std::fmt::Debug for JsLeftHandSideExpression { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsArrayExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsCallExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsClassExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsComputedMemberExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsFunctionExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsIdentifierExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsNewExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsObjectExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsParenthesizedExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsPrivateName(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsStaticMemberExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::TsAsExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsTemplate(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsThisExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsxElement(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsxFragment(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsxSelfClosingElement(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::TsInstantiationExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => { std::fmt::Debug::fmt(it, f) } - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => std::fmt::Debug::fmt(it, f), } } } impl From for SyntaxNode { fn from(n: JsLeftHandSideExpression) -> SyntaxNode { match n { + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.into(), + JsLeftHandSideExpression::JsArrayExpression(it) => it.into(), + JsLeftHandSideExpression::JsCallExpression(it) => it.into(), + JsLeftHandSideExpression::JsClassExpression(it) => it.into(), JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.into(), + JsLeftHandSideExpression::JsFunctionExpression(it) => it.into(), JsLeftHandSideExpression::JsIdentifierExpression(it) => it.into(), + JsLeftHandSideExpression::JsNewExpression(it) => it.into(), + JsLeftHandSideExpression::JsObjectExpression(it) => it.into(), JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.into(), + JsLeftHandSideExpression::JsPrivateName(it) => it.into(), JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.into(), - JsLeftHandSideExpression::TsAsExpression(it) => it.into(), + JsLeftHandSideExpression::JsTemplate(it) => it.into(), + JsLeftHandSideExpression::JsThisExpression(it) => it.into(), + JsLeftHandSideExpression::JsxElement(it) => it.into(), + JsLeftHandSideExpression::JsxFragment(it) => it.into(), + JsLeftHandSideExpression::JsxSelfClosingElement(it) => it.into(), + JsLeftHandSideExpression::TsInstantiationExpression(it) => it.into(), JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.into(), - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => it.into(), } } } diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index 92e506e6d9a8..be8f358fb359 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -321,6 +321,28 @@ JsAnyExpression = | JsxTagExpression +// reference https://github.dev/microsoft/TypeScript/blob/77374732df82c9d5c1319677dc595868bbc648b5/src/compiler/utilitiesPublic.ts#L1554-L1590 +JsLeftHandSideExpression = + JsStaticMemberExpression + | JsComputedMemberExpression + | JsNewExpression + | JsCallExpression + | JsxElement + | JsxSelfClosingElement + | JsxFragment + | JsTemplate + | JsArrayExpression + | JsParenthesizedExpression + | JsObjectExpression + | JsClassExpression + | JsFunctionExpression + | JsIdentifierExpression + | JsAnyLiteralExpression + | TsInstantiationExpression + | JsThisExpression + | JsPrivateName + | TsNonNullAssertionExpression + JsTemplate = tag: JsAnyExpression? type_arguments: TsTypeArguments? @@ -2111,14 +2133,6 @@ TsTypeAssertionExpression = '>' expression: JsAnyExpression -JsLeftHandSideExpression = - JsParenthesizedExpression - | JsStaticMemberExpression - | JsComputedMemberExpression - | JsIdentifierExpression - | TsNonNullAssertionExpression - | TsTypeAssertionExpression - | TsAsExpression // This `SyntaxKind` is related to `ExpressionWithTypeArguments` in Typescript TsInstantiationExpression = expression: JsLeftHandSideExpression