From 67a8d45d4e2949c032c20738303fa87a3b0d1220 Mon Sep 17 00:00:00 2001 From: Fatih Kalifa Date: Wed, 22 Dec 2021 08:27:44 +0700 Subject: [PATCH] simplify logic and add more thorough tests --- packages/next-swc/crates/core/src/next_ssg.rs | 14 ++------ .../input.js | 33 +++++++++++++++++-- .../output.js | 16 +++++++-- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/packages/next-swc/crates/core/src/next_ssg.rs b/packages/next-swc/crates/core/src/next_ssg.rs index 06fb437d1e6c1..b74fe7dd26c4b 100644 --- a/packages/next-swc/crates/core/src/next_ssg.rs +++ b/packages/next-swc/crates/core/src/next_ssg.rs @@ -95,7 +95,6 @@ struct Analyzer<'a> { state: &'a mut State, in_lhs_of_var: bool, in_data_fn: bool, - in_render_fn: bool, } impl Analyzer<'_> { @@ -103,8 +102,6 @@ impl Analyzer<'_> { tracing::trace!("add_ref({}{:?}, data = {})", id.0, id.1, self.in_data_fn); if self.in_data_fn { self.state.refs_from_data_fn.insert(id); - } else if self.in_render_fn { - self.state.refs_from_other.insert(id); } else { if self.state.cur_declaring.contains(&id) { return; @@ -153,15 +150,12 @@ impl Fold for Analyzer<'_> { } _ => {} } - let jsx = jsx.fold_children_with(self); - jsx + + jsx.fold_children_with(self) } fn fold_export_default_decl(&mut self, export: ExportDefaultDecl) -> ExportDefaultDecl { - self.in_render_fn = true; - let export = export.fold_children_with(self); - self.in_render_fn = false; - export + export.fold_children_with(self) } fn fold_fn_decl(&mut self, f: FnDecl) -> FnDecl { @@ -333,7 +327,6 @@ impl NextSsg { state: &mut self.state, in_lhs_of_var: false, in_data_fn: true, - in_render_fn: false, }; let n = n.fold_with(&mut v); @@ -398,7 +391,6 @@ impl Fold for NextSsg { state: &mut self.state, in_lhs_of_var: false, in_data_fn: false, - in_render_fn: false, }; m = m.fold_with(&mut v); } 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 index 85114d6678470..2227ae3f799b6 100644 --- 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 @@ -1,9 +1,36 @@ -import Component from '../' +import { useState, useEffect } from 'react' +import { Root, Children, AttributeValue, AttributeJSX, ValueInRender, ValueInEffect, UnusedInRender } from '../' export default function Test() { - return + const [x, setX] = useState(ValueInRender.value) + useEffect(() => { + setX(ValueInEffect.value) + }, []) + + return ( + +
+ } /> +
+
+ ) } export async function getStaticProps() { - return { props: { name: Component.displayName } } + return { + props: { + // simulate Component usage inside getStaticProps + used: [ + // these import references should not be removed + Root.value, + Children.value, + AttributeValue.value, + AttributeJSX.value, + ValueInRender.value, + ValueInEffect.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 index 68f6a8c6379b6..87f2b7651d085 100644 --- 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 @@ -1,5 +1,15 @@ -import Component from '../' -export var __N_SSG = true +import { useState, useEffect } from "react"; +import { Root, Children, AttributeValue, AttributeJSX, ValueInRender, ValueInEffect } from "../"; +export var __N_SSG = true; export default function Test() { - return __jsx(Component, null) + 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) + }))); }