123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- // Generated by CoffeeScript 1.12.6
- (function() {
- var Scope,
- indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
- exports.Scope = Scope = (function() {
- function Scope(parent, expressions, method, referencedVars) {
- var ref, ref1;
- this.parent = parent;
- this.expressions = expressions;
- this.method = method;
- this.referencedVars = referencedVars;
- this.variables = [
- {
- name: 'arguments',
- type: 'arguments'
- }
- ];
- this.positions = {};
- if (!this.parent) {
- this.utilities = {};
- }
- this.root = (ref = (ref1 = this.parent) != null ? ref1.root : void 0) != null ? ref : this;
- }
- Scope.prototype.add = function(name, type, immediate) {
- if (this.shared && !immediate) {
- return this.parent.add(name, type, immediate);
- }
- if (Object.prototype.hasOwnProperty.call(this.positions, name)) {
- return this.variables[this.positions[name]].type = type;
- } else {
- return this.positions[name] = this.variables.push({
- name: name,
- type: type
- }) - 1;
- }
- };
- Scope.prototype.namedMethod = function() {
- var ref;
- if (((ref = this.method) != null ? ref.name : void 0) || !this.parent) {
- return this.method;
- }
- return this.parent.namedMethod();
- };
- Scope.prototype.find = function(name, type) {
- if (type == null) {
- type = 'var';
- }
- if (this.check(name)) {
- return true;
- }
- this.add(name, type);
- return false;
- };
- Scope.prototype.parameter = function(name) {
- if (this.shared && this.parent.check(name, true)) {
- return;
- }
- return this.add(name, 'param');
- };
- Scope.prototype.check = function(name) {
- var ref;
- return !!(this.type(name) || ((ref = this.parent) != null ? ref.check(name) : void 0));
- };
- Scope.prototype.temporary = function(name, index, single) {
- var diff, endCode, letter, newCode, num, startCode;
- if (single == null) {
- single = false;
- }
- if (single) {
- startCode = name.charCodeAt(0);
- endCode = 'z'.charCodeAt(0);
- diff = endCode - startCode;
- newCode = startCode + index % (diff + 1);
- letter = String.fromCharCode(newCode);
- num = Math.floor(index / (diff + 1));
- return "" + letter + (num || '');
- } else {
- return "" + name + (index || '');
- }
- };
- Scope.prototype.type = function(name) {
- var i, len, ref, v;
- ref = this.variables;
- for (i = 0, len = ref.length; i < len; i++) {
- v = ref[i];
- if (v.name === name) {
- return v.type;
- }
- }
- return null;
- };
- Scope.prototype.freeVariable = function(name, options) {
- var index, ref, temp;
- if (options == null) {
- options = {};
- }
- index = 0;
- while (true) {
- temp = this.temporary(name, index, options.single);
- if (!(this.check(temp) || indexOf.call(this.root.referencedVars, temp) >= 0)) {
- break;
- }
- index++;
- }
- if ((ref = options.reserve) != null ? ref : true) {
- this.add(temp, 'var', true);
- }
- return temp;
- };
- Scope.prototype.assign = function(name, value) {
- this.add(name, {
- value: value,
- assigned: true
- }, true);
- return this.hasAssignments = true;
- };
- Scope.prototype.hasDeclarations = function() {
- return !!this.declaredVariables().length;
- };
- Scope.prototype.declaredVariables = function() {
- var v;
- return ((function() {
- var i, len, ref, results;
- ref = this.variables;
- results = [];
- for (i = 0, len = ref.length; i < len; i++) {
- v = ref[i];
- if (v.type === 'var') {
- results.push(v.name);
- }
- }
- return results;
- }).call(this)).sort();
- };
- Scope.prototype.assignedVariables = function() {
- var i, len, ref, results, v;
- ref = this.variables;
- results = [];
- for (i = 0, len = ref.length; i < len; i++) {
- v = ref[i];
- if (v.type.assigned) {
- results.push(v.name + " = " + v.type.value);
- }
- }
- return results;
- };
- return Scope;
- })();
- }).call(this);
|