Fix array rest property not being picked up

pull/8555/head
Nguyen Tran 3 years ago
parent 0715e8baa8
commit 561c602e84

@ -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
}); });
} }
} }

Loading…
Cancel
Save