mirror of https://github.com/sveltejs/svelte
parent
f62903ca19
commit
f3e323fb1b
@ -1,52 +1,50 @@
|
||||
import { b, x } from 'code-red';
|
||||
import Wrapper from './Wrapper';
|
||||
import Renderer from '../../Renderer';
|
||||
import Block from '../../Block';
|
||||
import MustacheTag from '../../../nodes/MustacheTag';
|
||||
import RawMustacheTag from '../../../nodes/RawMustacheTag';
|
||||
import { Node } from 'estree';
|
||||
import Wrapper from './Wrapper.js';
|
||||
|
||||
/** @extends Wrapper */
|
||||
export default class Tag extends Wrapper {
|
||||
node: MustacheTag | RawMustacheTag;
|
||||
|
||||
constructor(
|
||||
renderer: Renderer,
|
||||
block: Block,
|
||||
parent: Wrapper,
|
||||
node: MustacheTag | RawMustacheTag
|
||||
) {
|
||||
super(renderer, block, parent, node);
|
||||
|
||||
/** @type {import('../../../nodes/MustacheTag.js').default | import('../../../nodes/RawMustacheTag.js').default} */
|
||||
node;
|
||||
|
||||
/**
|
||||
* @param {import('../../Renderer.js').default} renderer
|
||||
* @param {import('../../Block.js').default} block
|
||||
* @param {import('./Wrapper.js').default} parent
|
||||
* @param {import('../../../nodes/MustacheTag.js').default | import('../../../nodes/RawMustacheTag.js').default} node
|
||||
*/
|
||||
constructor(renderer, block, parent, node) {
|
||||
super(renderer, block, parent, node);
|
||||
block.add_dependencies(node.expression.dependencies);
|
||||
}
|
||||
|
||||
rename_this_method(block: Block, update: (value: Node) => Node | Node[]) {
|
||||
/**
|
||||
* @param {import('../../Block.js').default} block
|
||||
* @param {(value: import('estree').Node) => import('estree').Node | import('estree').Node[]} update
|
||||
*/
|
||||
rename_this_method(block, update) {
|
||||
const dependencies = this.node.expression.dynamic_dependencies();
|
||||
let snippet = this.node.expression.manipulate(block);
|
||||
|
||||
const value = this.node.should_cache && block.get_unique_name(`${this.var.name}_value`);
|
||||
const content = this.node.should_cache ? value : snippet;
|
||||
|
||||
snippet = x`${snippet} + ""`;
|
||||
|
||||
if (this.node.should_cache) block.add_variable(value, snippet); // TODO may need to coerce snippet to string
|
||||
|
||||
snippet = x `${snippet} + ""`;
|
||||
if (this.node.should_cache)
|
||||
block.add_variable(value, snippet); // TODO may need to coerce snippet to string
|
||||
if (dependencies.length > 0) {
|
||||
let condition = block.renderer.dirty(dependencies);
|
||||
|
||||
if (block.has_outros) {
|
||||
condition = x`!#current || ${condition}`;
|
||||
condition = x `!#current || ${condition}`;
|
||||
}
|
||||
|
||||
const update_cached_value = x`${value} !== (${value} = ${snippet})`;
|
||||
|
||||
const update_cached_value = x `${value} !== (${value} = ${snippet})`;
|
||||
if (this.node.should_cache) {
|
||||
condition = x`${condition} && ${update_cached_value}`;
|
||||
condition = x `${condition} && ${update_cached_value}`;
|
||||
}
|
||||
|
||||
block.chunks.update.push(b`if (${condition}) ${update(content as Node)}`);
|
||||
block.chunks.update.push(b `if (${condition}) ${update(/** @type {import('estree').Node} */ (content))}`);
|
||||
}
|
||||
|
||||
return { init: content };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in new issue