add $$inject special prop, clean $capture_state & $inject_state

pull/3822/head
rixo 6 years ago
parent 898947624b
commit 3b5a7df5c4

@ -91,7 +91,10 @@ export default function dom(
const accessors = []; const accessors = [];
const not_equal = component.component_options.immutable ? x`@not_equal` : x`@safe_not_equal`; const not_equal = component.component_options.immutable ? x`@not_equal` : x`@safe_not_equal`;
let dev_props_check; let inject_state: Expression; let capture_state: Expression; let dev_props_check: Node[] | Node;
let inject_state: Expression;
let capture_state: Expression;
let props_inject: Node[] | Node;
props.forEach(prop => { props.forEach(prop => {
const variable = component.var_lookup.get(prop.name); const variable = component.var_lookup.get(prop.name);
@ -165,21 +168,35 @@ export default function dom(
} }
const capturable_vars = component.vars.filter( const capturable_vars = component.vars.filter(
variable => variable.writable && (!variable.injected || variable.name[0] === '$') v => !v.internal && v.name != null && !(v.name[0] === '$' && v.name[1] === '$')
); );
const injectable_vars = capturable_vars.filter(variable => variable.name[0] !== '$'); const injectable_vars = capturable_vars.filter(
v => !v.module && v.writable && v.name[0] !== '$'
);
capture_state = x`() => ({ ${capturable_vars.map(prop => p`${prop.name}`)} }) `; capture_state = capturable_vars.length > 0
? x`() => ({ ${capturable_vars.map(prop => p`${prop.name}`)} })`
: x`@noop`;
if (uses_props || injectable_vars.length > 0) {
inject_state = x`
${$$props} => {
${uses_props && renderer.invalidate('$$props', x`$$props = @assign(@assign({}, $$props), $$new_props)`)}
${injectable_vars.map(
v => b`if ('${v.name}' in $$props) ${renderer.invalidate(v.name, x`${v.name} = ${$$props}.${v.name}`)};`
)}
}
`;
inject_state = x` props_inject = b`
${(uses_props || injectable_vars.length > 0) && $$props} => { if ($$props && "$$inject" in $$props) {
${uses_props && renderer.invalidate('$$props', x`$$props = @assign(@assign({}, $$props), $$new_props)`)} $$self.$inject_state($$props.$$inject);
${injectable_vars.map(prop => b` }
if ('${prop.name}' in $$props) ${renderer.invalidate(prop.name, x`${prop.name} = ${$$props}.${prop.name}`)}; `;
`)} } else {
} inject_state = x`@noop`;
`; }
} }
// instrument assignments // instrument assignments
@ -230,7 +247,12 @@ export default function dom(
} }
const args = [x`$$self`]; const args = [x`$$self`];
if (props.length > 0 || component.has_reactive_assignments || component.slots.size > 0) { const has_invalidate = props.length > 0 ||
component.has_reactive_assignments ||
component.slots.size > 0 ||
capture_state ||
inject_state;
if (has_invalidate) {
args.push(x`$$props`, x`$$invalidate`); args.push(x`$$props`, x`$$invalidate`);
} }
@ -278,7 +300,9 @@ export default function dom(
uses_props || uses_props ||
component.partly_hoisted.length > 0 || component.partly_hoisted.length > 0 ||
initial_context.length > 0 || initial_context.length > 0 ||
component.reactive_declarations.length > 0 component.reactive_declarations.length > 0 ||
capture_state ||
inject_state
); );
const definition = has_definition const definition = has_definition
@ -393,6 +417,8 @@ export default function dom(
${injected.map(name => b`let ${name};`)} ${injected.map(name => b`let ${name};`)}
${/* before reactive declarations */ props_inject}
${reactive_declarations.length > 0 && b` ${reactive_declarations.length > 0 && b`
$$self.$$.update = () => { $$self.$$.update = () => {
${reactive_declarations} ${reactive_declarations}

@ -28,18 +28,26 @@ function create_fragment(ctx) {
let t4; let t4;
let t5; let t5;
let t6; let t6;
let t7;
let t8;
let t9;
let t10;
const block = { const block = {
c: function create() { c: function create() {
p = element("p"); p = element("p");
t0 = text(/*$prop*/ ctx[1]); t0 = text(/*prop*/ ctx[0]);
t1 = space(); t1 = space();
t2 = text(/*realName*/ ctx[0]); t2 = text(/*realName*/ ctx[1]);
t3 = space(); t3 = space();
t4 = text(/*local*/ ctx[2]); t4 = text(/*local*/ ctx[3]);
t5 = space(); t5 = space();
t6 = text(priv); t6 = text(priv);
add_location(p, file, 13, 0, 232); t7 = space();
t8 = text(/*$prop*/ ctx[2]);
t9 = space();
t10 = text(/*shadowedByModule*/ ctx[4]);
add_location(p, file, 22, 0, 430);
}, },
l: function claim(nodes) { l: function claim(nodes) {
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
@ -53,10 +61,15 @@ function create_fragment(ctx) {
append_dev(p, t4); append_dev(p, t4);
append_dev(p, t5); append_dev(p, t5);
append_dev(p, t6); append_dev(p, t6);
append_dev(p, t7);
append_dev(p, t8);
append_dev(p, t9);
append_dev(p, t10);
}, },
p: function update(ctx, [dirty]) { p: function update(ctx, [dirty]) {
if (dirty & /*$prop*/ 2) set_data_dev(t0, /*$prop*/ ctx[1]); if (dirty & /*prop*/ 1) set_data_dev(t0, /*prop*/ ctx[0]);
if (dirty & /*realName*/ 1) set_data_dev(t2, /*realName*/ ctx[0]); if (dirty & /*realName*/ 2) set_data_dev(t2, /*realName*/ ctx[1]);
if (dirty & /*$prop*/ 4) set_data_dev(t8, /*$prop*/ ctx[2]);
}, },
i: noop, i: noop,
o: noop, o: noop,
@ -76,12 +89,17 @@ function create_fragment(ctx) {
return block; return block;
} }
let moduleLiveBinding;
const moduleContantProps = 4;
let moduleLet;
const moduleConst = 2;
let shadowedByModule;
const priv = "priv"; const priv = "priv";
function instance($$self, $$props, $$invalidate) { function instance($$self, $$props, $$invalidate) {
let $prop, let $prop,
$$unsubscribe_prop = noop, $$unsubscribe_prop = noop,
$$subscribe_prop = () => ($$unsubscribe_prop(), $$unsubscribe_prop = subscribe(prop, $$value => $$invalidate(1, $prop = $$value)), prop); $$subscribe_prop = () => ($$unsubscribe_prop(), $$unsubscribe_prop = subscribe(prop, $$value => $$invalidate(2, $prop = $$value)), prop);
$$self.$$.on_destroy.push(() => $$unsubscribe_prop()); $$self.$$.on_destroy.push(() => $$unsubscribe_prop());
let { prop } = $$props; let { prop } = $$props;
@ -89,6 +107,7 @@ function instance($$self, $$props, $$invalidate) {
$$subscribe_prop(); $$subscribe_prop();
let { alias: realName } = $$props; let { alias: realName } = $$props;
let local; let local;
let shadowedByModule;
const writable_props = ["prop", "alias"]; const writable_props = ["prop", "alias"];
Object.keys($$props).forEach(key => { Object.keys($$props).forEach(key => {
@ -96,27 +115,47 @@ function instance($$self, $$props, $$invalidate) {
}); });
$$self.$set = $$props => { $$self.$set = $$props => {
if ("prop" in $$props) $$subscribe_prop($$invalidate(3, prop = $$props.prop)); if ("prop" in $$props) $$subscribe_prop($$invalidate(0, prop = $$props.prop));
if ("alias" in $$props) $$invalidate(0, realName = $$props.alias); if ("alias" in $$props) $$invalidate(1, realName = $$props.alias);
}; };
$$self.$capture_state = () => ({ prop, realName, local, $prop }); $$self.$capture_state = () => ({
moduleLiveBinding,
moduleContantProps,
moduleLet,
moduleConst,
shadowedByModule,
prop,
realName,
local,
priv,
shadowedByModule,
computed,
$prop
});
$$self.$inject_state = $$props => { $$self.$inject_state = $$props => {
if ("prop" in $$props) $$subscribe_prop($$invalidate(3, prop = $$props.prop)); if ("prop" in $$props) $$subscribe_prop($$invalidate(0, prop = $$props.prop));
if ("realName" in $$props) $$invalidate(0, realName = $$props.realName); if ("realName" in $$props) $$invalidate(1, realName = $$props.realName);
if ("local" in $$props) $$invalidate(2, local = $$props.local); if ("local" in $$props) $$invalidate(3, local = $$props.local);
if ("shadowedByModule" in $$props) $$invalidate(4, shadowedByModule = $$props.shadowedByModule);
if ("computed" in $$props) computed = $$props.computed;
}; };
let computed; let computed;
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
$: computed = local * 2; $: computed = local * 2;
return [realName, $prop, local, prop]; return [prop, realName, $prop, local, shadowedByModule];
} }
class Component extends SvelteComponentDev { class Component extends SvelteComponentDev {
constructor(options) { constructor(options) {
super(options); super(options);
init(this, options, instance, create_fragment, safe_not_equal, { prop: 3, alias: 0 }); init(this, options, instance, create_fragment, safe_not_equal, { prop: 0, alias: 1 });
dispatch_dev("SvelteRegisterComponent", { dispatch_dev("SvelteRegisterComponent", {
component: this, component: this,
@ -128,11 +167,11 @@ class Component extends SvelteComponentDev {
const { ctx } = this.$$; const { ctx } = this.$$;
const props = options.props || ({}); const props = options.props || ({});
if (/*prop*/ ctx[3] === undefined && !("prop" in props)) { if (/*prop*/ ctx[0] === undefined && !("prop" in props)) {
console.warn("<Component> was created without expected prop 'prop'"); console.warn("<Component> was created without expected prop 'prop'");
} }
if (/*realName*/ ctx[0] === undefined && !("alias" in props)) { if (/*realName*/ ctx[1] === undefined && !("alias" in props)) {
console.warn("<Component> was created without expected prop 'alias'"); console.warn("<Component> was created without expected prop 'alias'");
} }
} }
@ -155,3 +194,4 @@ class Component extends SvelteComponentDev {
} }
export default Component; export default Component;
export { moduleLiveBinding, moduleContantProps };

@ -1,3 +1,10 @@
<script context="module">
export let moduleLiveBinding;
export const moduleContantProps = 4;
let moduleLet;
const moduleConst = 2;
let shadowedByModule;
</script>
<script> <script>
export let prop; export let prop;
@ -9,6 +16,8 @@
const priv = 'priv'; const priv = 'priv';
$: computed = local * 2; $: computed = local * 2;
let shadowedByModule;
</script> </script>
<!-- NOTE $prop ensures store subscriptions are not part of captured state --> <!-- NOTE $prop ensures store subscriptions are not part of captured state -->
<p>{$prop} {realName} {local} {priv}</p> <p>{prop} {realName} {local} {priv} {$prop} {shadowedByModule}</p>

@ -85,6 +85,10 @@ function instance($$self, $$props, $$invalidate) {
if ("name" in $$props) $$invalidate(0, name = $$props.name); if ("name" in $$props) $$invalidate(0, name = $$props.name);
}; };
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
return [name]; return [name];
} }

@ -192,6 +192,10 @@ function instance($$self, $$props, $$invalidate) {
if ("baz" in $$props) $$invalidate(3, baz = $$props.baz); if ("baz" in $$props) $$invalidate(3, baz = $$props.baz);
}; };
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
return [things, foo, bar, baz]; return [things, foo, bar, baz];
} }

@ -180,6 +180,10 @@ function instance($$self, $$props, $$invalidate) {
if ("foo" in $$props) $$invalidate(1, foo = $$props.foo); if ("foo" in $$props) $$invalidate(1, foo = $$props.foo);
}; };
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
return [things, foo]; return [things, foo];
} }

@ -47,7 +47,7 @@ function create_fragment(ctx) {
return block; return block;
} }
function instance($$self) { function instance($$self, $$props, $$invalidate) {
let obj = { x: 5 }; let obj = { x: 5 };
let kobzol = 5; let kobzol = 5;
$$self.$capture_state = () => ({ obj, kobzol }); $$self.$capture_state = () => ({ obj, kobzol });
@ -57,6 +57,10 @@ function instance($$self) {
if ("kobzol" in $$props) $$invalidate(1, kobzol = $$props.kobzol); if ("kobzol" in $$props) $$invalidate(1, kobzol = $$props.kobzol);
}; };
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
return [obj, kobzol]; return [obj, kobzol];
} }

@ -131,10 +131,16 @@ function create_fragment(ctx) {
return block; return block;
} }
function instance($$self, $$props, $$invalidate) {
$$self.$capture_state = noop;
$$self.$inject_state = noop;
return [];
}
class Component extends SvelteComponentDev { class Component extends SvelteComponentDev {
constructor(options) { constructor(options) {
super(options); super(options);
init(this, options, null, create_fragment, safe_not_equal, {}); init(this, options, instance, create_fragment, safe_not_equal, {});
dispatch_dev("SvelteRegisterComponent", { dispatch_dev("SvelteRegisterComponent", {
component: this, component: this,
@ -145,4 +151,4 @@ class Component extends SvelteComponentDev {
} }
} }
export default Component; export default Component;

@ -83,6 +83,10 @@ function instance($$self, $$props, $$invalidate) {
if ("bar" in $$props) $$invalidate(1, bar = $$props.bar); if ("bar" in $$props) $$invalidate(1, bar = $$props.bar);
}; };
if ($$props && "$$inject" in $$props) {
$$self.$inject_state($$props.$$inject);
}
$$self.$$.update = () => { $$self.$$.update = () => {
if ($$self.$$.dirty & /*foo*/ 1) { if ($$self.$$.dirty & /*foo*/ 1) {
$: $$invalidate(1, bar = foo * 2); $: $$invalidate(1, bar = foo * 2);

@ -34,7 +34,7 @@ function create_fragment(ctx) {
return block; return block;
} }
function instance($$self) { function instance($$self, $$props, $$invalidate) {
const guard = loop_guard(100); const guard = loop_guard(100);
while (true) { while (true) {
@ -63,11 +63,8 @@ function instance($$self) {
guard_4(); guard_4();
} while (true); } while (true);
$$self.$capture_state = () => ({}); $$self.$capture_state = () => ({ foo });
$$self.$inject_state = noop;
$$self.$inject_state = () => {
};
$: { $: {
const guard_3 = loop_guard(100); const guard_3 = loop_guard(100);
@ -104,4 +101,4 @@ class Component extends SvelteComponentDev {
} }
} }
export default Component; export default Component;
Loading…
Cancel
Save