@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
60 lines (58 loc) • 2.68 kB
JavaScript
import { tsUtils } from '@neo-one/ts-utils';
import ts from 'typescript';
import { ContractPropertyName, DEFAULT_CONTRACT_PROPERTIES } from '../constants';
import { DiagnosticCode } from '../DiagnosticCode';
import { DiagnosticMessage } from '../DiagnosticMessage';
export const getContractProperties = (context, smartContract) => {
const type = context.analysis.getType(smartContract);
const name = tsUtils.node.getName(smartContract);
const defaultContractProperties = {
...DEFAULT_CONTRACT_PROPERTIES,
name: name === undefined ? DEFAULT_CONTRACT_PROPERTIES.name : name,
};
if (type === undefined) {
return defaultContractProperties;
}
const properties = tsUtils.type_
.getProperties(type)
.find((symbol) => tsUtils.symbol.getName(symbol) === ContractPropertyName.properties);
if (properties === undefined) {
return defaultContractProperties;
}
const decls = tsUtils.symbol
.getDeclarations(properties)
.filter(ts.isPropertyDeclaration)
.filter((prop) => tsUtils.initializer.getInitializer(prop) !== undefined);
if (decls.length === 0) {
return defaultContractProperties;
}
if (decls.length !== 1) {
context.reportError(smartContract, DiagnosticCode.InvalidContractProperties, DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
const decl = decls[0];
const initializer = tsUtils.initializer.getInitializerOrThrow(decl);
if (!ts.isObjectLiteralExpression(initializer)) {
context.reportError(smartContract, DiagnosticCode.InvalidContractProperties, DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
const contract = {};
for (const property of tsUtils.object_.getProperties(initializer)) {
if (!ts.isPropertyAssignment(property)) {
context.reportError(property, DiagnosticCode.InvalidContractProperties, DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
const key = tsUtils.node.getName(property);
const value = tsUtils.initializer.getInitializer(property);
if (!ts.isLiteralExpression(value)) {
context.reportError(value, DiagnosticCode.InvalidContractProperties, DiagnosticMessage.InvalidContractPropertiesInitializer);
return defaultContractProperties;
}
contract[key] = tsUtils.literal.getLiteralValue(value);
}
return {
...defaultContractProperties,
...contract,
};
};
//# sourceMappingURL=getContractProperties.js.map