|
|
|
@ -1,5 +1,5 @@
|
|
|
|
import { x } from 'code-red';
|
|
|
|
import { x } from 'code-red';
|
|
|
|
import { Node, Identifier, Expression, PrivateIdentifier } from 'estree';
|
|
|
|
import { Node, Identifier, Expression, PrivateIdentifier, Pattern } from 'estree';
|
|
|
|
import { walk } from 'estree-walker';
|
|
|
|
import { walk } from 'estree-walker';
|
|
|
|
import is_reference, { NodeWithPropertyDefinition } from 'is-reference';
|
|
|
|
import is_reference, { NodeWithPropertyDefinition } from 'is-reference';
|
|
|
|
import { clone } from '../../../utils/clone';
|
|
|
|
import { clone } from '../../../utils/clone';
|
|
|
|
@ -30,15 +30,17 @@ export function unpack_destructuring({
|
|
|
|
default_modifier = (node) => node,
|
|
|
|
default_modifier = (node) => node,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element = false
|
|
|
|
}: {
|
|
|
|
}: {
|
|
|
|
contexts: Context[];
|
|
|
|
contexts: Context[];
|
|
|
|
node: Node;
|
|
|
|
node: Pattern;
|
|
|
|
modifier?: DestructuredVariable['modifier'];
|
|
|
|
modifier?: DestructuredVariable['modifier'];
|
|
|
|
default_modifier?: DestructuredVariable['default_modifier'];
|
|
|
|
default_modifier?: DestructuredVariable['default_modifier'];
|
|
|
|
scope: TemplateScope;
|
|
|
|
scope: TemplateScope;
|
|
|
|
component: Component;
|
|
|
|
component: Component;
|
|
|
|
context_rest_properties: Map<string, Node>;
|
|
|
|
context_rest_properties: Map<string, Node>;
|
|
|
|
|
|
|
|
in_rest_element?: boolean;
|
|
|
|
}) {
|
|
|
|
}) {
|
|
|
|
if (!node) return;
|
|
|
|
if (!node) return;
|
|
|
|
|
|
|
|
|
|
|
|
@ -49,28 +51,26 @@ export function unpack_destructuring({
|
|
|
|
modifier,
|
|
|
|
modifier,
|
|
|
|
default_modifier
|
|
|
|
default_modifier
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else if (node.type === 'RestElement') {
|
|
|
|
|
|
|
|
contexts.push({
|
|
|
|
if (in_rest_element) {
|
|
|
|
type: 'DestructuredVariable',
|
|
|
|
context_rest_properties.set(node.name, node);
|
|
|
|
key: node.argument as Identifier,
|
|
|
|
}
|
|
|
|
modifier,
|
|
|
|
|
|
|
|
default_modifier
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
context_rest_properties.set((node.argument as Identifier).name, node);
|
|
|
|
|
|
|
|
} else if (node.type === 'ArrayPattern') {
|
|
|
|
} else if (node.type === 'ArrayPattern') {
|
|
|
|
node.elements.forEach((element, i) => {
|
|
|
|
node.elements.forEach((element: Pattern | null, i: number) => {
|
|
|
|
if (element && element.type === 'RestElement') {
|
|
|
|
if (!element) {
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
} else if (element.type === 'RestElement') {
|
|
|
|
unpack_destructuring({
|
|
|
|
unpack_destructuring({
|
|
|
|
contexts,
|
|
|
|
contexts,
|
|
|
|
node: element,
|
|
|
|
node: element.argument,
|
|
|
|
modifier: (node) => x`${modifier(node)}.slice(${i})` as Node,
|
|
|
|
modifier: (node) => x`${modifier(node)}.slice(${i})` as Node,
|
|
|
|
default_modifier,
|
|
|
|
default_modifier,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element: true
|
|
|
|
});
|
|
|
|
});
|
|
|
|
context_rest_properties.set((element.argument as Identifier).name, element);
|
|
|
|
} else if (element.type === 'AssignmentPattern') {
|
|
|
|
} else if (element && element.type === 'AssignmentPattern') {
|
|
|
|
|
|
|
|
const n = contexts.length;
|
|
|
|
const n = contexts.length;
|
|
|
|
mark_referenced(element.right, scope, component);
|
|
|
|
mark_referenced(element.right, scope, component);
|
|
|
|
|
|
|
|
|
|
|
|
@ -87,7 +87,8 @@ export function unpack_destructuring({
|
|
|
|
)}` as Node,
|
|
|
|
)}` as Node,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
unpack_destructuring({
|
|
|
|
unpack_destructuring({
|
|
|
|
@ -97,7 +98,8 @@ export function unpack_destructuring({
|
|
|
|
default_modifier,
|
|
|
|
default_modifier,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
@ -116,9 +118,9 @@ export function unpack_destructuring({
|
|
|
|
default_modifier,
|
|
|
|
default_modifier,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element: true
|
|
|
|
});
|
|
|
|
});
|
|
|
|
context_rest_properties.set((property.argument as Identifier).name, property);
|
|
|
|
|
|
|
|
} else if (property.type === 'Property') {
|
|
|
|
} else if (property.type === 'Property') {
|
|
|
|
const key = property.key;
|
|
|
|
const key = property.key;
|
|
|
|
const value = property.value;
|
|
|
|
const value = property.value;
|
|
|
|
@ -168,7 +170,8 @@ export function unpack_destructuring({
|
|
|
|
)}` as Node,
|
|
|
|
)}` as Node,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
// e.g. { property } or { property: newName }
|
|
|
|
// e.g. { property } or { property: newName }
|
|
|
|
@ -179,7 +182,8 @@ export function unpack_destructuring({
|
|
|
|
default_modifier,
|
|
|
|
default_modifier,
|
|
|
|
scope,
|
|
|
|
scope,
|
|
|
|
component,
|
|
|
|
component,
|
|
|
|
context_rest_properties
|
|
|
|
context_rest_properties,
|
|
|
|
|
|
|
|
in_rest_element
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|