pull/8386/head
Simon H 4 years ago committed by GitHub
parent 3eb16eba24
commit 8b9db8226f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -135,21 +135,21 @@ export function unpack_destructuring({
let new_modifier: (node: Node) => Node; let new_modifier: (node: Node) => Node;
if (property.computed) { if (property.computed) {
// e.g { [computedProperty]: ... } // e.g { [computedProperty]: ... }
const property_name = `computed_property_${number_of_computed_props.n}`; const property_name = `computed_property_${number_of_computed_props.n}`;
number_of_computed_props.n += 1; number_of_computed_props.n += 1;
contexts.push({ contexts.push({
type: 'ComputedProperty', type: 'ComputedProperty',
property_name, property_name,
key key
}); });
new_modifier = (node) => x`${modifier(node)}[${property_name}]`; new_modifier = (node) => x`${modifier(node)}[${property_name}]`;
used_properties.push(x`${property_name}`); used_properties.push(x`${property_name}`);
} else if (key.type === 'Identifier') { } else if (key.type === 'Identifier') {
// e.g. { someProperty: ... } // e.g. { someProperty: ... }
const property_name = key.name; const property_name = key.name;
new_modifier = (node) => x`${modifier(node)}.${property_name}`; new_modifier = (node) => x`${modifier(node)}.${property_name}`;
used_properties.push(x`"${property_name}"`); used_properties.push(x`"${property_name}"`);
} else if (key.type === 'Literal') { } else if (key.type === 'Literal') {

@ -99,11 +99,11 @@ class AwaitBlockBranch extends Wrapper {
render_get_context() { render_get_context() {
const props = this.is_destructured ? this.value_contexts.map(prop => { const props = this.is_destructured ? this.value_contexts.map(prop => {
const to_ctx = name => this.renderer.reference(name);
if (prop.type === 'ComputedProperty') { if (prop.type === 'ComputedProperty') {
const expression = new Expression(this.renderer.component, this.node, this.has_consts(this.node) ? this.node.scope : null, prop.key); const expression = new Expression(this.renderer.component, this.node, this.has_consts(this.node) ? this.node.scope : null, prop.key);
return b`const ${prop.property_name} = ${expression.manipulate(this.block, '#ctx')};`; return b`const ${prop.property_name} = ${expression.manipulate(this.block, '#ctx')};`;
} else { } else {
const to_ctx = name => this.renderer.reference(name);
return b`#ctx[${this.block.renderer.context_lookup.get(prop.key.name).index}] = ${prop.default_modifier(prop.modifier(x`#ctx[${this.value_index}]`), to_ctx)};`; return b`#ctx[${this.block.renderer.context_lookup.get(prop.key.name).index}] = ${prop.default_modifier(prop.modifier(x`#ctx[${this.value_index}]`), to_ctx)};`;
} }
}) : null; }) : null;

@ -365,13 +365,12 @@ export default class EachBlockWrapper extends Wrapper {
} }
this.context_props = this.node.contexts.map(prop => { this.context_props = this.node.contexts.map(prop => {
const to_ctx = (name: string) => renderer.context_lookup.has(name) ? x`child_ctx[${renderer.context_lookup.get(name).index}]` : { type: 'Identifier', name } as Node;
if (prop.type === 'DestructuredVariable') { if (prop.type === 'DestructuredVariable') {
const to_ctx = (name: string) => renderer.context_lookup.has(name) ? x`child_ctx[${renderer.context_lookup.get(name).index}]` : { type: 'Identifier', name } as Node;
return b`child_ctx[${renderer.context_lookup.get(prop.key.name).index}] = ${prop.default_modifier(prop.modifier(x`list[i]`), to_ctx)};`; return b`child_ctx[${renderer.context_lookup.get(prop.key.name).index}] = ${prop.default_modifier(prop.modifier(x`list[i]`), to_ctx)};`;
} else { } else {
const expression = new Expression(this.renderer.component, this.node, this.node.scope, prop.key); const expression = new Expression(this.renderer.component, this.node, this.node.scope, prop.key);
return b`const ${prop.property_name} = ${expression.manipulate(block, 'child_ctx')};`; return b`const ${prop.property_name} = ${expression.manipulate(block, 'child_ctx')};`;
} }
}); });

@ -5,29 +5,29 @@ import Renderer from '../../Renderer';
import Expression from '../../../nodes/shared/Expression'; import Expression from '../../../nodes/shared/Expression';
export function add_const_tags(block: Block, const_tags: ConstTag[], ctx: string) { export function add_const_tags(block: Block, const_tags: ConstTag[], ctx: string) {
const const_tags_props = []; const const_tags_props = [];
const_tags.forEach((const_tag, i) => { const_tags.forEach((const_tag, i) => {
const name = `#constants_${i}`; const name = `#constants_${i}`;
const_tags_props.push(b`const ${name} = ${const_tag.expression.manipulate(block, ctx)}`); const_tags_props.push(b`const ${name} = ${const_tag.expression.manipulate(block, ctx)}`);
const to_ctx = (name: string) => block.renderer.context_lookup.has(name) ? x`${ctx}[${block.renderer.context_lookup.get(name).index}]` : { type: 'Identifier', name } as Node; const to_ctx = (name: string) => block.renderer.context_lookup.has(name) ? x`${ctx}[${block.renderer.context_lookup.get(name).index}]` : { type: 'Identifier', name } as Node;
const_tag.contexts.forEach(context => { const_tag.contexts.forEach(context => {
if (context.type === 'DestructuredVariable') { if (context.type === 'DestructuredVariable') {
const_tags_props.push(b`${ctx}[${block.renderer.context_lookup.get(context.key.name).index}] = ${context.default_modifier(context.modifier({ type: 'Identifier', name }), to_ctx)}`); const_tags_props.push(b`${ctx}[${block.renderer.context_lookup.get(context.key.name).index}] = ${context.default_modifier(context.modifier({ type: 'Identifier', name }), to_ctx)}`);
} else { } else {
const expression = new Expression(block.renderer.component, const_tag, const_tag.scope, context.key); const expression = new Expression(block.renderer.component, const_tag, const_tag.scope, context.key);
const_tags_props.push(b`const ${context.property_name} = ${expression.manipulate(block, ctx)}`); const_tags_props.push(b`const ${context.property_name} = ${expression.manipulate(block, ctx)}`);
} }
}); });
}); });
return const_tags_props; return const_tags_props;
} }
export function add_const_tags_context(renderer: Renderer, const_tags: ConstTag[]) { export function add_const_tags_context(renderer: Renderer, const_tags: ConstTag[]) {
const_tags.forEach(const_tag => { const_tags.forEach(const_tag => {
const_tag.contexts.forEach(context => { const_tag.contexts.forEach(context => {
if (context.type !== 'DestructuredVariable') return; if (context.type !== 'DestructuredVariable') return;
renderer.add_to_context(context.key.name, true); renderer.add_to_context(context.key.name, true);
}); });
}); });
} }

@ -7,7 +7,7 @@ export default {
` `
<p>propA: 3</p> <p>propA: 3</p>
<p>propB: 7</p> <p>propB: 7</p>
<p>num: 3</p> <p>num: 3</p>
<p>rest: {"prop3":{"prop9":9,"prop10":10}}</p> <p>rest: {"prop3":{"prop9":9,"prop10":10}}</p>
<p>propZ: 5</p> <p>propZ: 5</p>
<p>propY: 6</p> <p>propY: 6</p>
@ -15,13 +15,13 @@ export default {
` `
); );
await (component.object = Promise.resolve({ prop1: 'one', prop2: 'two', prop3: { prop7: 'seven' }, prop4: { prop10: 'ten' }})); await (component.object = Promise.resolve({ prop1: 'one', prop2: 'two', prop3: { prop7: 'seven' }, prop4: { prop10: 'ten' }}));
assert.htmlEqual( assert.htmlEqual(
target.innerHTML, target.innerHTML,
` `
<p>propA: seven</p> <p>propA: seven</p>
<p>propB: ten</p> <p>propB: ten</p>
<p>num: 5</p> <p>num: 5</p>
<p>rest: {"prop1":"one","prop2":"two"}</p> <p>rest: {"prop1":"one","prop2":"two"}</p>
<p>propZ: 5</p> <p>propZ: 5</p>
<p>propY: 6</p> <p>propY: 6</p>

@ -1,15 +1,15 @@
<script> <script>
export let object = Promise.resolve({ prop1: { prop4: 2, prop5: 3 }, prop2: { prop6: 5, prop7: 6, prop8: 7 }, prop3: { prop9: 9, prop10: 10 } }); export let object = Promise.resolve({ prop1: { prop4: 2, prop5: 3 }, prop2: { prop6: 5, prop7: 6, prop8: 7 }, prop3: { prop9: 9, prop10: 10 } });
const objectReject = Promise.reject({ propZ: 5, propY: 6, propX: 7, propW: 8 }); const objectReject = Promise.reject({ propZ: 5, propY: 6, propX: 7, propW: 8 });
let num = 1; let num = 1;
const prop = 'prop'; const prop = 'prop';
</script> </script>
{#await object then { [`prop${num++}`]: { [`prop${num + 3}`]: propA }, [`prop${num++}`]: { [`prop${num + 5}`]: propB }, ...rest }} {#await object then { [`prop${num++}`]: { [`prop${num + 3}`]: propA }, [`prop${num++}`]: { [`prop${num + 5}`]: propB }, ...rest }}
<p>propA: {propA}</p> <p>propA: {propA}</p>
<p>propB: {propB}</p> <p>propB: {propB}</p>
<p>num: {num}</p> <p>num: {num}</p>
<p>rest: {JSON.stringify(rest)}</p> <p>rest: {JSON.stringify(rest)}</p>
{/await} {/await}

Loading…
Cancel
Save