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;
}