Skip to content

Commit f63b4a1

Browse files
authored
Merge pull request #7707 from QwikDev/v2-dont-wrap-functions
fix: don't wrap function calls in signal
2 parents 8426d2f + 01fa728 commit f63b4a1

File tree

6 files changed

+130
-13
lines changed

6 files changed

+130
-13
lines changed

.changeset/fuzzy-files-kiss.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@qwik.dev/core': patch
3+
---
4+
5+
fix: don't wrap function calls in signal

packages/qwik/src/optimizer/core/src/inlined_fn.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ pub fn convert_inlined_fn(
4747
return (None, is_const);
4848
}
4949

50-
if !is_used_as_object(&expr, &scoped_idents) {
50+
let (used_as_object, used_as_call) = is_used_as_object_or_call(&expr, &scoped_idents);
51+
if used_as_call {
52+
return (None, false);
53+
}
54+
if !used_as_object {
5155
return (None, is_const);
5256
}
5357

@@ -211,6 +215,7 @@ pub fn render_expr(expr: &ast::Expr) -> String {
211215
struct ObjectUsageChecker<'a> {
212216
identifiers: &'a Vec<Id>,
213217
used_as_object: bool,
218+
used_as_call: bool,
214219
}
215220

216221
impl<'a> ObjectUsageChecker<'a> {
@@ -252,6 +257,12 @@ impl<'a> ObjectUsageChecker<'a> {
252257
}
253258

254259
impl<'a> Visit for ObjectUsageChecker<'a> {
260+
fn visit_call_expr(&mut self, _: &ast::CallExpr) {
261+
// If we're in a call expression, we can't wrap it in a signal
262+
// because it's a function call, and later we need to serialize it
263+
self.used_as_call = true;
264+
}
265+
255266
fn visit_member_expr(&mut self, node: &ast::MemberExpr) {
256267
if self.used_as_object {
257268
return;
@@ -266,13 +277,14 @@ impl<'a> Visit for ObjectUsageChecker<'a> {
266277
}
267278
}
268279

269-
fn is_used_as_object(expr: &ast::Expr, identifiers: &Vec<Id>) -> bool {
280+
fn is_used_as_object_or_call(expr: &ast::Expr, identifiers: &Vec<Id>) -> (bool, bool) {
270281
let mut checker = ObjectUsageChecker {
271282
identifiers,
272283
used_as_object: false,
284+
used_as_call: false,
273285
};
274286

275287
expr.visit_with(&mut checker);
276288

277-
checker.used_as_object
289+
(checker.used_as_object, checker.used_as_call)
278290
}

packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_cmp.snap

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const App_component_ckEPmXZlub0 = ()=>{
6565
global: globalThing,
6666
globalAccess: globalThing.thing,
6767
globalComputed: globalThing.thing + 'stuff',
68+
noInline: signal.value(),
6869
noInline2: signal.value + unknown(),
6970
noInline3: mutable(signal),
7071
noInline4: signal.value + dep
@@ -88,16 +89,13 @@ const App_component_ckEPmXZlub0 = ()=>{
8889
], 'p0.address.city.name?"true":"false"'),
8990
dep: dep,
9091
depAccess: dep.thing,
91-
depComputed: dep.thing + 'stuff',
92-
noInline: _fnSignal((p0)=>p0.value(), [
93-
signal
94-
], "p0.value()")
92+
depComputed: dep.thing + 'stuff'
9593
}, null, 3, "u6_0");
9694
};
9795
export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(App_component_ckEPmXZlub0, "App_component_ckEPmXZlub0"));
9896

9997

100-
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAqB,QAAQ,EAAE,OAAO,QAAQ,iBAAiB;AAE/D,SAAQ,GAAG,QAAO,SAAS;AAC3B,SAAQ,GAAG,QAAO,QAAQ;kCAEI;IAC7B,MAAM,SAAS,UAAU;IACzB,MAAM,QAAQ,SAAS,CAAC;IACxB,qBACC,WAAC;QAmBA,QAAQ;QACR,cAAc,YAAY,KAAK;QAC/B,gBAAgB,YAAY,KAAK,GAAG;QAIpC,WAAW,OAAO,KAAK,GAAG;QAC1B,WAAW,QAAQ;QACnB,WAAW,OAAO,KAAK,GAAG;;QA1B1B,YAAW;QACX,aAAa,CAAC,IAAI,CAAC;QACnB,cAAc;QACd,eAAe;QACf,YAAY,CAAC,IAAI,EAAE,IAAI;QACvB,aAAa,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,KAAK;QAEpD,QAAQ;QACR,WAAW,YAAE;QACb,mBAAmB,kBAAE,KAAK,GAAO,KAAK;;;QAEtC,KAAK,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI;;;QAC9B,aAAa,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS;;;QAElD,KAAK;QACL,WAAW,IAAI,KAAK;QACpB,aAAa,IAAI,KAAK,GAAG;QAOzB,QAAQ,kBAAE,GAAO,KAAK;;;;AAMzB;AAlCA,OAAO,MAAM,oBAAM,+FAkChB\"}")
98+
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAqB,QAAQ,EAAE,OAAO,QAAQ,iBAAiB;AAE/D,SAAQ,GAAG,QAAO,SAAS;AAC3B,SAAQ,GAAG,QAAO,QAAQ;kCAEI;IAC7B,MAAM,SAAS,UAAU;IACzB,MAAM,QAAQ,SAAS,CAAC;IACxB,qBACC,WAAC;QAmBA,QAAQ;QACR,cAAc,YAAY,KAAK;QAC/B,gBAAgB,YAAY,KAAK,GAAG;QAGpC,UAAU,OAAO,KAAK;QACtB,WAAW,OAAO,KAAK,GAAG;QAC1B,WAAW,QAAQ;QACnB,WAAW,OAAO,KAAK,GAAG;;QA1B1B,YAAW;QACX,aAAa,CAAC,IAAI,CAAC;QACnB,cAAc;QACd,eAAe;QACf,YAAY,CAAC,IAAI,EAAE,IAAI;QACvB,aAAa,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,KAAK;QAEpD,QAAQ;QACR,WAAW,YAAE;QACb,mBAAmB,kBAAE,KAAK,GAAO,KAAK;;;QAEtC,KAAK,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI;;;QAC9B,aAAa,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS;;;QAElD,KAAK;QACL,WAAW,IAAI,KAAK;QACpB,aAAa,IAAI,KAAK,GAAG;;AAa5B;AAlCA,OAAO,MAAM,oBAAM,+FAkChB\"}")
10199
== DIAGNOSTICS ==
102100

