mirror of https://github.com/sveltejs/svelte
parent
c743e72a1e
commit
e5615f30f9
@ -0,0 +1,50 @@
|
|||||||
|
import { x } from 'code-red';
|
||||||
|
import { Node, Identifier, RestElement, Property } from 'estree';
|
||||||
|
|
||||||
|
export interface Context {
|
||||||
|
key: Identifier;
|
||||||
|
name?: string;
|
||||||
|
modifier: (node: Node) => Node;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function unpack_destructuring(contexts: Context[], node: Node, modifier: (node: Node) => Node) {
|
||||||
|
if (!node) return;
|
||||||
|
|
||||||
|
if (node.type === 'Identifier') {
|
||||||
|
contexts.push({
|
||||||
|
key: node as Identifier,
|
||||||
|
modifier
|
||||||
|
});
|
||||||
|
} else if (node.type === 'RestElement') {
|
||||||
|
contexts.push({
|
||||||
|
key: node.argument as Identifier,
|
||||||
|
modifier
|
||||||
|
});
|
||||||
|
} else if (node.type === 'ArrayPattern') {
|
||||||
|
node.elements.forEach((element, i) => {
|
||||||
|
if (element && (element as any).type === 'RestElement') {
|
||||||
|
unpack_destructuring(contexts, element, node => x`${modifier(node)}.slice(${i})` as Node);
|
||||||
|
} else {
|
||||||
|
unpack_destructuring(contexts, element, node => x`${modifier(node)}[${i}]` as Node);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (node.type === 'ObjectPattern') {
|
||||||
|
const used_properties = [];
|
||||||
|
|
||||||
|
node.properties.forEach((property) => {
|
||||||
|
const props: (RestElement | Property) = (property as any);
|
||||||
|
|
||||||
|
if (props.type === 'RestElement') {
|
||||||
|
unpack_destructuring(
|
||||||
|
contexts,
|
||||||
|
props.argument,
|
||||||
|
node => x`@object_without_properties(${modifier(node)}, [${used_properties}])` as Node
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
used_properties.push(x`"${(property.key as Identifier).name}"`);
|
||||||
|
|
||||||
|
unpack_destructuring(contexts, property.value, node => x`${modifier(node)}.${(property.key as Identifier).name}` as Node);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -1,35 +0,0 @@
|
|||||||
import { Pattern, Identifier, RestElement } from "estree";
|
|
||||||
import { Node } from "acorn";
|
|
||||||
|
|
||||||
export default function traverse_destructure_pattern(
|
|
||||||
node: Pattern,
|
|
||||||
callback: (node: Identifier, parent: Node, key: string | number) => void
|
|
||||||
) {
|
|
||||||
function traverse(node: Pattern, parent, key) {
|
|
||||||
switch (node.type) {
|
|
||||||
case "Identifier":
|
|
||||||
return callback(node, parent, key);
|
|
||||||
case "ArrayPattern":
|
|
||||||
for (let i = 0; i < node.elements.length; i++) {
|
|
||||||
const element = node.elements[i];
|
|
||||||
traverse(element, node.elements, i);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "ObjectPattern":
|
|
||||||
for (let i = 0; i < node.properties.length; i++) {
|
|
||||||
const property = node.properties[i];
|
|
||||||
if (property.type === "Property") {
|
|
||||||
traverse(property.value, property, "value");
|
|
||||||
} else {
|
|
||||||
traverse((property as any) as RestElement, node.properties, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "RestElement":
|
|
||||||
return traverse(node.argument, node, 'argument');
|
|
||||||
case "AssignmentPattern":
|
|
||||||
return traverse(node.left, node, 'left');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
traverse(node, null, null);
|
|
||||||
}
|
|
Loading…
Reference in new issue