@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
51 lines (49 loc) • 2.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SmartContractAddress = 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 types_1 = require("../../types");
class SmartContractAddress {
constructor() {
this.types = new Set([types_1.BuiltinType.InstanceMemberValue]);
}
emitValue(sb, node, options, visited = false) {
let isLinkedSmartContract = false;
if (typescript_1.default.isBindingElement(node)) {
const propNode = ts_utils_1.tsUtils.node.getNameNode(node);
const propSymbol = sb.context.analysis.getSymbol(propNode);
if (propSymbol !== undefined) {
const parentSymbol = ts_utils_1.tsUtils.symbol.getParent(propSymbol);
if (parentSymbol !== undefined) {
const decls = ts_utils_1.tsUtils.symbol.getDeclarations(parentSymbol);
if (decls.length > 0) {
isLinkedSmartContract = !sb.isCurrentSmartContract(decls[0]);
}
}
}
}
else {
isLinkedSmartContract = !sb.isCurrentSmartContract(ts_utils_1.tsUtils.expression.getExpression(node));
}
if (isLinkedSmartContract) {
if (!visited && (typescript_1.default.isPropertyAccessExpression(node) || typescript_1.default.isElementAccessExpression(node))) {
sb.visit(ts_utils_1.tsUtils.expression.getExpression(node), sb.pushValueOptions(options));
}
sb.emitPushString(node, constants_1.ContractPropertyName.address);
sb.emitHelper(node, options, sb.helpers.getPropertyObjectProperty);
return;
}
if (visited) {
sb.emitOp(node, 'DROP');
}
if (options.pushValue) {
sb.emitSysCall(node, 'System.ExecutionEngine.GetExecutingScriptHash');
sb.emitHelper(node, options, sb.helpers.wrapBuffer);
}
}
}
exports.SmartContractAddress = SmartContractAddress;
//# sourceMappingURL=address.js.map