|
import Node from './shared/Node.js'; |
|
import { walk } from 'estree-walker'; |
|
import compiler_errors from '../compiler_errors.js'; |
|
|
|
const applicable = new Set(['Identifier', 'ObjectExpression', 'ArrayExpression', 'Property']); |
|
|
|
|
|
export default class Let extends Node { |
|
|
|
name; |
|
|
|
|
|
value; |
|
|
|
|
|
names = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(component, parent, scope, info) { |
|
super(component, parent, scope, info); |
|
this.name = { type: 'Identifier', name: info.name }; |
|
const { names } = this; |
|
if (info.expression) { |
|
this.value = info.expression; |
|
walk(info.expression, { |
|
|
|
enter(node) { |
|
if (!applicable.has(node.type)) { |
|
return component.error( (node), compiler_errors.invalid_let); |
|
} |
|
if (node.type === 'Identifier') { |
|
names.push( (node).name); |
|
} |
|
|
|
if (node.type === 'ArrayExpression') { |
|
node.type = 'ArrayPattern'; |
|
} |
|
if (node.type === 'ObjectExpression') { |
|
node.type = 'ObjectPattern'; |
|
} |
|
} |
|
}); |
|
} else { |
|
names.push(this.name.name); |
|
} |
|
} |
|
} |
|
|