From 2ce451f29d3535e6d91294ec6d9b071fdcab9d59 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Tue, 8 Oct 2019 22:02:07 -0400 Subject: [PATCH] various --- src/compiler/compile/Component.ts | 18 ++++++++++++------ src/compiler/compile/render_dom/index.ts | 2 +- .../compile/render_dom/wrappers/IfBlock.ts | 2 +- .../render_ssr/handlers/InlineComponent.ts | 2 +- test/css/index.js | 18 ++++++++++++++++-- 5 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index 77e01f8e79..292657095d 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -294,7 +294,7 @@ export default class Component { enter: (node, parent, key) => { if (node.type === 'Identifier' && !('name' in node)) { console.log(node); - throw new Error('wtf'); + throw new Error('this should never happen'); // TODO remove once satisfied } if (node.type === 'Identifier') { @@ -328,6 +328,7 @@ export default class Component { else { console.log(node); + throw new Error('this should never happen'); // TODO remove once satisfied } } } @@ -1246,15 +1247,20 @@ export default class Component { qualify(name) { if (name === `$$props`) return x`#ctx.$$props`; - const variable = this.var_lookup.get(name); + let [head, ...tail] = name.split('.'); - if (!variable) return name; + const variable = this.var_lookup.get(head); - this.add_reference(name); // TODO we can probably remove most other occurrences of this + if (variable) { + this.add_reference(name); // TODO we can probably remove most other occurrences of this - if (variable.hoistable) return name; + if (!variable.hoistable) { + tail.unshift(head); + head = '#ctx'; + } + } - return x`#ctx.${name}`; + return [head, ...tail].reduce((lhs, rhs) => x`${lhs}.${rhs}`); } warn_if_undefined(name: string, node, template_scope: TemplateScope) { diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 78b2ae75c8..4269a929b9 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -442,7 +442,7 @@ export default function dom( constructor(options) { super(); - ${css.code && `this.shadowRoot.innerHTML = \`\`;`} + ${css.code && b`this.shadowRoot.innerHTML = \`\`;`} @init(this, { target: this.shadowRoot }, ${definition}, create_fragment, ${not_equal}, ${prop_names}); diff --git a/src/compiler/compile/render_dom/wrappers/IfBlock.ts b/src/compiler/compile/render_dom/wrappers/IfBlock.ts index f521c9399e..e1d93d1a5d 100644 --- a/src/compiler/compile/render_dom/wrappers/IfBlock.ts +++ b/src/compiler/compile/render_dom/wrappers/IfBlock.ts @@ -374,7 +374,7 @@ export default class IfBlockWrapper extends Wrapper { : b` function ${select_block_type}(#changed, #ctx) { ${this.branches.map(({ condition, snippet }, i) => condition - ? b`if (${snippet || condition}) return ${String(i)};` + ? b`if (${snippet || condition}) return ${i};` : b`return ${i};`)} ${!has_else && b`return -1;`} } diff --git a/src/compiler/compile/render_ssr/handlers/InlineComponent.ts b/src/compiler/compile/render_ssr/handlers/InlineComponent.ts index 9ef293de77..e9ebb189cb 100644 --- a/src/compiler/compile/render_ssr/handlers/InlineComponent.ts +++ b/src/compiler/compile/render_ssr/handlers/InlineComponent.ts @@ -63,7 +63,7 @@ export default function(node: InlineComponent, renderer: Renderer, options: Rend ? renderer.name : node.name === 'svelte:component' ? x`(${node.expression.node}) || @missing_component` - : node.name + : node.name.split('.').reduce(((lhs, rhs) => x`${lhs}.${rhs}`) as any) ); const slot_fns = []; diff --git a/test/css/index.js b/test/css/index.js index be2a10bef1..61e8a0c6cb 100644 --- a/test/css/index.js +++ b/test/css/index.js @@ -82,10 +82,24 @@ describe('css', () => { assert.equal(dom.css.code.replace(/svelte(-ref)?-[a-z0-9]+/g, (m, $1) => $1 ? m : 'svelte-xyz'), expected.css); + let ClientComponent; + let ServerComponent; + // we do this here, rather than in the expected.html !== null // block, to verify that valid code was generated - const ClientComponent = create(dom.js.code); - const ServerComponent = create(ssr.js.code); + try { + ClientComponent = create(dom.js.code); + } catch (err) { + console.log(dom.js.code); + throw err; + } + + try { + ServerComponent = create(ssr.js.code); + } catch (err) { + console.log(dom.js.code); + throw err; + } // verify that the right elements have scoping selectors if (expected.html !== null) {