text: // @flow
  import invariant from 'invariant';
  import mapSyntax from './map-syntax';
  import mergeBlock from './merge-block';
  import opcode from '../emitter/opcode';
  import { LOCAL_INDEX, TYPE_INDEX } from '../semantics/metadata';
  import type { GeneratorType } from './flow/types';
  
  const generateIndirectFunctionCall: GeneratorType = (node, parent) => {
    const block = node.params.map(mapSyntax(parent)).reduce(mergeBlock, []);
    const localIndex = node.meta[LOCAL_INDEX];
    const typeIndexMeta = node.meta[TYPE_INDEX];
    invariant(
      localIndex != null,
      'Undefined local index, not a valid function pointer'
    );
    invariant(
      typeIndexMeta != null,
      'Variable is not of a valid function pointer type'
    );
  
    return [
      ...block,
      {
        kind: opcode.CallIndirect,
        params: [typeIndexMeta, 0],
      },
    ];
  };
  
  export default generateIndirectFunctionCall;
  