Skip to content

Commit dc8c161

Browse files
tanhauhautaylorzane
authored andcommitted
remove unreferenced variable from initial context (sveltejs#4941)
1 parent af4cd81 commit dc8c161

File tree

4 files changed

+86
-15
lines changed

4 files changed

+86
-15
lines changed

src/compiler/compile/render_dom/Renderer.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export default class Renderer {
2626
options: CompileOptions;
2727

2828
context: ContextMember[] = [];
29+
initial_context: ContextMember[] = [];
2930
context_lookup: Map<string, ContextMember> = new Map();
3031
context_overflow: boolean;
3132
blocks: Array<Block | Node | Node[]> = [];
@@ -110,8 +111,12 @@ export default class Renderer {
110111

111112
// these determine whether variable is included in initial context
112113
// array, so must have the highest priority
113-
if (variable.export_name) member.priority += 8;
114-
if (variable.referenced) member.priority += 16;
114+
if (variable.export_name) member.priority += 16;
115+
if (variable.referenced) member.priority += 32;
116+
} else if (member.is_non_contextual) {
117+
// determine whether variable is included in initial context
118+
// array, so must have the highest priority
119+
member.priority += 8;
115120
}
116121

117122
if (!member.is_contextual) {
@@ -121,6 +126,17 @@ export default class Renderer {
121126

122127
this.context.sort((a, b) => (b.priority - a.priority) || ((a.index.value as number) - (b.index.value as number)));
123128
this.context.forEach((member, i) => member.index.value = i);
129+
130+
let i = this.context.length;
131+
while (i--) {
132+
const member = this.context[i];
133+
if (member.variable) {
134+
if (member.variable.referenced || member.variable.export_name) break;
135+
} else if (member.is_non_contextual) {
136+
break;
137+
}
138+
}
139+
this.initial_context = this.context.slice(0, i + 1);
124140
}
125141

126142
add_to_context(name: string, contextual = false) {

src/compiler/compile/render_dom/index.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -301,24 +301,13 @@ export default function dom(
301301

302302
const instance_javascript = component.extract_javascript(component.ast.instance);
303303

304-
let i = renderer.context.length;
305-
while (i--) {
306-
const member = renderer.context[i];
307-
if (member.variable) {
308-
if (member.variable.referenced || member.variable.export_name) break;
309-
} else if (member.is_non_contextual) {
310-
break;
311-
}
312-
}
313-
const initial_context = renderer.context.slice(0, i + 1);
314-
315304
const has_definition = (
316305
component.compile_options.dev ||
317306
(instance_javascript && instance_javascript.length > 0) ||
318307
filtered_props.length > 0 ||
319308
uses_props ||
320309
component.partly_hoisted.length > 0 ||
321-
initial_context.length > 0 ||
310+
renderer.initial_context.length > 0 ||
322311
component.reactive_declarations.length > 0 ||
323312
capture_state ||
324313
inject_state
@@ -404,7 +393,7 @@ export default function dom(
404393

405394
const return_value = {
406395
type: 'ArrayExpression',
407-
elements: initial_context.map(member => ({
396+
elements: renderer.initial_context.map(member => ({
408397
type: 'Identifier',
409398
name: member.name
410399
}) as Expression)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/* generated by Svelte vX.Y.Z */
2+
import {
3+
SvelteComponent,
4+
detach,
5+
element,
6+
init,
7+
insert,
8+
listen,
9+
noop,
10+
safe_not_equal
11+
} from "svelte/internal";
12+
13+
function create_fragment(ctx) {
14+
let button;
15+
let mounted;
16+
let dispose;
17+
18+
return {
19+
c() {
20+
button = element("button");
21+
},
22+
m(target, anchor) {
23+
insert(target, button, anchor);
24+
25+
if (!mounted) {
26+
dispose = listen(button, "click", /*click_handler*/ ctx[1]);
27+
mounted = true;
28+
}
29+
},
30+
p: noop,
31+
i: noop,
32+
o: noop,
33+
d(detaching) {
34+
if (detaching) detach(button);
35+
mounted = false;
36+
dispose();
37+
}
38+
};
39+
}
40+
41+
function instance($$self, $$props, $$invalidate) {
42+
let foo;
43+
44+
function unreferenced() {
45+
$$invalidate(0, foo = 1);
46+
}
47+
48+
const click_handler = () => $$invalidate(0, foo = 2);
49+
return [foo, click_handler];
50+
}
51+
52+
class Component extends SvelteComponent {
53+
constructor(options) {
54+
super();
55+
init(this, options, instance, create_fragment, safe_not_equal, {});
56+
}
57+
}
58+
59+
export default Component;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
let foo;
3+
function unreferenced () {
4+
foo = 1;
5+
}
6+
</script>
7+
<button on:click={() => foo = 2}></button>

0 commit comments

Comments
 (0)