diff --git a/src/compiler/compile/render_dom/Renderer.ts b/src/compiler/compile/render_dom/Renderer.ts index ca93c51060..53f6c8554f 100644 --- a/src/compiler/compile/render_dom/Renderer.ts +++ b/src/compiler/compile/render_dom/Renderer.ts @@ -26,6 +26,7 @@ export default class Renderer { options: CompileOptions; context: ContextMember[] = []; + initial_context: ContextMember[] = []; context_lookup: Map = new Map(); context_overflow: boolean; blocks: Array = []; @@ -110,8 +111,12 @@ export default class Renderer { // these determine whether variable is included in initial context // array, so must have the highest priority - if (variable.export_name) member.priority += 8; - if (variable.referenced) member.priority += 16; + if (variable.export_name) member.priority += 16; + if (variable.referenced) member.priority += 32; + } else if (member.is_non_contextual) { + // determine whether variable is included in initial context + // array, so must have the highest priority + member.priority += 8; } if (!member.is_contextual) { @@ -121,6 +126,17 @@ export default class Renderer { this.context.sort((a, b) => (b.priority - a.priority) || ((a.index.value as number) - (b.index.value as number))); this.context.forEach((member, i) => member.index.value = i); + + let i = this.context.length; + while (i--) { + const member = this.context[i]; + if (member.variable) { + if (member.variable.referenced || member.variable.export_name) break; + } else if (member.is_non_contextual) { + break; + } + } + this.initial_context = this.context.slice(0, i + 1); } add_to_context(name: string, contextual = false) { diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 4009c6bddf..13b9b56bad 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -301,24 +301,13 @@ export default function dom( const instance_javascript = component.extract_javascript(component.ast.instance); - let i = renderer.context.length; - while (i--) { - const member = renderer.context[i]; - if (member.variable) { - if (member.variable.referenced || member.variable.export_name) break; - } else if (member.is_non_contextual) { - break; - } - } - const initial_context = renderer.context.slice(0, i + 1); - const has_definition = ( component.compile_options.dev || (instance_javascript && instance_javascript.length > 0) || filtered_props.length > 0 || uses_props || component.partly_hoisted.length > 0 || - initial_context.length > 0 || + renderer.initial_context.length > 0 || component.reactive_declarations.length > 0 || capture_state || inject_state @@ -404,7 +393,7 @@ export default function dom( const return_value = { type: 'ArrayExpression', - elements: initial_context.map(member => ({ + elements: renderer.initial_context.map(member => ({ type: 'Identifier', name: member.name }) as Expression) diff --git a/test/js/samples/initial-context/expected.js b/test/js/samples/initial-context/expected.js new file mode 100644 index 0000000000..592e2a709e --- /dev/null +++ b/test/js/samples/initial-context/expected.js @@ -0,0 +1,59 @@ +/* generated by Svelte vX.Y.Z */ +import { + SvelteComponent, + detach, + element, + init, + insert, + listen, + noop, + safe_not_equal +} from "svelte/internal"; + +function create_fragment(ctx) { + let button; + let mounted; + let dispose; + + return { + c() { + button = element("button"); + }, + m(target, anchor) { + insert(target, button, anchor); + + if (!mounted) { + dispose = listen(button, "click", /*click_handler*/ ctx[1]); + mounted = true; + } + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(button); + mounted = false; + dispose(); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let foo; + + function unreferenced() { + $$invalidate(0, foo = 1); + } + + const click_handler = () => $$invalidate(0, foo = 2); + return [foo, click_handler]; +} + +class Component extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, {}); + } +} + +export default Component; \ No newline at end of file diff --git a/test/js/samples/initial-context/input.svelte b/test/js/samples/initial-context/input.svelte new file mode 100644 index 0000000000..22ec290514 --- /dev/null +++ b/test/js/samples/initial-context/input.svelte @@ -0,0 +1,7 @@ + + \ No newline at end of file