@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
57 lines (55 loc) • 10.1 kB
JavaScript
;
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 constants_1 = require("../constants");
const DiagnosticCode_1 = require("../DiagnosticCode");
const DiagnosticMessage_1 = require("../DiagnosticMessage");
exports.getContractProperties = (context, smartContract) => {
const type = context.analysis.getType(smartContract);
const name = ts_utils_1.tsUtils.node.getName(smartContract);
const defaultContractProperties = Object.assign({}, constants_1.DEFAULT_CONTRACT_PROPERTIES, { name: name === undefined ? constants_1.DEFAULT_CONTRACT_PROPERTIES.name : name });
if (type === undefined) {
return defaultContractProperties;
}
const properties = ts_utils_1.tsUtils.type_
.getProperties(type)
.find((symbol) => ts_utils_1.tsUtils.symbol.getName(symbol) === constants_1.ContractPropertyName.properties);
if (properties === undefined) {
return defaultContractProperties;
}
const decls = ts_utils_1.tsUtils.symbol
.getDeclarations(properties)
.filter(typescript_1.default.isPropertyDeclaration)
.filter((prop) => ts_utils_1.tsUtils.initializer.getInitializer(prop) !== undefined);
if (decls.length === 0) {
return defaultContractProperties;
}
if (decls.length !== 1) {
context.reportError(smartContract, DiagnosticCode_1.DiagnosticCode.InvalidContractProperties, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
const decl = decls[0];
const initializer = ts_utils_1.tsUtils.initializer.getInitializerOrThrow(decl);
if (!typescript_1.default.isObjectLiteralExpression(initializer)) {
context.reportError(smartContract, DiagnosticCode_1.DiagnosticCode.InvalidContractProperties, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
const contract = {};
for (const property of ts_utils_1.tsUtils.object_.getProperties(initializer)) {
if (!typescript_1.default.isPropertyAssignment(property)) {
context.reportError(property, DiagnosticCode_1.DiagnosticCode.InvalidContractProperties, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
const key = ts_utils_1.tsUtils.node.getName(property);
const value = ts_utils_1.tsUtils.initializer.getInitializer(property);
if (!typescript_1.default.isLiteralExpression(value)) {
context.reportError(value, DiagnosticCode_1.DiagnosticCode.InvalidContractProperties, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
contract[key] = ts_utils_1.tsUtils.literal.getLiteralValue(value);
}
return Object.assign({}, defaultContractProperties, contract);
};
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QVEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLGtCQUFPLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQyxPQUFPLENBQUMsV0FBVyxDQUNqQixLQUFLLEVBQ0wsK0JBQWMsQ0FBQyx5QkFBeUIsRUFDeEMscUNBQWlCLENBQUMsb0NBQW9DLENBQ3ZELENBQUM7WUFFRixPQUFPLHlCQUF5QixDQUFDO1NBQ2xDO1FBR0QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGtCQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4RDtJQUVELHlCQUNLLHlCQUF5QixFQUN6QixRQUFRLEVBQ1g7QUFDSixDQUFDLENBQUMiLCJmaWxlIjoibmVvLW9uZS1zbWFydC1jb250cmFjdC1jb21waWxlci9zcmMvY29udHJhY3QvZ2V0Q29udHJhY3RQcm9wZXJ0aWVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IENvbnRyYWN0UHJvcGVydGllcywgQ29udHJhY3RQcm9wZXJ0eU5hbWUsIERFRkFVTFRfQ09OVFJBQ1RfUFJPUEVSVElFUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi4vQ29udGV4dCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJhY3RQcm9wZXJ0aWVzID0gKGNvbnRleHQ6IENvbnRleHQsIHNtYXJ0Q29udHJhY3Q6IHRzLkNsYXNzRGVjbGFyYXRpb24pOiBDb250cmFjdFByb3BlcnRpZXMgPT4ge1xuICBjb25zdCB0eXBlID0gY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHNtYXJ0Q29udHJhY3QpO1xuICBjb25zdCBuYW1lID0gdHNVdGlscy5ub2RlLmdldE5hbWUoc21hcnRDb250cmFjdCk7XG4gIGNvbnN0IGRlZmF1bHRDb250cmFjdFByb3BlcnRpZXMgPSB7XG4gICAgLi4uREVGQVVMVF9DT05UUkFDVF9QUk9QRVJUSUVTLFxuICAgIG5hbWU6IG5hbWUgPT09IHVuZGVmaW5lZCA/IERFRkFVTFRfQ09OVFJBQ1RfUFJPUEVSVElFUy5uYW1lIDogbmFtZSxcbiAgfTtcblxuICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRDb250cmFjdFByb3BlcnRpZXM7XG4gIH1cblxuICBjb25zdCBwcm9wZXJ0aWVzID0gdHNVdGlscy50eXBlX1xuICAgIC5nZXRQcm9wZXJ0aWVzKHR5cGUpXG4gICAgLmZpbmQoKHN5bWJvbCkgPT4gdHNVdGlscy5zeW1ib2wuZ2V0TmFtZShzeW1ib2wpID09PSBDb250cmFjdFByb3BlcnR5TmFtZS5wcm9wZXJ0aWVzKTtcblxuICBpZiAocHJvcGVydGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRDb250cmFjdFByb3BlcnRpZXM7XG4gIH1cblxuICBjb25zdCBkZWNscyA9IHRzVXRpbHMuc3ltYm9sXG4gICAgLmdldERlY2xhcmF0aW9ucyhwcm9wZXJ0aWVzKVxuICAgIC5maWx0ZXIodHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKVxuICAgIC5maWx0ZXIoKHByb3ApID0+IHRzVXRpbHMuaW5pdGlhbGl6ZXIuZ2V0SW5pdGlhbGl6ZXIocHJvcCkgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChkZWNscy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZGVmYXVsdENvbnRyYWN0UHJvcGVydGllcztcbiAgfVxuXG4gIGlmIChkZWNscy5sZW5ndGggIT09IDEpIHtcbiAgICBjb250ZXh0LnJlcG9ydEVycm9yKFxuICAgICAgc21hcnRDb250cmFjdCxcbiAgICAgIERpYWdub3N0aWNDb2RlLkludmFsaWRDb250cmFjdFByb3BlcnRpZXMsXG4gICAgICBEaWFnbm9zdGljTWVzc2FnZS5JbnZhbGlkQ29udHJhY3RQcm9wZXJ0aWVzSW5pdGlhbGl6ZXIsXG4gICAgKTtcblxuICAgIHJldHVybiBkZWZhdWx0Q29udHJhY3RQcm9wZXJ0aWVzO1xuICB9XG5cbiAgY29uc3QgZGVjbCA9IGRlY2xzWzBdO1xuICBjb25zdCBpbml0aWFsaXplciA9IHRzVXRpbHMuaW5pdGlhbGl6ZXIuZ2V0SW5pdGlhbGl6ZXJPclRocm93KGRlY2wpO1xuXG4gIGlmICghdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihpbml0aWFsaXplcikpIHtcbiAgICBjb250ZXh0LnJlcG9ydEVycm9yKFxuICAgICAgc21hcnRDb250cmFjdCxcbiAgICAgIERpYWdub3N0aWNDb2RlLkludmFsaWRDb250cmFjdFByb3BlcnRpZXMsXG4gICAgICBEaWFnbm9zdGljTWVzc2FnZS5JbnZhbGlkQ29udHJhY3RQcm9wZXJ0aWVzSW5pdGlhbGl6ZXIsXG4gICAgKTtcblxuICAgIHJldHVybiBkZWZhdWx0Q29udHJhY3RQcm9wZXJ0aWVzO1xuICB9XG5cbiAgY29uc3QgY29udHJhY3Q6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdHNVdGlscy5vYmplY3RfLmdldFByb3BlcnRpZXMoaW5pdGlhbGl6ZXIpKSB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkpIHtcbiAgICAgIGNvbnRleHQucmVwb3J0RXJyb3IoXG4gICAgICAgIHByb3BlcnR5LFxuICAgICAgICBEaWFnbm9zdGljQ29kZS5JbnZhbGlkQ29udHJhY3RQcm9wZXJ0aWVzLFxuICAgICAgICBEaWFnbm9zdGljTWVzc2FnZS5JbnZhbGlkQ29udHJhY3RQcm9wZXJ0aWVzSW5pdGlhbGl6ZXIsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZGVmYXVsdENvbnRyYWN0UHJvcGVydGllcztcbiAgICB9XG5cbiAgICBjb25zdCBrZXkgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZShwcm9wZXJ0eSk7XG4gICAgY29uc3QgdmFsdWUgPSB0c1V0aWxzLmluaXRpYWxpemVyLmdldEluaXRpYWxpemVyKHByb3BlcnR5KTtcbiAgICBpZiAoIXRzLmlzTGl0ZXJhbEV4cHJlc3Npb24odmFsdWUpKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydEVycm9yKFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgRGlhZ25vc3RpY0NvZGUuSW52YWxpZENvbnRyYWN0UHJvcGVydGllcyxcbiAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZENvbnRyYWN0UHJvcGVydGllc0luaXRpYWxpemVyLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGRlZmF1bHRDb250cmFjdFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvblxuICAgIGNvbnRyYWN0W2tleV0gPSB0c1V0aWxzLmxpdGVyYWwuZ2V0TGl0ZXJhbFZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGVmYXVsdENvbnRyYWN0UHJvcGVydGllcyxcbiAgICAuLi5jb250cmFjdCxcbiAgfTtcbn07XG4iXX0=