diff --git a/packages/qwik/src/optimizer/core/src/inlined_fn.rs b/packages/qwik/src/optimizer/core/src/inlined_fn.rs index bac3d46e4a9..61296d96e2e 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::transforms::optimization; use swc_ecmascript::visit::{Visit, VisitWith}; use swc_ecmascript::{ utils::private_ident, @@ -199,6 +200,10 @@ pub fn render_expr(expr: &ast::Expr) -> String { }; expr.visit_mut_with(&mut hygiene_with_config(Default::default())); expr.visit_mut_with(&mut fixer(None)); + expr.visit_mut_with(&mut optimization::simplify::dce::dce( + Default::default(), + Default::default(), + )); emitter .emit_module(&ast::Module { span: DUMMY_SP, diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_drop_side_effects.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_drop_side_effects.snap index be9a0ec0531..4216034d5db 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_drop_side_effects.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_drop_side_effects.snap @@ -1,8 +1,7 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 821 +assertion_line: 822 expression: output -snapshot_kind: text --- ==INPUT== @@ -39,9 +38,9 @@ export default component$(() => { ============================= test.js == import { serverQrl } from "@qwik.dev/router"; +import { qrlDEV } from "@qwik.dev/core"; import { _noopQrlDEV } from "@qwik.dev/core"; import { componentQrl } from "@qwik.dev/core"; -import { qrlDEV } from "@qwik.dev/core"; const i_LUXeXe0DQrg = ()=>import("./test.tsx_test_component_LUXeXe0DQrg"); import { sideEffect } from './secret'; (function() { @@ -93,6 +92,34 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma ] } */ +============================= test.tsx_api_server_JonPp043gH0.js (ENTRY POINT)== + +export const api_server_JonPp043gH0 = ()=>{ + supabase.from('ffg').do(dfd); +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"sCAoB2B;IAC1B,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;AACzB\"}") +/* +{ + "origin": "test.tsx", + "name": "api_server_JonPp043gH0", + "entry": null, + "displayName": "test.tsx_api_server", + "hash": "JonPp043gH0", + "canonicalFilename": "test.tsx_api_server_JonPp043gH0", + "path": "", + "extension": "js", + "parent": null, + "ctxKind": "function", + "ctxName": "server$", + "captures": false, + "loc": [ + 433, + 473 + ] +} +*/ ============================= test.tsx_test_component_LUXeXe0DQrg.js (ENTRY POINT)== import { _jsxSorted } from "@qwik.dev/core"; diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_noop_dev_mode.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_noop_dev_mode.snap index dc3704fd721..e4149015d66 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_noop_dev_mode.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_noop_dev_mode.snap @@ -1,8 +1,7 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 3814 +assertion_line: 3816 expression: output -snapshot_kind: text --- ==INPUT== @@ -45,6 +44,39 @@ export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrlDEV(i_ckEPmXZlub0 Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AAGA,OAAO,MAAM,oBAAM;;;;;IAoBhB\"}") +============================= test.tsx_App_component_Cmp_p_shouldRemove_uU0MG0jvQD4.js (ENTRY POINT)== + +import { useLexicalScope } from "@qwik.dev/core"; +export const App_component_Cmp_p_shouldRemove_uU0MG0jvQD4 = ()=>{ + const [stuff] = useLexicalScope(); + return stuff.count; +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";4DAgBmB;;WAAM,MAAM,KAAK\"}") +/* +{ + "origin": "test.tsx", + "name": "App_component_Cmp_p_shouldRemove_uU0MG0jvQD4", + "entry": null, + "displayName": "test.tsx_App_component_Cmp_p_shouldRemove", + "hash": "uU0MG0jvQD4", + "canonicalFilename": "test.tsx_App_component_Cmp_p_shouldRemove_uU0MG0jvQD4", + "path": "", + "extension": "js", + "parent": "App_component_ckEPmXZlub0", + "ctxKind": "eventHandler", + "ctxName": "shouldRemove$", + "captures": true, + "loc": [ + 350, + 367 + ], + "captureNames": [ + "stuff" + ] +} +*/ ============================= test.tsx_App_component_ckEPmXZlub0.js (ENTRY POINT)== import { _jsxSorted } from "@qwik.dev/core"; @@ -116,6 +148,66 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma ] } */ +============================= test.tsx_App_component_serverStuff_ebyHaP15ytQ.js (ENTRY POINT)== + +import { useLexicalScope } from "@qwik.dev/core"; +export const App_component_serverStuff_ebyHaP15ytQ = async ()=>{ + const [stuff] = useLexicalScope(); + // should be removed but keep scope + console.log(stuff.count); +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";qDAKc;;IACZ,mCAAmC;IACnC,QAAQ,GAAG,CAAC,MAAM,KAAK\"}") +/* +{ + "origin": "test.tsx", + "name": "App_component_serverStuff_ebyHaP15ytQ", + "entry": null, + "displayName": "test.tsx_App_component_serverStuff", + "hash": "ebyHaP15ytQ", + "canonicalFilename": "test.tsx_App_component_serverStuff_ebyHaP15ytQ", + "path": "", + "extension": "js", + "parent": "App_component_ckEPmXZlub0", + "ctxKind": "function", + "ctxName": "serverStuff$", + "captures": true, + "loc": [ + 154, + 235 + ], + "captureNames": [ + "stuff" + ] +} +*/ +============================= test.tsx_App_component_Cmp_p_onClick_vuXzfUTkpto.js (ENTRY POINT)== + +export const App_component_Cmp_p_onClick_vuXzfUTkpto = ()=>console.log('warn'); + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"uDAiBc,IAAM,QAAQ,GAAG,CAAC\"}") +/* +{ + "origin": "test.tsx", + "name": "App_component_Cmp_p_onClick_vuXzfUTkpto", + "entry": null, + "displayName": "test.tsx_App_component_Cmp_p_onClick", + "hash": "vuXzfUTkpto", + "canonicalFilename": "test.tsx_App_component_Cmp_p_onClick_vuXzfUTkpto", + "path": "", + "extension": "js", + "parent": "App_component_ckEPmXZlub0", + "ctxKind": "eventHandler", + "ctxName": "onClick$", + "captures": false, + "loc": [ + 383, + 408 + ] +} +*/ == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_reg_ctx_name_segments.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_reg_ctx_name_segments.snap index a12d1260b39..93eb400feef 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_reg_ctx_name_segments.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_reg_ctx_name_segments.snap @@ -1,8 +1,7 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 865 +assertion_line: 866 expression: output -snapshot_kind: text --- ==INPUT== @@ -13,7 +12,7 @@ export const Works = component$((props) => { const text = 'hola'; return ( <> -
console.log('in server', text))}>
+
server$(() => console.log('in server', text))}>
foo()}>
); @@ -23,25 +22,23 @@ export const Works = component$((props) => { import "./foo"; import { componentQrl } from "@qwik.dev/core"; -import { serverQrl } from "@qwik.dev/core"; -import { _regSymbol } from "@qwik.dev/core"; import { inlinedQrl } from "@qwik.dev/core"; -import { _jsxSorted } from "@qwik.dev/core"; import { _noopQrl } from "@qwik.dev/core"; +import { _jsxSorted } from "@qwik.dev/core"; import { Fragment as _Fragment } from "@qwik.dev/core/jsx-runtime"; export const Works = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl((props)=>{ return /*#__PURE__*/ _jsxSorted(_Fragment, null, null, [ - /*#__PURE__*/ _jsxSorted("div", { - onClick$: serverQrl(/*#__PURE__*/ inlinedQrl(/*#__PURE__*/ _regSymbol(()=>console.log('in server', 'hola'), "gcSPFNpGYgg"), "Works_component_Fragment_div_onClick_server_gcSPFNpGYgg")) - }, null, null, 2, null), /*#__PURE__*/ _jsxSorted("div", null, { onClick$: /*#__PURE__*/ _noopQrl("Works_component_Fragment_div_onClick_nO4DPVZWP7g") + }, null, 3, null), + /*#__PURE__*/ _jsxSorted("div", null, { + onClick$: /*#__PURE__*/ _noopQrl("Works_component_Fragment_div_onClick_1_GlJs0t0HdXk") }, null, 3, null) - ], 1, "u6_0"); + ], 3, "u6_0"); }, "Works_component_t45qL4vNGv0")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;;;;AAGA,OAAO,MAAM,sBAAQ,sCAAW,CAAC;IAEhC,qBACC;sBACA,WAAC;YAAI,UAAU,4DAAQ,IAAM,QAAQ,GAAG,CAAC,aAH7B;;sBAIZ,WAAC;YAAI,QAAQ;;;AAGf,mCAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;;AAGA,OAAO,MAAM,sBAAQ,sCAAW,CAAC;IAEhC,qBACC;sBACA,WAAC;YAAI,QAAQ;;sBACb,WAAC;YAAI,QAAQ;;;AAGf,mCAAG\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_client_code.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_client_code.snap index 3c8cf855aa1..90cbd6aeb68 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_client_code.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_client_code.snap @@ -1,8 +1,7 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 1929 +assertion_line: 1930 expression: output -snapshot_kind: text --- ==INPUT== @@ -28,6 +27,7 @@ export const Parent = component$(() => { useTask$(() => { // Code + runSomething(); }); return ( @@ -50,11 +50,11 @@ import "./keep"; import "../keep2"; import { componentQrl } from "@qwik.dev/core"; import { useClientMountQrl } from "@qwik.dev/core"; +import { useLexicalScope } from "@qwik.dev/core"; +import { inlinedQrl } from "@qwik.dev/core"; import { _noopQrl } from "@qwik.dev/core"; import { useTaskQrl } from "@qwik.dev/core"; -import { inlinedQrl } from "@qwik.dev/core"; import { _wrapProp } from "@qwik.dev/core"; -import { useLexicalScope } from "@qwik.dev/core"; import { _jsxSorted } from "@qwik.dev/core"; import { useStore } from '@qwik.dev/core'; export const Parent = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(()=>{ @@ -66,7 +66,8 @@ export const Parent = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(()=>{ state ])); useTaskQrl(/*#__PURE__*/ inlinedQrl(()=>{ - // Code + // Code + runSomething(); }, "Parent_component_useTask_ngmvcygWux8")); return /*#__PURE__*/ _jsxSorted("div", null, { shouldRemove$: /*#__PURE__*/ _noopQrl("Parent_component_div_shouldRemove_EBj69wTX1do", [ @@ -90,7 +91,7 @@ export const Parent = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(()=>{ }, "Parent_component_t6Wy3C0Q0XM")); -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/components/component.tsx\"],\"names\":[],\"mappings\":\";;;;;;;;;;AACA,SAAsC,QAAQ,QAAkB,iBAAiB;AAQjF,OAAO,MAAM,uBAAS,sCAAW;IAChC,MAAM,QAAQ,SAAS;QACtB,MAAM;IACP;IAEA,qBAAqB;IACrB;;;IAKA,oCAAS;IACR,OAAO;IACR;IAEA,qBACC,WAAC;QACA,aAAa;;;QACb,QAAQ;;;;sBAER,WAAC;YACA,QAAQ,2BAAE,IAAM,QAAQ,GAAG,CAAC;YAC5B,OAAO,2BAAE;;uBAAM,MAAM,IAAI;;;;;kBAEzB;;AAGJ,oCAAG\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/components/component.tsx\"],\"names\":[],\"mappings\":\";;;;;;;;;;AACA,SAAsC,QAAQ,QAAkB,iBAAiB;AAQjF,OAAO,MAAM,uBAAS,sCAAW;IAChC,MAAM,QAAQ,SAAS;QACtB,MAAM;IACP;IAEA,qBAAqB;IACrB;;;IAKA,oCAAS;QACR,OAAO;QACP;IACD;IAEA,qBACC,WAAC;QACA,aAAa;;;QACb,QAAQ;;;;sBAER,WAAC;YACA,QAAQ,2BAAE,IAAM,QAAQ,GAAG,CAAC;YAC5B,OAAO,2BAAE;;uBAAM,MAAM,IAAI;;;;;kBAEzB;;AAGJ,oCAAG\"}") == DIAGNOSTICS == [] diff --git a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_server_code.snap b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_server_code.snap index 4a07442bbf6..146fa7a7e4b 100644 --- a/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_server_code.snap +++ b/packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_strip_server_code.snap @@ -1,8 +1,7 @@ --- source: packages/qwik/src/optimizer/core/src/test.rs -assertion_line: 1822 +assertion_line: 1823 expression: output -snapshot_kind: text --- ==INPUT== @@ -28,10 +27,10 @@ export const Parent = component$(() => { serverStuff$(async () => { // should be removed too const a = $(() => { - // from $(), should not be removed + dontRemoveThisDollar(); }); const b = client$(() => { - // from clien$(), should not be removed + dontRemoveThisClient(); }); return [a,b]; }) @@ -39,7 +38,7 @@ export const Parent = component$(() => { serverLoader$(handler); useTask$(() => { - // Code + runSomething(); }); return ( @@ -97,11 +96,11 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma ============================= test.tsx_Parent_component_serverStuff_a_2ca3HLDC7yc.js (ENTRY POINT)== export const s_2ca3HLDC7yc = ()=>{ -// from $(), should not be removed + dontRemoveThisDollar(); }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"6BAqBc;AACX,kCAAkC;AACnC\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"6BAqBc;IACX;AACD\"}") /* { "origin": "test.tsx", @@ -118,18 +117,18 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma "captures": false, "loc": [ 538, - 587 + 576 ] } */ ============================= test.tsx_Parent_component_serverStuff_b_client_v9qawr2Inkk.js (ENTRY POINT)== export const s_v9qawr2Inkk = ()=>{ -// from clien$(), should not be removed + dontRemoveThisClient(); }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"6BAwBoB;AACjB,uCAAuC;AACxC\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"6BAwBoB;IACjB;AACD\"}") /* { "origin": "test.tsx", @@ -145,8 +144,35 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma "ctxName": "client$", "captures": false, "loc": [ - 610, - 664 + 599, + 637 + ] +} +*/ +============================= test.tsx_Parent_component_serverLoader_k1L0DiPQV1I.js (ENTRY POINT)== + +import { handler } from "serverless"; +export const s_k1L0DiPQV1I = handler; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";6BA8Be\"}") +/* +{ + "origin": "test.tsx", + "name": "s_k1L0DiPQV1I", + "entry": null, + "displayName": "test.tsx_Parent_component_serverLoader", + "hash": "k1L0DiPQV1I", + "canonicalFilename": "test.tsx_Parent_component_serverLoader_k1L0DiPQV1I", + "path": "", + "extension": "js", + "parent": "s_0TaiDayHrlo", + "ctxKind": "function", + "ctxName": "serverLoader$", + "captures": false, + "loc": [ + 676, + 683 ] } */ @@ -197,7 +223,7 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma "captures": false, "loc": [ 279, - 835 + 816 ] } */ @@ -222,19 +248,57 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma "ctxName": "onClick$", "captures": false, "loc": [ - 775, - 802 + 756, + 783 + ] +} +*/ +============================= test.tsx_Parent_component_serverStuff_r1qAHX7Opp0.js (ENTRY POINT)== + +import { clientQrl } from "@qwik.dev/core"; +import { qrl } from "@qwik.dev/core"; +const i_2ca3HLDC7yc = ()=>import("./test.tsx_Parent_component_serverStuff_a_2ca3HLDC7yc"); +const i_v9qawr2Inkk = ()=>import("./test.tsx_Parent_component_serverStuff_b_client_v9qawr2Inkk"); +export const s_r1qAHX7Opp0 = async ()=>{ + // should be removed too + const a = /*#__PURE__*/ qrl(i_2ca3HLDC7yc, "s_2ca3HLDC7yc"); + const b = clientQrl(/*#__PURE__*/ qrl(i_v9qawr2Inkk, "s_v9qawr2Inkk")); + return [ + a, + b + ]; +}; + + +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;6BAmBc;IACZ,wBAAwB;IACxB,MAAM;IAGN,MAAM,IAAI;IAGV,OAAO;QAAC;QAAE;KAAE;AACb\"}") +/* +{ + "origin": "test.tsx", + "name": "s_r1qAHX7Opp0", + "entry": null, + "displayName": "test.tsx_Parent_component_serverStuff", + "hash": "r1qAHX7Opp0", + "canonicalFilename": "test.tsx_Parent_component_serverStuff_r1qAHX7Opp0", + "path": "", + "extension": "js", + "parent": "s_0TaiDayHrlo", + "ctxKind": "function", + "ctxName": "serverStuff$", + "captures": false, + "loc": [ + 483, + 658 ] } */ ============================= test.tsx_Parent_component_useTask_1_P8oRQhHsurk.js (ENTRY POINT)== export const s_P8oRQhHsurk = ()=>{ -// Code + runSomething(); }; -Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"6BAgCU;AACR,OAAO;AACR\"}") +Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\"6BAgCU;IACR;AACD\"}") /* { "origin": "test.tsx", @@ -250,8 +314,8 @@ Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"ma "ctxName": "useTask$", "captures": false, "loc": [ - 724, - 744 + 697, + 725 ] } */ diff --git a/packages/qwik/src/optimizer/core/src/test.rs b/packages/qwik/src/optimizer/core/src/test.rs index f267b977b76..347c3727a89 100644 --- a/packages/qwik/src/optimizer/core/src/test.rs +++ b/packages/qwik/src/optimizer/core/src/test.rs @@ -871,7 +871,7 @@ export const Works = component$((props) => { const text = 'hola'; return ( <> -
console.log('in server', text))}>
+
server$(() => console.log('in server', text))}>
foo()}>
); @@ -1843,10 +1843,10 @@ export const Parent = component$(() => { serverStuff$(async () => { // should be removed too const a = $(() => { - // from $(), should not be removed + dontRemoveThisDollar(); }); const b = client$(() => { - // from clien$(), should not be removed + dontRemoveThisClient(); }); return [a,b]; }) @@ -1854,7 +1854,7 @@ export const Parent = component$(() => { serverLoader$(handler); useTask$(() => { - // Code + runSomething(); }); return ( @@ -1950,6 +1950,7 @@ export const Parent = component$(() => { useTask$(() => { // Code + runSomething(); }); return ( diff --git a/packages/qwik/src/optimizer/core/src/transform.rs b/packages/qwik/src/optimizer/core/src/transform.rs index e00561f347d..de12bad0be3 100644 --- a/packages/qwik/src/optimizer/core/src/transform.rs +++ b/packages/qwik/src/optimizer/core/src/transform.rs @@ -685,30 +685,9 @@ impl<'a> QwikTransform<'a> { hash, }; let should_emit = self.should_emit_segment(&segment_data); - if should_emit { - for id in &segment_data.local_idents { - if !self.options.global_collect.exports.contains_key(id) { - if self.options.global_collect.root.contains_key(id) { - self.ensure_export(id); - } - if invalid_decl.iter().any(|entry| entry.0 == *id) { - HANDLER.with(|handler| { - handler - .struct_err_with_code( - &format!( - "Reference to identifier '{}' can not be used inside a Qrl($) scope because it's a function", - id.0 - ), - errors::get_diagnostic_id(errors::Error::FunctionReference), - ) - .emit(); - }); - } - } - } - } - if !should_emit { - (self.create_noop_qrl(&symbol_name, segment_data), is_const) + + let result = if is_empty_function(&folded) { + self.create_noop_qrl(&symbol_name, segment_data.clone()) } else if self.is_inline() { let folded = if !segment_data.scoped_idents.is_empty() { let new_local = self.ensure_core_import(&USE_LEXICAL_SCOPE); @@ -728,15 +707,41 @@ impl<'a> QwikTransform<'a> { } else { folded }; - ( - self.create_inline_qrl(segment_data, folded, symbol_name, span), - is_const, - ) + self.create_inline_qrl(segment_data.clone(), folded, symbol_name.clone(), span) } else { - ( - self.create_segment(segment_data, folded, symbol_name, span, segment_hash), - is_const, + self.create_segment( + segment_data.clone(), + folded, + symbol_name.clone(), + span, + segment_hash, ) + }; + + if should_emit { + for id in &segment_data.local_idents { + if !self.options.global_collect.exports.contains_key(id) { + if self.options.global_collect.root.contains_key(id) { + self.ensure_export(id); + } + if invalid_decl.iter().any(|entry| entry.0 == *id) { + HANDLER.with(|handler| { + handler + .struct_err_with_code( + &format!( + "Reference to identifier '{}' can not be used inside a Qrl($) scope because it's a function", + id.0 + ), + errors::get_diagnostic_id(errors::Error::FunctionReference), + ) + .emit(); + }); + } + } + } + (result, is_const) + } else { + (self.create_noop_qrl(&symbol_name, segment_data), is_const) } } @@ -2737,6 +2742,21 @@ fn is_text_only(node: &str) -> bool { ) } +fn is_empty_function(expr: &ast::Expr) -> bool { + match expr { + ast::Expr::Arrow(arrow) => match &*arrow.body { + ast::BlockStmtOrExpr::BlockStmt(block) => block.stmts.is_empty(), + ast::BlockStmtOrExpr::Expr(_) => false, + }, + ast::Expr::Fn(fn_expr) => fn_expr + .function + .body + .as_ref() + .map_or(true, |body| body.stmts.is_empty()), + _ => false, + } +} + fn process_node_props(pat: &ast::Pat) -> Vec { let mut identifiers = vec![]; let mut processed_scope_data: Vec = vec![];