From fe8c39590c01621432e7a642c2e5988dfb93986f Mon Sep 17 00:00:00 2001 From: Varixo Date: Fri, 17 Jan 2025 20:40:12 +0100 Subject: [PATCH] fix: component props as var props --- .changeset/fuzzy-jobs-compare.md | 5 + .../qwik/src/core/tests/use-store.spec.tsx | 8 +- .../qwik/src/optimizer/core/src/inlined_fn.rs | 47 ++++- ...e__test__destructure_args_colon_props.snap | 4 +- ...__test__destructure_args_colon_props3.snap | 2 +- ...estructure_args_inline_cmp_block_stmt.snap | 4 +- ...structure_args_inline_cmp_block_stmt2.snap | 4 +- ...destructure_args_inline_cmp_expr_stmt.snap | 6 +- ...nent_with_event_listeners_inside_loop.snap | 16 +- ...est__example_derived_signals_children.snap | 6 +- ...re__test__example_derived_signals_div.snap | 2 +- ...core__test__example_getter_generation.snap | 12 +- .../qwik_core__test__example_issue_33443.snap | 4 +- ..._core__test__example_mutable_children.snap | 2 +- ...ik_core__test__example_props_wrapping.snap | 21 ++- ...k_core__test__example_props_wrapping2.snap | 21 ++- ...k_core__test__should_destructure_args.snap | 4 +- ...mark_props_as_var_props_for_inner_cmp.snap | 167 ++++++++++++++++++ ...st__should_wrap_object_with_fn_signal.snap | 69 ++++++++ packages/qwik/src/optimizer/core/src/test.rs | 69 ++++++++ .../qwik/src/optimizer/core/src/transform.rs | 58 ++---- 21 files changed, 427 insertions(+), 104 deletions(-) create mode 100644 .changeset/fuzzy-jobs-compare.md create mode 100644 packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap create mode 100644 packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_wrap_object_with_fn_signal.snap diff --git a/.changeset/fuzzy-jobs-compare.md b/.changeset/fuzzy-jobs-compare.md new file mode 100644 index 00000000000..5b55fe46fe0 --- /dev/null +++ b/.changeset/fuzzy-jobs-compare.md @@ -0,0 +1,5 @@ +--- +'@qwik.dev/core': patch +--- + +fix: component props as var props diff --git a/packages/qwik/src/core/tests/use-store.spec.tsx b/packages/qwik/src/core/tests/use-store.spec.tsx index c452ac81d1d..67b3e347ee8 100644 --- a/packages/qwik/src/core/tests/use-store.spec.tsx +++ b/packages/qwik/src/core/tests/use-store.spec.tsx @@ -395,8 +395,8 @@ describe.each([ expect(vNode).toMatchVDOM( - - + + @@ -407,8 +407,8 @@ describe.each([ expect(vNode).toMatchVDOM( - - + + diff --git a/packages/qwik/src/optimizer/core/src/inlined_fn.rs b/packages/qwik/src/optimizer/core/src/inlined_fn.rs index f35ce98aa48..8a10fb56e78 100644 --- a/packages/qwik/src/optimizer/core/src/inlined_fn.rs +++ b/packages/qwik/src/optimizer/core/src/inlined_fn.rs @@ -8,6 +8,7 @@ use swc_ecmascript::ast; use swc_ecmascript::codegen::text_writer::JsWriter; use swc_ecmascript::transforms::fixer; use swc_ecmascript::transforms::hygiene::hygiene_with_config; +use swc_ecmascript::visit::{Visit, VisitWith}; use swc_ecmascript::{ utils::private_ident, visit::{VisitMut, VisitMutWith}, @@ -26,6 +27,7 @@ pub fn convert_inlined_fn( qqsegment: &Id, accept_call_expr: bool, serialize_fn: bool, + is_const: bool, ) -> (Option, bool) { let mut identifiers = HashMap::new(); let params: Vec = scoped_idents @@ -42,7 +44,13 @@ pub fn convert_inlined_fn( .collect(); if matches!(expr, ast::Expr::Arrow(_)) { - return (None, false); + return (None, is_const); + } + + println!("{:?}", is_used_as_object(&expr, &scoped_idents)); + + if !is_used_as_object(&expr, &scoped_idents) { + return (None, is_const); } // Replace identifier @@ -50,12 +58,12 @@ pub fn convert_inlined_fn( expr.visit_mut_with(&mut replace_identifiers); if replace_identifiers.abort { - return (None, false); + return (None, is_const); } let rendered_expr = render_expr(&expr); if rendered_expr.len() > 150 { - return (None, false); + return (None, is_const); } if scoped_idents.is_empty() { @@ -98,7 +106,7 @@ pub fn convert_inlined_fn( args, ..Default::default() })), - true, + is_const, ) } @@ -199,3 +207,34 @@ pub fn render_expr(expr: &ast::Expr) -> String { .trim_end_matches(';') .to_string() } + +struct ObjectUsageChecker<'a> { + identifiers: &'a Vec, + used_as_object: bool, +} + +impl<'a> Visit for ObjectUsageChecker<'a> { + fn visit_member_expr(&mut self, node: &ast::MemberExpr) { + if let ast::Expr::Ident(obj_ident) = &*node.obj { + for id in self.identifiers { + if obj_ident.sym == id.0 { + println!("Used as object: {:?}", obj_ident.sym); + self.used_as_object = true; + return; + } + } + } + node.visit_children_with(self); + } +} + +fn is_used_as_object(expr: &ast::Expr, identifiers: &Vec) -> bool { + let mut checker = ObjectUsageChecker { + identifiers, + used_as_object: false, + }; + + expr.visit_with(&mut checker); + + checker.used_as_object +} diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props.snap index 652a56709b5..2400e4a61d6 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props.snap @@ -1,6 +1,6 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 3651 +assertion_line: 3715 expression: output snapshot_kind: text --- @@ -31,7 +31,7 @@ import { Fragment as _Fragment } from "@qwik.dev/core/jsx-runtime"; import { _jsxSorted } from "@qwik.dev/core"; import { _wrapProp } from "@qwik.dev/core"; export const test_component_LUXeXe0DQrg = (props)=>{ - return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, _wrapProp(props, "bind:value"), 3, "u6_0"); + return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, _wrapProp(props, "bind:value"), 1, "u6_0"); }; diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props3.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props3.snap index 2b6b217fc61..f705447181b 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props3.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_colon_props3.snap @@ -40,7 +40,7 @@ export const test_component_LUXeXe0DQrg = (props)=>{ useSignal(rest['bind:value']); return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, _fnSignal((p0)=>p0.test.value, [ props - ], "p0.test.value"), 3, "u6_0"); + ], "p0.test.value"), 1, "u6_0"); }; diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap index 4278bce1016..8da91a3501e 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt.snap @@ -24,14 +24,14 @@ import { _fnSignal } from "@qwik.dev/core"; import { qrl } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; export default ((props)=>{ - return /*#__PURE__*/ _jsxSorted("div", null, { + return /*#__PURE__*/ _jsxSorted("div", { "data-is-active": _fnSignal((p0)=>p0.data.selectedOutputDetail === 'options', [ props ], 'p0.data.selectedOutputDetail==="options"'), onClick$: /*#__PURE__*/ qrl(()=>import("./test.tsx_test_div_onClick_GbMO6TGQv9M"), "test_div_onClick_GbMO6TGQv9M", [ props ]) - }, null, 3, "u6_0"); + }, null, null, 2, "u6_0"); }); diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt2.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt2.snap index 41a2b9694c0..9d1fe5cf7e5 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt2.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_block_stmt2.snap @@ -25,14 +25,14 @@ import { _fnSignal } from "@qwik.dev/core"; import { qrl } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; export default ((props)=>{ - return /*#__PURE__*/ _jsxSorted("div", null, { + return /*#__PURE__*/ _jsxSorted("div", { "data-is-active": _fnSignal((p0)=>p0.data.selectedOutputDetail === 'options', [ props ], 'p0.data.selectedOutputDetail==="options"'), onClick$: /*#__PURE__*/ qrl(()=>import("./test.tsx_test_div_onClick_GbMO6TGQv9M"), "test_div_onClick_GbMO6TGQv9M", [ props ]) - }, null, 3, "u6_0"); + }, null, null, 2, "u6_0"); }); diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap index df03a8292df..f3ecdeba50f 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__destructure_args_inline_cmp_expr_stmt.snap @@ -20,17 +20,17 @@ snapshot_kind: text import { _fnSignal } from "@qwik.dev/core"; import { qrl } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; -export default ((props)=>/*#__PURE__*/ _jsxSorted("div", null, { +export default ((props)=>/*#__PURE__*/ _jsxSorted("div", { "data-is-active": _fnSignal((p0)=>p0.data.selectedOutputDetail === 'options', [ props ], 'p0.data.selectedOutputDetail==="options"'), onClick$: /*#__PURE__*/ qrl(()=>import("./test.tsx_test_div_onClick_GbMO6TGQv9M"), "test_div_onClick_GbMO6TGQv9M", [ props ]) - }, null, 3, "u6_0")); + }, null, null, 2, "u6_0")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AACE,eAAe,CAAA,uBACL,WAAC;QACC,gBAAc,kBAAE,GAFV,KAEe,oBAAoB,KAAK;;;QAC9C,QAAQ;;;uBAGT,EAAE\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AACE,eAAe,CAAA,uBACL,WAAC;QACC,gBAAc,kBAAE,GAFV,KAEe,oBAAoB,KAAK;;;QAC9C,QAAQ;;;6BAGT,EAAE\"}") ============================= test.tsx_test_div_onClick_GbMO6TGQv9M.js (ENTRY POINT)== import { useLexicalScope } from "@qwik.dev/core"; diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_component_with_event_listeners_inside_loop.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_component_with_event_listeners_inside_loop.snap index 49522de24cf..6aafd459463 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_component_with_event_listeners_inside_loop.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_component_with_event_listeners_inside_loop.snap @@ -1,6 +1,6 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 3850 +assertion_line: 3979 expression: output snapshot_kind: text --- @@ -291,7 +291,10 @@ export const App_component_ckEPmXZlub0 = ()=>{ i, results ]) - }, null, results[i], 0, "u6_1")); + }, null, _fnSignal((p0, p1)=>p1[p0], [ + i, + results + ], "p1[p0]"), 0, "u6_1")); return items; } function loopForOf(results) { @@ -315,7 +318,7 @@ export const App_component_ckEPmXZlub0 = ()=>{ }, null, _fnSignal((p0, p1)=>p1[p0], [ key, results - ], "p1[p0]"), 2, "u6_3")); + ], "p1[p0]"), 0, "u6_3")); return items; } function loopWhile(results) { @@ -328,7 +331,10 @@ export const App_component_ckEPmXZlub0 = ()=>{ i, results ]) - }, null, results[i], 0, "u6_4")); + }, null, _fnSignal((p0, p1)=>p1[p0], [ + i, + results + ], "p1[p0]"), 0, "u6_4")); i++; } return items; @@ -351,7 +357,7 @@ export const App_component_ckEPmXZlub0 = ()=>{ }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;yCAE8B;IACxB,MAAM,OAAO,SAAmB,EAAE;IAClC,MAAM,UAAU,UAAU;QAAC;KAAM;IACjC,SAAS,YAAY,OAAiB;QACpC,OAAO,QAAQ,GAAG,CAAC,CAAC,qBAClB,WAAC;gBACC,QAAQ;;;;qBAIP;IAGP;IACA,SAAS,SAAS,OAAiB;QACjC,MAAM,QAAQ,EAAE;QAChB,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,MAAM,EAAE,IAClC,MAAM,IAAI,eACR,WAAC;YACC,QAAQ;;;;;iBAIP,OAAO,CAAC,EAAE;QAIjB,OAAO;IACT;IACA,SAAS,UAAU,OAAiB;QAClC,MAAM,QAAQ,EAAE;QAChB,KAAK,MAAM,QAAQ,QACjB,MAAM,IAAI,eACR,WAAC;YACC,QAAQ;;;;iBAIP;QAIP,OAAO;IACT;IACA,SAAS,UAAU,OAAiB;QAClC,MAAM,QAAQ,EAAE;QAChB,IAAK,MAAM,OAAO,QAChB,MAAM,IAAI,eACR,WAAC;YACC,QAAQ;;;;;qCAIP,EAAO,IAAK;;;;QAInB,OAAO;IACT;IACA,SAAS,UAAU,OAAiB;QAClC,MAAM,QAAQ,EAAE;QAChB,IAAI,IAAI;QACR,MAAO,IAAI,QAAQ,MAAM,CAAE;YACzB,MAAM,IAAI,eACR,WAAC;gBACC,QAAQ;;;;;qBAIP,OAAO,CAAC,EAAE;YAGf;QACF;QACA,OAAO;IACT;IACA,qBACE,WAAC;QACE,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,qBAClB,WAAC;gBAEC,QAAQ;;;;;gBADR,IAAG;eAKF;QAGJ,YAAY,QAAQ,KAAK;QACzB,SAAS,QAAQ,KAAK;QACtB,UAAU,QAAQ,KAAK;QACvB,UAAU,QAAQ,KAAK;QACvB,UAAU,QAAQ,KAAK;;AAG9B\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;yCAE8B;IACxB,MAAM,OAAO,SAAmB,EAAE;IAClC,MAAM,UAAU,UAAU;QAAC;KAAM;IACjC,SAAS,YAAY,OAAiB;QACpC,OAAO,QAAQ,GAAG,CAAC,CAAC,qBAClB,WAAC;gBACC,QAAQ;;;;qBAIP;IAGP;IACA,SAAS,SAAS,OAAiB;QACjC,MAAM,QAAQ,EAAE;QAChB,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,MAAM,EAAE,IAClC,MAAM,IAAI,eACR,WAAC;YACC,QAAQ;;;;;qCAIP,EAAO,IAAG;;;;QAIjB,OAAO;IACT;IACA,SAAS,UAAU,OAAiB;QAClC,MAAM,QAAQ,EAAE;QAChB,KAAK,MAAM,QAAQ,QACjB,MAAM,IAAI,eACR,WAAC;YACC,QAAQ;;;;iBAIP;QAIP,OAAO;IACT;IACA,SAAS,UAAU,OAAiB;QAClC,MAAM,QAAQ,EAAE;QAChB,IAAK,MAAM,OAAO,QAChB,MAAM,IAAI,eACR,WAAC;YACC,QAAQ;;;;;qCAIP,EAAO,IAAK;;;;QAInB,OAAO;IACT;IACA,SAAS,UAAU,OAAiB;QAClC,MAAM,QAAQ,EAAE;QAChB,IAAI,IAAI;QACR,MAAO,IAAI,QAAQ,MAAM,CAAE;YACzB,MAAM,IAAI,eACR,WAAC;gBACC,QAAQ;;;;;yCAIP,EAAO,IAAG;;;;YAGf;QACF;QACA,OAAO;IACT;IACA,qBACE,WAAC;QACE,QAAQ,KAAK,CAAC,GAAG,CAAC,CAAC,qBAClB,WAAC;gBAEC,QAAQ;;;;;gBADR,IAAG;eAKF;QAGJ,YAAY,QAAQ,KAAK;QACzB,SAAS,QAAQ,KAAK;QACtB,UAAU,QAAQ,KAAK;QACvB,UAAU,QAAQ,KAAK;QACvB,UAAU,QAAQ,KAAK;;AAG9B\"}") /* { "origin": "test.tsx", diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_children.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_children.snap index 73f77988757..85966b72ac0 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_children.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_children.snap @@ -65,12 +65,12 @@ const TextContent_component_puSwpKXO7Kg = (props)=>{ /*#__PURE__*/ _jsxSorted("div", null, null, [ "data-nu: ", _wrapProp(props, "data-nu") - ], 3, null), + ], 1, null), /*#__PURE__*/ _jsxSorted("div", null, null, [ "class: ", _wrapProp(props, "class") - ], 3, null) - ], 3, "u6_0"); + ], 1, null) + ], 1, "u6_0"); }; export const TextContent = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(TextContent_component_puSwpKXO7Kg, "TextContent_component_puSwpKXO7Kg")); const App_component_ckEPmXZlub0 = ()=>{ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_div.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_div.snap index 4d2aa1f061b..71a1743d04d 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_div.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_div.snap @@ -62,8 +62,8 @@ export const App = component$((props) => { ============================= test.js == import { componentQrl } from "@qwik.dev/core"; -import { _wrapProp } from "@qwik.dev/core"; import { _fnSignal } from "@qwik.dev/core"; +import { _wrapProp } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; import { inlinedQrl } from "@qwik.dev/core"; import { useStore, mutable } from '@qwik.dev/core'; diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_getter_generation.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_getter_generation.snap index ccf01084e01..82753b07070 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_getter_generation.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_getter_generation.snap @@ -57,21 +57,21 @@ import { _jsxSorted } from "@qwik.dev/core"; import { _wrapProp } from "@qwik.dev/core"; export const Cmp_component_4ryKJTOKjWE = (props)=>{ return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, [ - /*#__PURE__*/ _jsxSorted("p", null, { + /*#__PURE__*/ _jsxSorted("p", { "data-value": _wrapProp(props, "count") - }, _fnSignal((p0)=>p0.nested.count, [ + }, null, _fnSignal((p0)=>p0.nested.count, [ props - ], "p0.nested.count"), 3, null), + ], "p0.nested.count"), 1, null), /*#__PURE__*/ _jsxSorted("p", null, null, [ "Value ", _wrapProp(props, "count"), /*#__PURE__*/ _jsxSorted("span", null, null, null, 3, null) - ], 3, null) - ], 3, "u6_1"); + ], 1, null) + ], 1, "u6_1"); }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;yCAyB8B,CAAC;IAC9B,qBACC;sBACC,WAAC;YAAE,YAAU,YAAE;2BAAc,GAAM,MAAM,CAAC,KAAK;;;sBAC/C,WAAC;YAAE;sBAAO;0BAAY,WAAC;;;AAG1B\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;yCAyB8B,CAAC;IAC9B,qBACC;sBACC,WAAC;YAAE,YAAU,YAAE;iCAAc,GAAM,MAAM,CAAC,KAAK;;;sBAC/C,WAAC;YAAE;sBAAO;0BAAY,WAAC;;;AAG1B\"}") /* { "origin": "test.tsx", diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap index 7e417befe7f..86e436f979f 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_issue_33443.snap @@ -37,12 +37,12 @@ const Issue3742_component_div_button_onClick_a504K2BCEXg = ()=>{ }; const Issue3742_component_svSy0PlWTAw = (props)=>{ const counter = useSignal(0); - return /*#__PURE__*/ _jsxSorted("div", null, { + return /*#__PURE__*/ _jsxSorted("div", { title: _fnSignal((p0, p1)=>(p1.description ?? '') && 'description' in p1.other ? `Hello ${p0.value}` : `Bye ${p0.value}`, [ counter, props ], '(p1.description??"")&&"description"in p1.other?`Hello ${p0.value}`:`Bye ${p0.value}`') - }, [ + }, null, [ "Issue3742", /*#__PURE__*/ _jsxSorted("button", null, { onClick$: /*#__PURE__*/ inlinedQrl(Issue3742_component_div_button_onClick_a504K2BCEXg, "Issue3742_component_div_button_onClick_a504K2BCEXg", [ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_mutable_children.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_mutable_children.snap index cf82c678eb8..954a7c5a5a6 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_mutable_children.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_mutable_children.snap @@ -169,7 +169,7 @@ const AppStatic_component_gYRXqF3G5nE = (props)=>{ /*#__PURE__*/ _jsxSorted("div", null, null, [ "Static ", _wrapProp(props) - ], 3, null), + ], 1, null), /*#__PURE__*/ _jsxSorted("div", null, null, [ "Static ", stuff() diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap index a90f2959160..caae21c356d 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping.snap @@ -33,30 +33,29 @@ import { useSignal } from '@qwik.dev/core'; export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ let fromLocal = useSignal(0); return /*#__PURE__*/ _jsxSorted("div", { - local: fromLocal - }, { computed: _fnSignal((p0, p1)=>p0 + p1.fromProps, [ fromLocal, props ], "p0+p1.fromProps"), - "props-wrap": _wrapProp(props, "fromProps"), - "props-only": _fnSignal((p0)=>({ - props: p0.fromProps - }), [ - props - ], "{props:p0.fromProps}"), + local: fromLocal, props: _fnSignal((p0, p1)=>({ props: p1.fromProps, local: p0 }), [ fromLocal, props - ], "{props:p1.fromProps,local:p0}") - }, null, 3, "u6_0"); + ], "{props:p1.fromProps,local:p0}"), + "props-only": _fnSignal((p0)=>({ + props: p0.fromProps + }), [ + props + ], "{props:p0.fromProps}"), + "props-wrap": _wrapProp(props, "fromProps") + }, null, null, 3, "u6_0"); }, "Works_component_t45qL4vNGv0")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAwB,SAAS,QAAQ,iBAAiB;AAC1D,OAAO,MAAM,sBAAQ,sCAAW;IAC/B,IAAI,YAAY,UAAU;IAC1B,qBACC,WAAC;QAEA,OAAO;;QADP,QAAQ,sBAAE,QAJqB;;;;QAM/B,YAAU;QACV,YAAU,kBAAE,CAAA;gBAAC,KAAK,KAPa;YAOF,CAAA;;;QAC7B,KAAK,sBAAE,CAAA;gBAAC,KAAK,KARkB;gBAQL,KAAK;YAAW,CAAA;;;;;AAI7C,mCAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAwB,SAAS,QAAQ,iBAAiB;AAC1D,OAAO,MAAM,sBAAQ,sCAAW;IAC/B,IAAI,YAAY,UAAU;IAC1B,qBACC,WAAC;QACA,QAAQ,sBAAE,QAJqB;;;;QAK/B,OAAO;QAGP,KAAK,sBAAE,CAAA;gBAAC,KAAK,KARkB;gBAQL,KAAK;YAAW,CAAA;;;;QAD1C,YAAU,kBAAE,CAAA;gBAAC,KAAK,KAPa;YAOF,CAAA;;;QAD7B,YAAU;;AAMb,mCAAG\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping2.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping2.snap index 8fa6dce4928..0249f50c3dc 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping2.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_props_wrapping2.snap @@ -33,30 +33,29 @@ import { useSignal } from '@qwik.dev/core'; export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ let fromLocal = useSignal(0); return /*#__PURE__*/ _jsxSorted("div", { - local: fromLocal - }, { computed: _fnSignal((p0, p1)=>p0 + p1.fromProps, [ fromLocal, props ], "p0+p1.fromProps"), - "props-wrap": _wrapProp(props, "fromProps"), - "props-only": _fnSignal((p0)=>({ - props: p0.fromProps - }), [ - props - ], "{props:p0.fromProps}"), + local: fromLocal, props: _fnSignal((p0, p1)=>({ props: p1.fromProps, local: p0 }), [ fromLocal, props - ], "{props:p1.fromProps,local:p0}") - }, null, 3, "u6_0"); + ], "{props:p1.fromProps,local:p0}"), + "props-only": _fnSignal((p0)=>({ + props: p0.fromProps + }), [ + props + ], "{props:p0.fromProps}"), + "props-wrap": _wrapProp(props, "fromProps") + }, null, null, 3, "u6_0"); }, "Works_component_t45qL4vNGv0")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAwB,SAAS,QAAQ,iBAAiB;AAC1D,OAAO,MAAM,sBAAQ,sCAAW,CAAC;IAChC,IAAI,YAAY,UAAU;IAC1B,qBACC,WAAC;QAEA,OAAO;;QADP,QAAQ,sBAAE,KAAY,GAAM,SAAS;;;;QAErC,YAAU,YAAE;QACZ,YAAU,kBAAE,CAAA;gBAAC,OAAO,GAAM,SAAS;YAAA,CAAA;;;QACnC,KAAK,sBAAE,CAAA;gBAAC,OAAO,GAAM,SAAS;gBAAE,KAAK;YAAW,CAAA;;;;;AAInD,mCAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAwB,SAAS,QAAQ,iBAAiB;AAC1D,OAAO,MAAM,sBAAQ,sCAAW,CAAC;IAChC,IAAI,YAAY,UAAU;IAC1B,qBACC,WAAC;QACA,QAAQ,sBAAE,KAAY,GAAM,SAAS;;;;QACrC,OAAO;QAGP,KAAK,sBAAE,CAAA;gBAAC,OAAO,GAAM,SAAS;gBAAE,KAAK;YAAW,CAAA;;;;QADhD,YAAU,kBAAE,CAAA;gBAAC,OAAO,GAAM,SAAS;YAAA,CAAA;;;QADnC,YAAU,YAAE;;AAMf,mCAAG\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap index 296204beead..20134a5f902 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_destructure_args.snap @@ -55,9 +55,9 @@ export const test_component_LUXeXe0DQrg = (props)=>{ }); renders.renders++; const rerenders = renders.renders + 0; - return /*#__PURE__*/ _jsxSorted("div", null, { + return /*#__PURE__*/ _jsxSorted("div", { id: _wrapProp(props, "id") - }, [ + }, null, [ /*#__PURE__*/ _jsxSplit("span", { ...rest }, null, [ diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap new file mode 100644 index 00000000000..bf7e7578273 --- /dev/null +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_mark_props_as_var_props_for_inner_cmp.snap @@ -0,0 +1,167 @@ +--- +source: packages/qwik/src/optimizer/core/src/test.rs +assertion_line: 4198 +expression: output +snapshot_kind: text +--- +==INPUT== + + +import { component$, useResource$, Resource } from "@qwik.dev/core"; +import { type ModelProps } from "./modelMenu"; +import { serverImg } from "~/routes/(authenticated)/layout"; + +export const Image = component$((props) => { + return ( + <> + + + ); +}); + +export const ModelImg = component$((props) => { + const imgLoc = useResource$(async ({ track }) => { + track(() => props.store.model); + return await serverImg('some.png'); + }); + return ( + <> +

error ...

} + onResolved={(res) => + res && ( + <> + + + ) + } + /> + + ); +}); + +============================= test.js == + +import { componentQrl } from "@qwik.dev/core"; +import { qrl } from "@qwik.dev/core"; +export const Image = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_Image_component_CS20HgBlRYI"), "Image_component_CS20HgBlRYI")); +export const ModelImg = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_ModelImg_component_iJe6ICWVnyA"), "ModelImg_component_iJe6ICWVnyA")); + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;AAKA,OAAO,MAAM,sBAAQ,qHAMlB;AAEH,OAAO,MAAM,yBAAW,2HAsBrB\"}") +============================= test.tsx_ModelImg_component_iJe6ICWVnyA.js (ENTRY POINT)== + +import { Image } from "./test"; +import { Resource } from "@qwik.dev/core"; +import { Fragment as _Fragment } from "@qwik.dev/core/jsx-runtime"; +import { _jsxSorted } from "@qwik.dev/core"; +import { qrl } from "@qwik.dev/core"; +import { useResourceQrl } from "@qwik.dev/core"; +export const ModelImg_component_iJe6ICWVnyA = (props)=>{ + const imgLoc = useResourceQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI"), "ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI", [ + props + ])); + return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, /*#__PURE__*/ _jsxSorted(Resource, null, { + value: imgLoc, + onRejected: ()=>/*#__PURE__*/ _jsxSorted("p", null, null, "error ...", 3, "u6_1"), + onResolved: (res)=>res && /*#__PURE__*/ _jsxSorted(_Fragment, null, null, /*#__PURE__*/ _jsxSorted(Image, { + src: res + }, null, null, 3, "u6_2"), 1, "u6_3") + }, null, 3, "u6_4"), 1, "u6_5"); +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;;8CAa+C,CAAC;IAC9C,MAAM,SAAS;;;IAIf,qBACE,gDACE,WAAC;QACC,OAAO;QACP,YAAY,kBAAM,WAAC,iBAAE;QACrB,YAAY,CAAC,MACX,qBACE,gDACE,WAAC;gBACC,KAAK;;;AAQrB\"}") +/* +{ + "origin": "test.tsx", + "name": "ModelImg_component_iJe6ICWVnyA", + "entry": null, + "displayName": "test.tsx_ModelImg_component", + "hash": "iJe6ICWVnyA", + "canonicalFilename": "test.tsx_ModelImg_component_iJe6ICWVnyA", + "path": "", + "extension": "js", + "parent": null, + "ctxKind": "function", + "ctxName": "component$", + "captures": false, + "loc": [ + 343, + 780 + ] +} +*/ +============================= test.tsx_ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI.js (ENTRY POINT)== + +import { useLexicalScope } from "@qwik.dev/core"; +import { serverImg } from "~/routes/(authenticated)/layout"; +export const ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI = async (props)=>{ + const [props1] = useLexicalScope(); + props.track(()=>props1.store.model); + return await serverImg('some.png'); +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;iEAc8B;;IAC1B,MADmC,MAC7B,IAAM,OAAM,KAAK,CAAC,KAAK;IAC7B,OAAO,MAAM,UAAU\"}") +/* +{ + "origin": "test.tsx", + "name": "ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI", + "entry": null, + "displayName": "test.tsx_ModelImg_component_imgLoc_useResource", + "hash": "Ogi9hEJvtmI", + "canonicalFilename": "test.tsx_ModelImg_component_imgLoc_useResource_Ogi9hEJvtmI", + "path": "", + "extension": "js", + "parent": "ModelImg_component_iJe6ICWVnyA", + "ctxKind": "function", + "ctxName": "useResource$", + "captures": true, + "loc": [ + 386, + 488 + ] +} +*/ +============================= test.tsx_Image_component_CS20HgBlRYI.js (ENTRY POINT)== + +import { Fragment as _Fragment } from "@qwik.dev/core/jsx-runtime"; +import { _fnSignal } from "@qwik.dev/core"; +import { _jsxSorted } from "@qwik.dev/core"; +export const Image_component_CS20HgBlRYI = (props)=>{ + return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, /*#__PURE__*/ _jsxSorted("img", { + src: _fnSignal((p0)=>`${p0.src}`, [ + props + ], "`${p0.src}`") + }, null, null, 3, null), 1, "u6_0"); +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;2CAKgC,CAAC;IAC/B,qBACE,gDACE,WAAC;QAAI,GAAG,kBAAE,GAAG,GAAM,GAAG,EAAE;;;;AAG9B\"}") +/* +{ + "origin": "test.tsx", + "name": "Image_component_CS20HgBlRYI", + "entry": null, + "displayName": "test.tsx_Image_component", + "hash": "CS20HgBlRYI", + "canonicalFilename": "test.tsx_Image_component_CS20HgBlRYI", + "path": "", + "extension": "js", + "parent": null, + "ctxKind": "function", + "ctxName": "component$", + "captures": false, + "loc": [ + 212, + 292 + ] +} +*/ +== DIAGNOSTICS == + +[] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_wrap_object_with_fn_signal.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_wrap_object_with_fn_signal.snap new file mode 100644 index 00000000000..16db7597e9d --- /dev/null +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__should_wrap_object_with_fn_signal.snap @@ -0,0 +1,69 @@ +--- +source: packages/qwik/src/optimizer/core/src/test.rs +assertion_line: 4176 +expression: output +snapshot_kind: text +--- +==INPUT== + + +import { component$ } from '@qwik.dev/core'; +export default component$((props) => { + // not destructure it so it is a var prop + const item = props.something.count; + return ( + <> +
+ + ); +}); + +============================= test.js == + +import { componentQrl } from "@qwik.dev/core"; +import { qrl } from "@qwik.dev/core"; +export default /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(()=>import("./test.tsx_test_component_LUXeXe0DQrg"), "test_component_LUXeXe0DQrg")); + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;AAEA,6BAAe,mHAQZ\"}") +============================= test.tsx_test_component_LUXeXe0DQrg.js (ENTRY POINT)== + +import { Fragment as _Fragment } from "@qwik.dev/core/jsx-runtime"; +import { _fnSignal } from "@qwik.dev/core"; +import { _jsxSorted } from "@qwik.dev/core"; +export const test_component_LUXeXe0DQrg = (props)=>{ + // not destructure it so it is a var prop + const item = props.something.count; + return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, /*#__PURE__*/ _jsxSorted("div", { + "data-no-wrap": item ? item * 2 : null, + "data-wrap": _fnSignal((p0)=>p0.myobj.id + "test", [ + props + ], 'p0.myobj.id+"test"') + }, null, null, 3, null), 1, "u6_0"); +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;0CAE0B,CAAC;IAC1B,yCAAyC;IACzC,MAAM,OAAO,MAAM,SAAS,CAAC,KAAK;IAClC,qBACC,gDACC,WAAC;QAAI,gBAAc,OAAO,OAAO,IAAI;QAAM,WAAS,kBAAE,GAAM,KAAK,CAAC,EAAE,GAAG;;;;AAG1E\"}") +/* +{ + "origin": "test.tsx", + "name": "test_component_LUXeXe0DQrg", + "entry": null, + "displayName": "test.tsx_test_component", + "hash": "LUXeXe0DQrg", + "canonicalFilename": "test.tsx_test_component_LUXeXe0DQrg", + "path": "", + "extension": "js", + "parent": null, + "ctxKind": "function", + "ctxName": "component$", + "captures": false, + "loc": [ + 73, + 281 + ] +} +*/ +== DIAGNOSTICS == + +[] diff --git a/packages/qwik/src/optimizer/core/src/test.rs b/packages/qwik/src/optimizer/core/src/test.rs index 4d3bd9b0e68..0a832b29923 100644 --- a/packages/qwik/src/optimizer/core/src/test.rs +++ b/packages/qwik/src/optimizer/core/src/test.rs @@ -4171,6 +4171,75 @@ fn should_wrap_prop_from_destructured_array() { }); } +#[test] +fn should_wrap_object_with_fn_signal() { + test_input!(TestInput { + code: r#" +import { component$ } from '@qwik.dev/core'; +export default component$((props) => { + // not destructure it so it is a var prop + const item = props.something.count; + return ( + <> +
+ + ); +}); +"# + .to_string(), + transpile_ts: true, + transpile_jsx: true, + ..TestInput::default() + }); +} + +#[test] +fn should_mark_props_as_var_props_for_inner_cmp() { + test_input!(TestInput { + code: r#" +import { component$, useResource$, Resource } from "@qwik.dev/core"; +import { type ModelProps } from "./modelMenu"; +import { serverImg } from "~/routes/(authenticated)/layout"; + +export const Image = component$((props) => { + return ( + <> + + + ); +}); + +export const ModelImg = component$((props) => { + const imgLoc = useResource$(async ({ track }) => { + track(() => props.store.model); + return await serverImg('some.png'); + }); + return ( + <> +

error ...

} + onResolved={(res) => + res && ( + <> + + + ) + } + /> + + ); +}); +"# + .to_string(), + transpile_ts: true, + transpile_jsx: true, + ..TestInput::default() + }); +} + // TODO(misko): Make this test work by implementing strict serialization. // #[test] // fn example_of_synchronous_qrl_that_cant_be_serialized() { diff --git a/packages/qwik/src/optimizer/core/src/transform.rs b/packages/qwik/src/optimizer/core/src/transform.rs index 40efaca3fbb..6b95c453ab7 100644 --- a/packages/qwik/src/optimizer/core/src/transform.rs +++ b/packages/qwik/src/optimizer/core/src/transform.rs @@ -574,8 +574,7 @@ impl<'a> QwikTransform<'a> { } scoped_idents.sort(); - let (scoped_idents, is_const, has_const) = - compute_scoped_idents(&descendent_idents, &decl_collect); + let (scoped_idents, is_const) = compute_scoped_idents(&descendent_idents, &decl_collect); // simple variable expression, no need to inline if let ast::Expr::Ident(_) = folded { @@ -593,12 +592,6 @@ impl<'a> QwikTransform<'a> { } } - if !has_const { - // if the inputs to the expression don't have at least one constant (meaning something that could be a signal), - // turning it into `_fnSignal` is useless - return (None, is_const); - } - let serialize_fn = self.options.is_server; let inlined_fn = self.ensure_core_import(&_INLINED_FN); convert_inlined_fn( @@ -607,6 +600,7 @@ impl<'a> QwikTransform<'a> { &inlined_fn, accept_call_expr, serialize_fn, + is_const, ) } @@ -656,7 +650,7 @@ impl<'a> QwikTransform<'a> { // Collect local idents let local_idents = self.get_local_idents(&folded); - let (mut scoped_idents, is_const, _) = + let (mut scoped_idents, is_const) = compute_scoped_idents(&descendent_idents, &decl_collect); if !can_capture && !scoped_idents.is_empty() { HANDLER.with(|handler| { @@ -1830,12 +1824,8 @@ impl<'a> Fold for QwikTransform<'a> { .last_mut() .expect("Declaration stack empty!"); - let is_qcomponent = is_qcomponent(&self.stack_ctxt.last()); - let is_top_level_inline_component = is_top_level(&self.stack_ctxt); - let is_component = is_qcomponent || is_top_level_inline_component; - for param in &node.params { - current_scope.extend(process_node_props(¶m.pat, is_component)); + current_scope.extend(process_node_props(¶m.pat)); } let o = node.fold_children_with(self); self.root_jsx_mode = prev; @@ -1858,12 +1848,8 @@ impl<'a> Fold for QwikTransform<'a> { .last_mut() .expect("Declaration stack empty!"); - let is_qcomponent = is_qcomponent(&self.stack_ctxt.last()); - let is_top_level_inline_component = is_top_level(&self.stack_ctxt); - let is_component = is_qcomponent || is_top_level_inline_component; - for param in &node.params { - current_scope.extend(process_node_props(param, is_component)); + current_scope.extend(process_node_props(param)); } let o = node.fold_children_with(self); @@ -1906,23 +1892,19 @@ impl<'a> Fold for QwikTransform<'a> { .last_mut() .expect("Declaration stack empty!"); - let is_qcomponent = is_qcomponent(&self.stack_ctxt.last()); - let is_top_level_inline_component = is_top_level(&self.stack_ctxt); - let is_component = is_qcomponent || is_top_level_inline_component; - match node.left.clone() { ast::ForHead::VarDecl(var_decl) => { for decl in &var_decl.decls { - current_scope.extend(process_node_props(&decl.name, is_component)); + current_scope.extend(process_node_props(&decl.name)); } } ast::ForHead::UsingDecl(using_decl) => { for decl in &using_decl.decls { - current_scope.extend(process_node_props(&decl.name, is_component)); + current_scope.extend(process_node_props(&decl.name)); } } ast::ForHead::Pat(pat) => { - current_scope.extend(process_node_props(&pat, is_component)); + current_scope.extend(process_node_props(&pat)); } } @@ -2279,23 +2261,20 @@ fn base64(nu: u64) -> String { .replace(['-', '_'], "0") } -fn compute_scoped_idents(all_idents: &[Id], all_decl: &[IdPlusType]) -> (Vec, bool, bool) { +fn compute_scoped_idents(all_idents: &[Id], all_decl: &[IdPlusType]) -> (Vec, bool) { let mut set: HashSet = HashSet::new(); let mut is_const = true; - let mut has_const = false; for ident in all_idents { if let Some(item) = all_decl.iter().find(|item| item.0 == *ident) { set.insert(ident.clone()); - if matches!(item.1, IdentType::Var(true)) { - has_const = true; - } else { + if !matches!(item.1, IdentType::Var(true)) { is_const = false; } } } let mut output: Vec = set.into_iter().collect(); output.sort(); - (output, is_const, has_const) + (output, is_const) } fn get_canonical_filename(display_name: &JsWord, symbol_name: &JsWord) -> JsWord { @@ -2501,23 +2480,14 @@ fn is_text_only(node: &str) -> bool { ) } -fn is_qcomponent(stack_item: &Option<&String>) -> bool { - *stack_item == Some(&QCOMPONENT.to_string()) -} - -const fn is_top_level(stack: &[String]) -> bool { - stack.len() == 1 -} - -fn process_node_props(pat: &ast::Pat, is_qcomponent: bool) -> Vec { +fn process_node_props(pat: &ast::Pat) -> Vec { let mut identifiers = vec![]; let mut processed_scope_data: Vec = vec![]; - let is_identifier = collect_from_pat(pat, &mut identifiers); - let is_constant = if is_qcomponent { is_identifier } else { false }; + collect_from_pat(pat, &mut identifiers); processed_scope_data.extend( identifiers .into_iter() - .map(|(id, _)| (id, IdentType::Var(is_constant))), + .map(|(id, _)| (id, IdentType::Var(false))), ); processed_scope_data