export default function is_reference (node, parent) {
if (node.type === 'MemberExpression') {
return !node.computed && is_reference(node.object, node);
}
if (node.type === 'Identifier') {
if (!parent) return true;
switch (parent.type) {
case 'MemberExpression': return parent.computed || node === parent.object;
case 'MethodDefinition': return parent.computed;
case 'PropertyDefinition': return parent.computed || node === parent.value;
case 'Property': return parent.computed || node === parent.value;
case 'ExportSpecifier':
case 'ImportSpecifier': return node === parent.local;
case 'LabeledStatement':
case 'BreakStatement':
case 'ContinueStatement': return false;
default: return true;
}
}
return false;
}