From 600f113358f8074f69682c7199435e30149633a7 Mon Sep 17 00:00:00 2001 From: Fatih Kalifa Date: Tue, 11 Jan 2022 20:02:24 +0700 Subject: [PATCH] next-swc: fix ssg code elimination when used in render (#32709) * next-swc: fix ssg code elimination when used in render * simplify logic and add more thorough tests * comment * remove fold_export_default and fix JSX member expression --- packages/next-swc/crates/core/src/next_ssg.rs | 25 ++++++++++++ .../input.js | 38 +++++++++++++++++++ .../output.js | 15 ++++++++ 3 files changed, 78 insertions(+) create mode 100644 packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/input.js create mode 100644 packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/output.js diff --git a/packages/next-swc/crates/core/src/next_ssg.rs b/packages/next-swc/crates/core/src/next_ssg.rs index ee0752618f2c810..5d3647c8cc10718 100644 --- a/packages/next-swc/crates/core/src/next_ssg.rs +++ b/packages/next-swc/crates/core/src/next_ssg.rs @@ -141,6 +141,31 @@ impl Fold for Analyzer<'_> { e } + fn fold_jsx_element(&mut self, jsx: JSXElement) -> JSXElement { + fn get_leftmost_id_member_expr(e: &JSXMemberExpr) -> Id { + match &e.obj { + JSXObject::Ident(i) => { + i.to_id() + } + JSXObject::JSXMemberExpr(e) => { + get_leftmost_id_member_expr(e) + } + } + } + + match &jsx.opening.name { + JSXElementName::Ident(i) => { + self.add_ref(i.to_id()); + } + JSXElementName::JSXMemberExpr(e) => { + self.add_ref(get_leftmost_id_member_expr(e)); + } + _ => {} + } + + jsx.fold_children_with(self) + } + fn fold_fn_decl(&mut self, f: FnDecl) -> FnDecl { let old_in_data = self.in_data_fn; diff --git a/packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/input.js b/packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/input.js new file mode 100644 index 000000000000000..196f6585af0a465 --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/input.js @@ -0,0 +1,38 @@ +import { useState, useEffect } from 'react' +import { Root, Children, JSXMemberExpression, AttributeValue, AttributeJSX, ValueInRender, ValueInEffect, UnusedInRender } from '../' + +export default function Test() { + const [x, setX] = useState(ValueInRender.value) + useEffect(() => { + setX(ValueInEffect.value) + }, []) + + return ( + +
+ } /> + +
+
+ ) +} + +export async function getStaticProps() { + return { + props: { + // simulate import usage inside getStaticProps + used: [ + // these import references should not be removed + Root.value, + Children.value, + AttributeValue.value, + AttributeJSX.value, + ValueInRender.value, + ValueInEffect.value, + JSXMemberExpression.value, + // this import reference should be removed + UnusedInRender.value, + ], + } + } +} diff --git a/packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/output.js b/packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/output.js new file mode 100644 index 000000000000000..06e38e50c3b907c --- /dev/null +++ b/packages/next-swc/crates/core/tests/fixture/ssg/getStaticProps/should-not-remove-import-used-in-render/output.js @@ -0,0 +1,15 @@ +import { useState, useEffect } from "react"; +import { Root, Children, JSXMemberExpression, AttributeValue, AttributeJSX, ValueInRender, ValueInEffect } from "../"; +export var __N_SSG = true; +export default function Test() { + const [x, setX] = useState(ValueInRender.value); + useEffect(() => { + setX(ValueInEffect.value); + }, []) + return __jsx(Root, { + x: x + }, __jsx('div', null, __jsx(Children, { + attr: AttributeValue, + jsx: __jsx(AttributeJSX, null) + }), __jsx(JSXMemberExpression.Deep.Property, null))); +}