diff --git a/packages/codegen/src/visitor.ts b/packages/codegen/src/visitor.ts index b8594d28..88b6d858 100644 --- a/packages/codegen/src/visitor.ts +++ b/packages/codegen/src/visitor.ts @@ -69,16 +69,18 @@ export class Visitor { return { name: item.name, type: item.typeName.name }; }); + let errorMessage = ''; + // Check for unhandled return type params node.returnParameters.forEach(returnParameter => { assert(returnParameter.typeName); + const isTypeHandled = ['ElementaryTypeName', 'ArrayTypeName'].includes(returnParameter.typeName.type); if (!isTypeHandled) { - const errorMessage = `No support in codegen for type ${returnParameter.typeName.type} from method "${node.name}"`; + errorMessage = `No support in codegen for type ${returnParameter.typeName.type} from method "${node.name}"`; if (this._continueOnError) { - console.log(errorMessage); return; } @@ -86,6 +88,11 @@ export class Visitor { } }); + if (this._continueOnError && errorMessage !== '') { + console.log(errorMessage); + return; + } + this._schema.addQuery(name, params, node.returnParameters); this._resolvers.addQuery(name, params); assert(this._contract); @@ -125,12 +132,24 @@ export class Visitor { // If the variable type is mapping, extract key as a param: // Eg. mapping(address => mapping(address => uint256)) private _allowances; while (typeName.type === 'Mapping') { - assert(typeName.keyType.type === 'ElementaryTypeName', 'UserDefinedTypeName map keys like enum type not handled'); + if (typeName.keyType.type === 'UserDefinedTypeName') { + errorMessage = 'No support in codegen for user defined type map keys'; + break; + } + params.push({ name: `key${numParams.toString()}`, type: typeName.keyType.name }); typeName = typeName.valueType; numParams++; } + if (typeName.type === 'UserDefinedTypeName') { + errorMessage = 'No support in codegen for user defined type map values'; + } + + if (errorMessage !== '') { + break; + } + // falls through }