103101
[]

packages/qwik/src/optimizer/core/src/snapshots/qwik_core__test__example_derived_signals_div.snap

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ const App_component_ckEPmXZlub0 = (props)=>{
8383
global: globalThing,
8484
globalAccess: globalThing.thing,
8585
globalComputed: globalThing.thing + 'stuff',
86+
noInline: signal.value(),
8687
noInline2: signal.value + unknown(),
8788
noInline3: mutable(signal),
8889
noInline4: signal.value + dep,
@@ -108,16 +109,13 @@ const App_component_ckEPmXZlub0 = (props)=>{
108109
], 'p0.address.city.name?"true":"false"'),
109110
dep: dep,
110111
depAccess: dep.thing,
111-
depComputed: dep.thing + 'stuff',
112-
noInline: _fnSignal((p0)=>p0.value(), [
113-
signal
114-
], "p0.value()")
112+
depComputed: dep.thing + 'stuff'
115113
}, null, 3, "u6_0");
116114
};
117115
export const App = /*#__PURE__*/ componentQrl(/*#__PURE__*/ inlinedQrl(App_component_ckEPmXZlub0, "App_component_ckEPmXZlub0"));
118116

119117

120-
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAqB,QAAQ,EAAE,OAAO,QAAQ,iBAAiB;AAE/D,SAAQ,GAAG,QAAO,SAAS;AAC3B,OAAO,YAAY,sBAAsB;kCAEX,CAAC;IAC9B,MAAM,SAAS,UAAU;IACzB,MAAM,QAAQ,SAAS,CAAC;IACxB,MAAM,QAAQ,MAAM,OAAO,CAAC,KAAK;IAEjC,qBACC,WAAC;QACA,OAAO;YACN,MAAM,QAAQ,MAAM;YACpB,KAAK,QAAQ,MAAM;YACnB,SAAS;YACT,QAAQ;QACT;QAqBA,QAAQ;QACR,cAAc,YAAY,KAAK;QAC/B,gBAAgB,YAAY,KAAK,GAAG;QAIpC,WAAW,OAAO,KAAK,GAAG;QAC1B,WAAW,QAAQ;QACnB,WAAW,OAAO,KAAK,GAAG;QA3B1B,gBAAgB,OAAO,QAAQ;;QAD/B,aAAa,OAAO,GAAG;QAEvB,YAAW;QACX,aAAa,CAAC,IAAI,CAAC;QACnB,cAAc;QACd,eAAe;QACf,YAAY,CAAC,IAAI,EAAE,IAAI;QACvB,aAAa,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,KAAK;QAEpD,QAAQ;QACR,WAAW,YAAE;QACb,mBAAmB,kBAAE,KAAK,GAAO,KAAK;;;QAEtC,KAAK,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI;;;QAC9B,aAAa,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS;;;QAElD,KAAK;QACL,WAAW,IAAI,KAAK;QACpB,aAAa,IAAI,KAAK,GAAG;QAOzB,QAAQ,kBAAE,GAAO,KAAK;;;;AAOzB;AA7CA,OAAO,MAAM,oBAAM,+FA6ChB\"}")
118+
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;;;AACA,SAAqB,QAAQ,EAAE,OAAO,QAAQ,iBAAiB;AAE/D,SAAQ,GAAG,QAAO,SAAS;AAC3B,OAAO,YAAY,sBAAsB;kCAEX,CAAC;IAC9B,MAAM,SAAS,UAAU;IACzB,MAAM,QAAQ,SAAS,CAAC;IACxB,MAAM,QAAQ,MAAM,OAAO,CAAC,KAAK;IAEjC,qBACC,WAAC;QACA,OAAO;YACN,MAAM,QAAQ,MAAM;YACpB,KAAK,QAAQ,MAAM;YACnB,SAAS;YACT,QAAQ;QACT;QAqBA,QAAQ;QACR,cAAc,YAAY,KAAK;QAC/B,gBAAgB,YAAY,KAAK,GAAG;QAGpC,UAAU,OAAO,KAAK;QACtB,WAAW,OAAO,KAAK,GAAG;QAC1B,WAAW,QAAQ;QACnB,WAAW,OAAO,KAAK,GAAG;QA3B1B,gBAAgB,OAAO,QAAQ;;QAD/B,aAAa,OAAO,GAAG;QAEvB,YAAW;QACX,aAAa,CAAC,IAAI,CAAC;QACnB,cAAc;QACd,eAAe;QACf,YAAY,CAAC,IAAI,EAAE,IAAI;QACvB,aAAa,OAAO,CAAC,IAAI,EAAE,IAAI,KAAK,WAAW,KAAK;QAEpD,QAAQ;QACR,WAAW,YAAE;QACb,mBAAmB,kBAAE,KAAK,GAAO,KAAK;;;QAEtC,KAAK,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI;;;QAC9B,aAAa,kBAAE,GAAM,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS;;;QAElD,KAAK;QACL,WAAW,IAAI,KAAK;QACpB,aAAa,IAAI,KAAK,GAAG;;AAc5B;AA7CA,OAAO,MAAM,oBAAM,+FA6ChB\"}")
121119
== DIAGNOSTICS ==
122120

