mirror of https://github.com/sveltejs/svelte
40 lines
808 B
40 lines
808 B
import { Node, Identifier } from 'estree';
|
|
|
|
export default function flatten_reference(node: Node) {
|
|
const nodes = [];
|
|
const parts = [];
|
|
|
|
while (node.type === 'MemberExpression') {
|
|
nodes.unshift(node.property);
|
|
|
|
if (!node.computed) {
|
|
parts.unshift((node.property as Identifier).name);
|
|
} else {
|
|
const computed_property = to_string(node.property);
|
|
if (computed_property) {
|
|
parts.unshift(`[${computed_property}]`);
|
|
}
|
|
}
|
|
node = node.object;
|
|
}
|
|
|
|
const name = node.type === 'Identifier'
|
|
? node.name
|
|
: node.type === 'ThisExpression' ? 'this' : null;
|
|
|
|
nodes.unshift(node);
|
|
|
|
parts.unshift(name);
|
|
|
|
return { name, nodes, parts };
|
|
}
|
|
|
|
function to_string(node: Node) {
|
|
switch (node.type) {
|
|
case 'Literal':
|
|
return String(node.value);
|
|
case 'Identifier':
|
|
return node.name;
|
|
}
|
|
}
|