@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
42 lines (40 loc) • 1.56 kB
JavaScript
import { tsUtils } from '@neo-one/ts-utils';
import { InternalObjectProperty } from '../../constants';
import { Helper } from '../Helper';
export class FunctionLikeHelper extends Helper {
emit(sb, node, optionsIn) {
if (!tsUtils.overload.isImplementation(node)) {
return;
}
if (sb.context.analysis.isSmartContractMixinFunction(node)) {
return;
}
const func = node;
const options = sb.pushValueOptions(optionsIn);
let name;
const nodeName = tsUtils.node.getName(node);
if (nodeName !== undefined) {
name = sb.scope.add(tsUtils.node.getNameOrThrow(node));
}
sb.emitHelper(func, options, sb.helpers.createCallArray);
sb.emitHelper(func, options, sb.helpers.createFunctionObject({
property: InternalObjectProperty.Call,
}));
if (tsUtils.modifier.isNamedExport(node) || tsUtils.modifier.isDefaultExport(node)) {
sb.emitOp(node, 'DUP');
sb.emitHelper(node, options, sb.helpers.exportSingle({
name: tsUtils.modifier.isNamedExport(node) ? tsUtils.node.getNameOrThrow(node) : undefined,
defaultExport: tsUtils.modifier.isDefaultExport(node),
}));
}
if (!optionsIn.pushValue) {
if (name === undefined) {
sb.emitOp(node, 'DROP');
}
else {
sb.scope.set(sb, node, options, name);
}
}
}
}
//# sourceMappingURL=FunctionLikeHelper.js.map