UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

126 lines (124 loc) 19.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const typescript_1 = tslib_1.__importDefault(require("typescript")); const analysis_1 = require("../analysis"); const types_1 = require("../compile/helper/types"); const DiagnosticCode_1 = require("../DiagnosticCode"); const DiagnosticMessage_1 = require("../DiagnosticMessage"); const getFixedDecimals_1 = require("./getFixedDecimals"); const getForwardedValueType_1 = require("./getForwardedValueType"); function toABIReturn(context, node, type, optionalIn = false, options = analysis_1.DEFAULT_DIAGNOSTIC_OPTIONS) { let resolvedType = type; if (resolvedType === undefined) { return undefined; } if (ts_utils_1.tsUtils.type_.isOnlyVoidish(resolvedType)) { return { type: 'Void', optional: false }; } let optional = optionalIn; if (ts_utils_1.tsUtils.type_.hasUndefinedish(resolvedType)) { resolvedType = ts_utils_1.tsUtils.type_.getNonNullableType(resolvedType); optional = true; } let forwardedValue = false; if (context.builtins.isType(node, resolvedType, 'ForwardedValue')) { resolvedType = getForwardedValueType_1.getForwardedValueType(resolvedType); forwardedValue = true; } if (resolvedType === undefined) { return undefined; } if (ts_utils_1.tsUtils.type_.hasUndefinedish(resolvedType)) { resolvedType = ts_utils_1.tsUtils.type_.getNonNullableType(resolvedType); optional = true; } resolvedType = context.analysis.getNotAnyType(node, resolvedType); if (resolvedType === undefined) { return undefined; } if (types_1.isOnlyBoolean(context, node, resolvedType)) { return { type: 'Boolean', optional, forwardedValue }; } if (context.builtins.isInterface(node, resolvedType, 'Address')) { return { type: 'Address', optional, forwardedValue }; } if (context.builtins.isInterface(node, resolvedType, 'Hash256')) { return { type: 'Hash256', optional, forwardedValue }; } if (context.builtins.isInterface(node, resolvedType, 'PublicKey')) { return { type: 'PublicKey', optional, forwardedValue }; } if (types_1.isOnlyString(context, node, resolvedType)) { return { type: 'String', optional, forwardedValue }; } if (ts_utils_1.tsUtils.type_.isOnlyNumberLiteral(resolvedType)) { return { type: 'Integer', optional, decimals: 0, forwardedValue }; } if (context.builtins.isType(node, resolvedType, 'Fixed')) { const decimals = getFixedDecimals_1.getFixedDecimals(resolvedType); return { type: 'Integer', optional, decimals: decimals === undefined ? 0 : decimals, forwardedValue }; } if (ts_utils_1.tsUtils.type_.isOnlyNumberish(resolvedType)) { return { type: 'Integer', optional, decimals: 0, forwardedValue }; } if (types_1.isOnlyArray(context, node, resolvedType)) { const typeArguments = ts_utils_1.tsUtils.type_.getTypeArguments(resolvedType); if (typeArguments !== undefined) { const value = toABIReturn(context, node, typeArguments[0]); if (value !== undefined) { return { type: 'Array', optional, value, forwardedValue }; } } } if (types_1.isOnlyMap(context, node, resolvedType)) { const typeArguments = ts_utils_1.tsUtils.type_.getTypeArguments(resolvedType); if (typeArguments !== undefined && typeArguments.length === 2) { const key = toABIReturn(context, node, typeArguments[0]); const value = toABIReturn(context, node, typeArguments[1]); if (key !== undefined && value !== undefined) { return { type: 'Map', optional, key, value, forwardedValue }; } } } if (types_1.isOnlyBuffer(context, node, resolvedType)) { return { type: 'Buffer', optional, forwardedValue }; } if (types_1.isOnlyForwardValue(context, node, resolvedType)) { return { type: 'ForwardValue', optional, forwardedValue }; } if (types_1.isOnlyObject(context, node, resolvedType)) { const properties = ts_utils_1.tsUtils.type_.getProperties(resolvedType).reduce((acc, prop) => { const propType = context.analysis.getTypeOfSymbol(prop, node); const decls = ts_utils_1.tsUtils.symbol.getDeclarations(prop); const nextNode = decls.length === 0 ? node : decls[0]; if (!typescript_1.default.isPropertyDeclaration(nextNode) && !typescript_1.default.isPropertySignature(nextNode)) { if (options.error) { context.reportError(nextNode, DiagnosticCode_1.DiagnosticCode.InvalidContractType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractType); } else if (options.warning) { context.reportWarning(nextNode, DiagnosticCode_1.DiagnosticCode.InvalidContractType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractType); } return acc; } const returnType = toABIReturn(context, nextNode, propType); return returnType === undefined ? acc : Object.assign({}, acc, { [ts_utils_1.tsUtils.symbol.getName(prop)]: returnType }); }, {}); return { type: 'Object', optional, forwardedValue, properties, }; } if (options.error) { context.reportError(node, DiagnosticCode_1.DiagnosticCode.InvalidContractType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractType); } else if (options.warning) { context.reportWarning(node, DiagnosticCode_1.DiagnosticCode.InvalidContractType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractType); } return undefined; } exports.toABIReturn = toABIReturn; //# sourceMappingURL=data:application/json;charset=utf8;base64,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RyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFUCxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRO1lBQ1IsY0FBYztZQUNkLFVBQVU7U0FDWCxDQUFDO0tBQ0g7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7UUFDakIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsK0JBQWMsQ0FBQyxtQkFBbUIsRUFBRSxxQ0FBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0tBQ3RHO1NBQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQzFCLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLCtCQUFjLENBQUMsbUJBQW1CLEVBQUUscUNBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQUN4RztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUE1SUQsa0NBNElDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL3V0aWxzL3RvQUJJUmV0dXJuLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQUJJUmV0dXJuIH0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgREVGQVVMVF9ESUFHTk9TVElDX09QVElPTlMsIERpYWdub3N0aWNPcHRpb25zIH0gZnJvbSAnLi4vYW5hbHlzaXMnO1xuaW1wb3J0IHtcbiAgaXNPbmx5QXJyYXksXG4gIGlzT25seUJvb2xlYW4sXG4gIGlzT25seUJ1ZmZlcixcbiAgaXNPbmx5Rm9yd2FyZFZhbHVlLFxuICBpc09ubHlNYXAsXG4gIGlzT25seU9iamVjdCxcbiAgaXNPbmx5U3RyaW5nLFxufSBmcm9tICcuLi9jb21waWxlL2hlbHBlci90eXBlcyc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi4vQ29udGV4dCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgZ2V0Rml4ZWREZWNpbWFscyB9IGZyb20gJy4vZ2V0Rml4ZWREZWNpbWFscyc7XG5pbXBvcnQgeyBnZXRGb3J3YXJkZWRWYWx1ZVR5cGUgfSBmcm9tICcuL2dldEZvcndhcmRlZFZhbHVlVHlwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0FCSVJldHVybihcbiAgY29udGV4dDogQ29udGV4dCxcbiAgbm9kZTogdHMuTm9kZSxcbiAgdHlwZTogdHMuVHlwZSB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uYWxJbiA9IGZhbHNlLFxuICBvcHRpb25zOiBEaWFnbm9zdGljT3B0aW9ucyA9IERFRkFVTFRfRElBR05PU1RJQ19PUFRJT05TLFxuKTogQUJJUmV0dXJuIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHJlc29sdmVkVHlwZSA9IHR5cGU7XG4gIGlmIChyZXNvbHZlZFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHNVdGlscy50eXBlXy5pc09ubHlWb2lkaXNoKHJlc29sdmVkVHlwZSkpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnVm9pZCcsIG9wdGlvbmFsOiBmYWxzZSB9O1xuICB9XG5cbiAgbGV0IG9wdGlvbmFsID0gb3B0aW9uYWxJbjtcbiAgaWYgKHRzVXRpbHMudHlwZV8uaGFzVW5kZWZpbmVkaXNoKHJlc29sdmVkVHlwZSkpIHtcbiAgICByZXNvbHZlZFR5cGUgPSB0c1V0aWxzLnR5cGVfLmdldE5vbk51bGxhYmxlVHlwZShyZXNvbHZlZFR5cGUpO1xuICAgIG9wdGlvbmFsID0gdHJ1ZTtcbiAgfVxuXG4gIGxldCBmb3J3YXJkZWRWYWx1ZSA9IGZhbHNlO1xuICBpZiAoY29udGV4dC5idWlsdGlucy5pc1R5cGUobm9kZSwgcmVzb2x2ZWRUeXBlLCAnRm9yd2FyZGVkVmFsdWUnKSkge1xuICAgIHJlc29sdmVkVHlwZSA9IGdldEZvcndhcmRlZFZhbHVlVHlwZShyZXNvbHZlZFR5cGUpO1xuICAgIGZvcndhcmRlZFZhbHVlID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChyZXNvbHZlZFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHNVdGlscy50eXBlXy5oYXNVbmRlZmluZWRpc2gocmVzb2x2ZWRUeXBlKSkge1xuICAgIHJlc29sdmVkVHlwZSA9IHRzVXRpbHMudHlwZV8uZ2V0Tm9uTnVsbGFibGVUeXBlKHJlc29sdmVkVHlwZSk7XG4gICAgb3B0aW9uYWwgPSB0cnVlO1xuICB9XG5cbiAgcmVzb2x2ZWRUeXBlID0gY29udGV4dC5hbmFseXNpcy5nZXROb3RBbnlUeXBlKG5vZGUsIHJlc29sdmVkVHlwZSk7XG4gIGlmIChyZXNvbHZlZFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoaXNPbmx5Qm9vbGVhbihjb250ZXh0LCBub2RlLCByZXNvbHZlZFR5cGUpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ0Jvb2xlYW4nLCBvcHRpb25hbCwgZm9yd2FyZGVkVmFsdWUgfTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LmJ1aWx0aW5zLmlzSW50ZXJmYWNlKG5vZGUsIHJlc29sdmVkVHlwZSwgJ0FkZHJlc3MnKSkge1xuICAgIHJldHVybiB7IHR5cGU6ICdBZGRyZXNzJywgb3B0aW9uYWwsIGZvcndhcmRlZFZhbHVlIH07XG4gIH1cblxuICBpZiAoY29udGV4dC5idWlsdGlucy5pc0ludGVyZmFjZShub2RlLCByZXNvbHZlZFR5cGUsICdIYXNoMjU2JykpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnSGFzaDI1NicsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKGNvbnRleHQuYnVpbHRpbnMuaXNJbnRlcmZhY2Uobm9kZSwgcmVzb2x2ZWRUeXBlLCAnUHVibGljS2V5JykpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnUHVibGljS2V5Jywgb3B0aW9uYWwsIGZvcndhcmRlZFZhbHVlIH07XG4gIH1cblxuICBpZiAoaXNPbmx5U3RyaW5nKGNvbnRleHQsIG5vZGUsIHJlc29sdmVkVHlwZSkpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnU3RyaW5nJywgb3B0aW9uYWwsIGZvcndhcmRlZFZhbHVlIH07XG4gIH1cblxuICBpZiAodHNVdGlscy50eXBlXy5pc09ubHlOdW1iZXJMaXRlcmFsKHJlc29sdmVkVHlwZSkpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnSW50ZWdlcicsIG9wdGlvbmFsLCBkZWNpbWFsczogMCwgZm9yd2FyZGVkVmFsdWUgfTtcbiAgfVxuXG4gIGlmIChjb250ZXh0LmJ1aWx0aW5zLmlzVHlwZShub2RlLCByZXNvbHZlZFR5cGUsICdGaXhlZCcpKSB7XG4gICAgY29uc3QgZGVjaW1hbHMgPSBnZXRGaXhlZERlY2ltYWxzKHJlc29sdmVkVHlwZSk7XG5cbiAgICByZXR1cm4geyB0eXBlOiAnSW50ZWdlcicsIG9wdGlvbmFsLCBkZWNpbWFsczogZGVjaW1hbHMgPT09IHVuZGVmaW5lZCA/IDAgOiBkZWNpbWFscywgZm9yd2FyZGVkVmFsdWUgfTtcbiAgfVxuXG4gIGlmICh0c1V0aWxzLnR5cGVfLmlzT25seU51bWJlcmlzaChyZXNvbHZlZFR5cGUpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ0ludGVnZXInLCBvcHRpb25hbCwgZGVjaW1hbHM6IDAsIGZvcndhcmRlZFZhbHVlIH07XG4gIH1cblxuICBpZiAoaXNPbmx5QXJyYXkoY29udGV4dCwgbm9kZSwgcmVzb2x2ZWRUeXBlKSkge1xuICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSB0c1V0aWxzLnR5cGVfLmdldFR5cGVBcmd1bWVudHMocmVzb2x2ZWRUeXBlKTtcbiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRvQUJJUmV0dXJuKGNvbnRleHQsIG5vZGUsIHR5cGVBcmd1bWVudHNbMF0pO1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ0FycmF5Jywgb3B0aW9uYWwsIHZhbHVlLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc09ubHlNYXAoY29udGV4dCwgbm9kZSwgcmVzb2x2ZWRUeXBlKSkge1xuICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSB0c1V0aWxzLnR5cGVfLmdldFR5cGVBcmd1bWVudHMocmVzb2x2ZWRUeXBlKTtcbiAgICBpZiAodHlwZUFyZ3VtZW50cyAhPT0gdW5kZWZpbmVkICYmIHR5cGVBcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBrZXkgPSB0b0FCSVJldHVybihjb250ZXh0LCBub2RlLCB0eXBlQXJndW1lbnRzWzBdKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdG9BQklSZXR1cm4oY29udGV4dCwgbm9kZSwgdHlwZUFyZ3VtZW50c1sxXSk7XG4gICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnTWFwJywgb3B0aW9uYWwsIGtleSwgdmFsdWUsIGZvcndhcmRlZFZhbHVlIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzT25seUJ1ZmZlcihjb250ZXh0LCBub2RlLCByZXNvbHZlZFR5cGUpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ0J1ZmZlcicsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKGlzT25seUZvcndhcmRWYWx1ZShjb250ZXh0LCBub2RlLCByZXNvbHZlZFR5cGUpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ0ZvcndhcmRWYWx1ZScsIG9wdGlvbmFsLCBmb3J3YXJkZWRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKGlzT25seU9iamVjdChjb250ZXh0LCBub2RlLCByZXNvbHZlZFR5cGUpKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHRzVXRpbHMudHlwZV8uZ2V0UHJvcGVydGllcyhyZXNvbHZlZFR5cGUpLnJlZHVjZTx7IFtrZXk6IHN0cmluZ106IEFCSVJldHVybiB9PigoYWNjLCBwcm9wKSA9PiB7XG4gICAgICBjb25zdCBwcm9wVHlwZSA9IGNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZU9mU3ltYm9sKHByb3AsIG5vZGUpO1xuICAgICAgY29uc3QgZGVjbHMgPSB0c1V0aWxzLnN5bWJvbC5nZXREZWNsYXJhdGlvbnMocHJvcCk7XG4gICAgICBjb25zdCBuZXh0Tm9kZSA9IGRlY2xzLmxlbmd0aCA9PT0gMCA/IG5vZGUgOiBkZWNsc1swXTtcbiAgICAgIGlmICghdHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG5leHROb2RlKSAmJiAhdHMuaXNQcm9wZXJ0eVNpZ25hdHVyZShuZXh0Tm9kZSkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3IpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydEVycm9yKG5leHROb2RlLCBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQ29udHJhY3RUeXBlLCBEaWFnbm9zdGljTWVzc2FnZS5JbnZhbGlkQ29udHJhY3RUeXBlKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLndhcm5pbmcpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydFdhcm5pbmcobmV4dE5vZGUsIERpYWdub3N0aWNDb2RlLkludmFsaWRDb250cmFjdFR5cGUsIERpYWdub3N0aWNNZXNzYWdlLkludmFsaWRDb250cmFjdFR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHRvQUJJUmV0dXJuKGNvbnRleHQsIG5leHROb2RlLCBwcm9wVHlwZSk7XG5cbiAgICAgIHJldHVybiByZXR1cm5UeXBlID09PSB1bmRlZmluZWQgPyBhY2MgOiB7IC4uLmFjYywgW3RzVXRpbHMuc3ltYm9sLmdldE5hbWUocHJvcCldOiByZXR1cm5UeXBlIH07XG4gICAgfSwge30pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdPYmplY3QnLFxuICAgICAgb3B0aW9uYWwsXG4gICAgICBmb3J3YXJkZWRWYWx1ZSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmVycm9yKSB7XG4gICAgY29udGV4dC5yZXBvcnRFcnJvcihub2RlLCBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQ29udHJhY3RUeXBlLCBEaWFnbm9zdGljTWVzc2FnZS5JbnZhbGlkQ29udHJhY3RUeXBlKTtcbiAgfSBlbHNlIGlmIChvcHRpb25zLndhcm5pbmcpIHtcbiAgICBjb250ZXh0LnJlcG9ydFdhcm5pbmcobm9kZSwgRGlhZ25vc3RpY0NvZGUuSW52YWxpZENvbnRyYWN0VHlwZSwgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZENvbnRyYWN0VHlwZSk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19