UNPKG

@philpl/buble

Version:

The blazing fast, batteries-included ES2015 compiler

78 lines (65 loc) 2.13 kB
import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import removeTrailingComma from '../../utils/removeTrailingComma.js'; export default class FunctionExpression extends Node { initialise(transforms) { if (this.generator && transforms.generator) { CompileError.missingTransform("generators", "generator", this); } if (this.async && transforms.asyncAwait) { CompileError.missingTransform("async functions", "asyncAwait", this); } this.body.createScope(); if (this.id) { // function expression IDs belong to the child scope... this.body.scope.addDeclaration(this.id, 'function'); } super.initialise(transforms); const parent = this.parent; let methodName; if ( transforms.conciseMethodProperty && parent.type === 'Property' && parent.kind === 'init' && parent.method && parent.key.type === 'Identifier' ) { // object literal concise method methodName = parent.key.name; } else if ( transforms.classes && parent.type === 'MethodDefinition' && parent.kind === 'method' && parent.key.type === 'Identifier' ) { // method definition in a class methodName = parent.key.name; } else if (this.id && this.id.type === 'Identifier') { // naked function expression methodName = this.id.alias || this.id.name; } if (methodName) { for (const param of this.params) { if (param.type === 'Identifier' && methodName === param.name) { // workaround for Safari 9/WebKit bug: // https://gitlab.com/Rich-Harris/buble/issues/154 // change parameter name when same as method name const scope = this.body.scope; const declaration = scope.declarations[methodName]; const alias = scope.createIdentifier(methodName); param.alias = alias; for (const identifier of declaration.instances) { identifier.alias = alias; } break; } } } } transpile(code, transforms) { super.transpile(code, transforms); if (transforms.trailingFunctionCommas && this.params.length) { removeTrailingComma(code, this.params[this.params.length - 1].end); } } }