export function extractEnumsInfo()

in src/helpers/enumExtractor.ts [32:75]


export function extractEnumsInfo(contractName: string, ast: { [key: string]: any }): EnumStorage {
  if (!ast) {
    throw new Error(Constants.errorMessageStrings.AstIsEmpty);
  }
  const rootNode = ast.nodes
    .find((node: INode) => node.nodeType === 'ContractDefinition' && node.name === contractName);
  if (!rootNode) {
    throw new Error(Constants.errorMessageStrings.NoContractBody);
  }

  const result = new EnumStorage();
  const enumNodes = GetEnumDeclarations('EnumDefinition', rootNode);
  if (enumNodes.length > 0) {
    const methods = GetMethodsWithEnum('FunctionDefinition', rootNode, enumNodes.map((enumNode) => enumNode.name));
    methods.forEach((method) => {
      method.parameters.parameters
        .filter((parameter: any) => enumNodes.some((enumItem) => enumItem.name === parameter.typeName.name))
        .forEach((parameter: any) => {
          const enm = enumNodes.find((enumItem) => enumItem.name === parameter.typeName.name)!;
          // first enum element could have not zero value, so we move it to zero-base
          const offset = enm.members[0].id;
          // collect enum items. ids does not equal uint values,
          // so i think we should just set first as '0' and so on
          const enumItems = enm.members.map((enumMember) => ({ name: enumMember.name, value: enumMember.id - offset }));
          // method name + parameter name as uniq key
          if (!result.methods[method.name]) {
            result.methods[method.name] = {};
          }
          result.methods[method.name][parameter.name] = enumItems;
        });
    });
    // contract members
    const enumNames = enumNodes.map((enumItems) => enumItems.name);
    const contractMembers = GetEnumMembers('VariableDeclaration', rootNode, enumNames);
    contractMembers.forEach((contractMember) => {
      const enumItemsWithoutOffset = enumNodes.find((enumNode) => enumNode.name === contractMember.typeName.name)!;
      const offset = enumItemsWithoutOffset.members[0].id;
      result.fields[contractMember.name] = enumItemsWithoutOffset.members
        .map((enumWithoutOffset: any) => ({name: enumWithoutOffset.name, value: enumWithoutOffset.id - offset}));
    });
  }

  return result;
}