import type { NodePath } from "@babel/traverse"; import * as t from "@babel/types"; export default function bindifyDecorators( decorators: Array, ): Array { for (const decoratorPath of decorators) { const decorator = decoratorPath.node; const expression = decorator.expression; if (!t.isMemberExpression(expression)) continue; const temp = decoratorPath.scope.maybeGenerateMemoised(expression.object); let ref; const nodes = []; if (temp) { ref = temp; nodes.push(t.assignmentExpression("=", temp, expression.object)); } else { ref = expression.object; } nodes.push( t.callExpression( t.memberExpression( t.memberExpression(ref, expression.property, expression.computed), t.identifier("bind"), ), [ref], ), ); if (nodes.length === 1) { decorator.expression = nodes[0]; } else { decorator.expression = t.sequenceExpression(nodes); } } }