@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
46 lines (44 loc) • 5.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const scope_1 = require("../scope");
const BaseScriptBuilder_1 = require("./BaseScriptBuilder");
class ScopeCapturingScriptBuilder extends BaseScriptBuilder_1.BaseScriptBuilder {
constructor() {
super(...arguments);
this.mutableScopes = [];
this.resolvedScopes = new Map();
}
process() {
super.process();
this.resolveScopes();
}
getScopes() {
return this.resolvedScopes;
}
createScope(node, index, parent) {
const scope = new scope_1.CapturingScope(node, index, parent);
this.mutableScopes.push(scope);
return scope;
}
resolveScopes() {
this.mutableScopes.forEach((scope) => {
this.resolveScope(scope);
});
}
resolveScope(scope) {
let forNode = this.resolvedScopes.get(scope.node);
if (forNode === undefined) {
forNode = new Map();
this.resolvedScopes.set(scope.node, forNode);
}
let resolved = forNode.get(scope.index);
if (resolved === undefined) {
const parent = scope.parent;
resolved = parent === undefined ? scope.resolve() : scope.resolve(this.resolveScope(parent));
forNode.set(scope.index, resolved);
}
return resolved;
}
}
exports.ScopeCapturingScriptBuilder = ScopeCapturingScriptBuilder;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjb3BlQ2FwdHVyaW5nU2NyaXB0QnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLG9DQUF5RDtBQUN6RCwyREFBd0Q7QUFHeEQsTUFBYSwyQkFBNEIsU0FBUSxxQ0FBaUM7SUFBbEY7O1FBQ21CLGtCQUFhLEdBQXFCLEVBQUUsQ0FBQztRQUNyQyxtQkFBYyxHQUE2QyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBeUN4RixDQUFDO0lBdkNRLE9BQU87UUFDWixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFUyxXQUFXLENBQUMsSUFBYSxFQUFFLEtBQWEsRUFBRSxNQUFtQztRQUNyRixNQUFNLEtBQUssR0FBRyxJQUFJLHNCQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsS0FBcUI7UUFDeEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN6QixPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzlDO1FBRUQsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsUUFBUSxHQUFHLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFFN0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBM0NELGtFQTJDQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL3NiL1Njb3BlQ2FwdHVyaW5nU2NyaXB0QnVpbGRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IENhcHR1cmluZ1Njb3BlLCBSZXNvbHZlZFNjb3BlIH0gZnJvbSAnLi4vc2NvcGUnO1xuaW1wb3J0IHsgQmFzZVNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuL0Jhc2VTY3JpcHRCdWlsZGVyJztcbmltcG9ydCB7IFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuL1NjcmlwdEJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVDYXB0dXJpbmdTY3JpcHRCdWlsZGVyIGV4dGVuZHMgQmFzZVNjcmlwdEJ1aWxkZXI8Q2FwdHVyaW5nU2NvcGU+IGltcGxlbWVudHMgU2NyaXB0QnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbXV0YWJsZVNjb3BlczogQ2FwdHVyaW5nU2NvcGVbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkU2NvcGVzOiBNYXA8dHMuTm9kZSwgTWFwPG51bWJlciwgUmVzb2x2ZWRTY29wZT4+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBwcm9jZXNzKCk6IHZvaWQge1xuICAgIHN1cGVyLnByb2Nlc3MoKTtcbiAgICB0aGlzLnJlc29sdmVTY29wZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTY29wZXMoKTogTWFwPHRzLk5vZGUsIE1hcDxudW1iZXIsIFJlc29sdmVkU2NvcGU+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRTY29wZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU2NvcGUobm9kZTogdHMuTm9kZSwgaW5kZXg6IG51bWJlciwgcGFyZW50PzogQ2FwdHVyaW5nU2NvcGUgfCB1bmRlZmluZWQpOiBDYXB0dXJpbmdTY29wZSB7XG4gICAgY29uc3Qgc2NvcGUgPSBuZXcgQ2FwdHVyaW5nU2NvcGUobm9kZSwgaW5kZXgsIHBhcmVudCk7XG4gICAgdGhpcy5tdXRhYmxlU2NvcGVzLnB1c2goc2NvcGUpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU2NvcGVzKCk6IHZvaWQge1xuICAgIHRoaXMubXV0YWJsZVNjb3Blcy5mb3JFYWNoKChzY29wZSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlU2NvcGUoc2NvcGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlU2NvcGUoc2NvcGU6IENhcHR1cmluZ1Njb3BlKTogUmVzb2x2ZWRTY29wZSB7XG4gICAgbGV0IGZvck5vZGUgPSB0aGlzLnJlc29sdmVkU2NvcGVzLmdldChzY29wZS5ub2RlKTtcbiAgICBpZiAoZm9yTm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3JOb2RlID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5yZXNvbHZlZFNjb3Blcy5zZXQoc2NvcGUubm9kZSwgZm9yTm9kZSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc29sdmVkID0gZm9yTm9kZS5nZXQoc2NvcGUuaW5kZXgpO1xuICAgIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBzY29wZS5wYXJlbnQ7XG4gICAgICByZXNvbHZlZCA9IHBhcmVudCA9PT0gdW5kZWZpbmVkID8gc2NvcGUucmVzb2x2ZSgpIDogc2NvcGUucmVzb2x2ZSh0aGlzLnJlc29sdmVTY29wZShwYXJlbnQpKTtcblxuICAgICAgZm9yTm9kZS5zZXQoc2NvcGUuaW5kZXgsIHJlc29sdmVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cbn1cbiJdfQ==