Lint and format src/compiler/compile/nodes/shared/get_const_tags.js

pull/8569/head
Simon Holthausen 3 years ago
parent c8c5f2af48
commit 58a4034ade

@ -11,25 +11,30 @@ import compiler_errors from '../../compiler_errors.js';
* @returns {[import('../../../interfaces.js').ConstTag[], never[]]} * @returns {[import('../../../interfaces.js').ConstTag[], never[]]}
*/ */
export default function get_const_tags(children, component, node, parent) { export default function get_const_tags(children, component, node, parent) {
/** @type {ConstTagType[]} */
const const_tags = [];
/** @type {ConstTagType[]} */ /** @type {Array<Exclude<import('../../../interfaces.js').TemplateNode, ConstTagType>>} */
const const_tags = []; const others = [];
for (const child of children) {
/** @type {Array<Exclude<import('../../../interfaces.js').TemplateNode, ConstTagType>>} */ if (child.type === 'ConstTag') {
const others = []; const_tags.push(/** @type {ConstTagType} */ (child));
for (const child of children) { } else {
if (child.type === 'ConstTag') { others.push(child);
const_tags.push(/** @type {ConstTagType} */ (child)); }
} }
else { const consts_nodes = const_tags.map(
others.push(child); /** @param {any} tag */ (tag) => new ConstTag(component, node, node.scope, tag)
} );
} const sorted_consts_nodes = sort_consts_nodes(consts_nodes, component);
const consts_nodes = const_tags.map(/** @param {any} tag */ (tag) => new ConstTag(component, node, node.scope, tag)); sorted_consts_nodes.forEach(/** @param {any} node */ (node) => node.parse_expression());
const sorted_consts_nodes = sort_consts_nodes(consts_nodes, component); const children_nodes = map_children(component, parent, node.scope, others);
sorted_consts_nodes.forEach(/** @param {any} node */ (node) => node.parse_expression()); return [
const children_nodes = map_children(component, parent, node.scope, others); sorted_consts_nodes,
return [sorted_consts_nodes, /** @type {Array<Exclude<import('../interfaces.js').INode, import('../../../interfaces.js').ConstTag>>} */ (children_nodes)]; /** @type {Array<Exclude<import('../interfaces.js').INode, import('../../../interfaces.js').ConstTag>>} */ (
children_nodes
)
];
} }
/** /**
@ -37,64 +42,74 @@ export default function get_const_tags(children, component, node, parent) {
* @param {import('../../Component.js').default} component * @param {import('../../Component.js').default} component
*/ */
function sort_consts_nodes(consts_nodes, component) { function sort_consts_nodes(consts_nodes, component) {
/** @type {ConstNode[]} */
const sorted_consts_nodes = [];
/** @type {ConstNode[]} */ /** @type {ConstNode[]} */
const sorted_consts_nodes = []; const unsorted_consts_nodes = consts_nodes.map(
/** @param {any} node */ (node) => {
/** @type {ConstNode[]} */ return {
const unsorted_consts_nodes = consts_nodes.map(/** @param {any} node */ (node) => { assignees: node.assignees,
return { dependencies: node.dependencies,
assignees: node.assignees, node
dependencies: node.dependencies, };
node }
}; );
}); const lookup = new Map();
const lookup = new Map(); unsorted_consts_nodes.forEach(
unsorted_consts_nodes.forEach(/** @param {any} node */ (node) => { /** @param {any} node */ (node) => {
node.assignees.forEach(/** @param {any} name */ (name) => { node.assignees.forEach(
if (!lookup.has(name)) { /** @param {any} name */ (name) => {
lookup.set(name, []); if (!lookup.has(name)) {
} lookup.set(name, []);
lookup.get(name).push(node); }
}); lookup.get(name).push(node);
}); }
const cycle = check_graph_for_cycles(unsorted_consts_nodes.reduce(/** );
* @param {any} acc }
* @param {any} node );
*/ (acc, node) => { const cycle = check_graph_for_cycles(
node.assignees.forEach(/** @param {any} v */ (v) => { unsorted_consts_nodes.reduce(
node.dependencies.forEach(/** @param {any} w */ (w) => { /**
if (!node.assignees.has(w)) { * @param {any} acc
acc.push([v, w]); * @param {any} node
} */ (acc, node) => {
}); node.assignees.forEach(
}); /** @param {any} v */ (v) => {
return acc; node.dependencies.forEach(
}, [])); /** @param {any} w */ (w) => {
if (cycle && cycle.length) { if (!node.assignees.has(w)) {
const nodeList = lookup.get(cycle[0]); acc.push([v, w]);
const node = nodeList[0]; }
component.error(node.node, compiler_errors.cyclical_const_tags(cycle)); }
} );
}
);
return acc;
},
[]
)
);
if (cycle && cycle.length) {
const nodeList = lookup.get(cycle[0]);
const node = nodeList[0];
component.error(node.node, compiler_errors.cyclical_const_tags(cycle));
}
/** @param {ConstNode} node */ /** @param {ConstNode} node */
const add_node = (node) => { const add_node = (node) => {
if (sorted_consts_nodes.includes(node)) if (sorted_consts_nodes.includes(node)) return;
return; node.dependencies.forEach(
node.dependencies.forEach(/** @param {any} name */ (name) => { /** @param {any} name */ (name) => {
if (node.assignees.has(name)) if (node.assignees.has(name)) return;
return; const earlier_nodes = lookup.get(name);
const earlier_nodes = lookup.get(name); if (earlier_nodes) {
if (earlier_nodes) { earlier_nodes.forEach(add_node);
earlier_nodes.forEach(add_node); }
} }
}); );
sorted_consts_nodes.push(node); sorted_consts_nodes.push(node);
}; };
unsorted_consts_nodes.forEach(add_node); unsorted_consts_nodes.forEach(add_node);
return sorted_consts_nodes.map(/** @param {any} node */ (node) => node.node); return sorted_consts_nodes.map(/** @param {any} node */ (node) => node.node);
} }

Loading…
Cancel
Save