@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
58 lines (56 loc) • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getContractProperties = void 0;
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(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(Object.assign({}, defaultContractProperties), contract);
};
//# sourceMappingURL=getContractProperties.js.map