123121
[]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
---
2+
source: packages/qwik/src/optimizer/core/src/test.rs
3+
assertion_line: 4405
4+
expression: output
5+
snapshot_kind: text
6+
---
7+
==INPUT==
8+
9+
10+
import { component$, useSignal } from '@qwik.dev/core';
11+
12+
13+
export default component$(() => {
14+
const toggle = useSignal(true);
15+
const t = (key: string) => key;
16+
return (
17+
<button
18+
type="button"
19+
title={
20+
toggle.value !== ''
21+
? t('app.message.exists@@there is a message for you')
22+
: t('app.message.not_exists@@click to get a message!')
23+
}
24+
></button>
25+
);
26+
});
27+
28+
============================= test.js ==
29+
30+
import { componentQrl } from "@qwik.dev/core";
31+
import { qrl } from "@qwik.dev/core";
32+
const i_LUXeXe0DQrg = ()=>import("./test.tsx_test_component_LUXeXe0DQrg");
33+
export default /*#__PURE__*/ componentQrl(/*#__PURE__*/ qrl(i_LUXeXe0DQrg, "test_component_LUXeXe0DQrg"));
34+
35+
36+
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;;AAIE,6BAAe,6EAaZ\"}")
37+
============================= test.tsx_test_component_LUXeXe0DQrg.js (ENTRY POINT)==
38+
39+
import { _jsxSorted } from "@qwik.dev/core";
40+
import { useSignal } from "@qwik.dev/core";
41+
export const test_component_LUXeXe0DQrg = ()=>{
42+
const toggle = useSignal(true);
43+
const t = (key)=>key;
44+
return /*#__PURE__*/ _jsxSorted("button", {
45+
title: toggle.value !== '' ? t('app.message.exists@@there is a message for you') : t('app.message.not_exists@@click to get a message!')
46+
}, {
47+
type: "button"
48+
}, null, 3, "u6_0");
49+
};
50+
51+
52+
Some("{\"version\":3,\"sources\":[\"/user/qwik/src/test.tsx\"],\"names\":[],\"mappings\":\";;0CAI4B;IAC1B,MAAM,SAAS,UAAU;IACzB,MAAM,IAAI,CAAC,MAAgB;IAC3B,qBACC,WAAC;QAEA,OACA,OAAO,KAAK,KAAK,KACd,EAAE,oDACF,EAAE;;QAJL,MAAK;;AAQP\"}")
53+
/*
54+
{
55+
"origin": "test.tsx",
56+
"name": "test_component_LUXeXe0DQrg",
57+
"entry": null,
58+
"displayName": "test.tsx_test_component",
59+
"hash": "LUXeXe0DQrg",
60+
"canonicalFilename": "test.tsx_test_component_LUXeXe0DQrg",
61+
"path": "",
62+
"extension": "js",
63+
"parent": null,
64+
"ctxKind": "function",
65+
"ctxName": "component$",
66+
"captures": false,
67+
"loc": [
68+
90,
69+
389
70+
]
71+
}
72+
*/
73+
== DIAGNOSTICS ==
74+
75+
[]

packages/qwik/src/optimizer/core/src/test.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4400,6 +4400,35 @@ fn should_wrap_logical_expression_in_template() {
44004400
});
44014401
}
44024402

4403+
#[test]
4404+
fn should_not_wrap_ternary_function_operator_with_fn() {
4405+
test_input!(TestInput {
4406+
code: r#"
4407+
import { component$, useSignal } from '@qwik.dev/core';
4408+
4409+
4410+
export default component$(() => {
4411+
const toggle = useSignal(true);
4412+
const t = (key: string) => key;
4413+
return (
4414+
<button
4415+
type="button"
4416+
title={
4417+
toggle.value !== ''
4418+
? t('app.message.exists@@there is a message for you')
4419+
: t('app.message.not_exists@@click to get a message!')
4420+
}
4421+
></button>
4422+
);
4423+
});
4424+
"#
4425+
.to_string(),
4426+
transpile_ts: true,
4427+
transpile_jsx: true,
4428+
..TestInput::default()
4429+
});
4430+
}
4431+
44034432
// TODO(misko): Make this test work by implementing strict serialization.
44044433
// #[test]
44054434
// fn example_of_synchronous_qrl_that_cant_be_serialized() {

0 commit comments

Comments
 (0)