You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					91 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					91 lines
				
				1.9 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = void 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Binding {
							 | 
						||
| 
								 | 
							
								  constructor({
							 | 
						||
| 
								 | 
							
								    identifier,
							 | 
						||
| 
								 | 
							
								    scope,
							 | 
						||
| 
								 | 
							
								    path,
							 | 
						||
| 
								 | 
							
								    kind
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    this.identifier = void 0;
							 | 
						||
| 
								 | 
							
								    this.scope = void 0;
							 | 
						||
| 
								 | 
							
								    this.path = void 0;
							 | 
						||
| 
								 | 
							
								    this.kind = void 0;
							 | 
						||
| 
								 | 
							
								    this.constantViolations = [];
							 | 
						||
| 
								 | 
							
								    this.constant = true;
							 | 
						||
| 
								 | 
							
								    this.referencePaths = [];
							 | 
						||
| 
								 | 
							
								    this.referenced = false;
							 | 
						||
| 
								 | 
							
								    this.references = 0;
							 | 
						||
| 
								 | 
							
								    this.identifier = identifier;
							 | 
						||
| 
								 | 
							
								    this.scope = scope;
							 | 
						||
| 
								 | 
							
								    this.path = path;
							 | 
						||
| 
								 | 
							
								    this.kind = kind;
							 | 
						||
| 
								 | 
							
								    if ((kind === "var" || kind === "hoisted") &&
							 | 
						||
| 
								 | 
							
								    isDeclaredInLoop(path || (() => {
							 | 
						||
| 
								 | 
							
								      throw new Error("Internal Babel error: unreachable ");
							 | 
						||
| 
								 | 
							
								    })())) {
							 | 
						||
| 
								 | 
							
								      this.reassign(path);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.clearValue();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  deoptValue() {
							 | 
						||
| 
								 | 
							
								    this.clearValue();
							 | 
						||
| 
								 | 
							
								    this.hasDeoptedValue = true;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  setValue(value) {
							 | 
						||
| 
								 | 
							
								    if (this.hasDeoptedValue) return;
							 | 
						||
| 
								 | 
							
								    this.hasValue = true;
							 | 
						||
| 
								 | 
							
								    this.value = value;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  clearValue() {
							 | 
						||
| 
								 | 
							
								    this.hasDeoptedValue = false;
							 | 
						||
| 
								 | 
							
								    this.hasValue = false;
							 | 
						||
| 
								 | 
							
								    this.value = null;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  reassign(path) {
							 | 
						||
| 
								 | 
							
								    this.constant = false;
							 | 
						||
| 
								 | 
							
								    if (this.constantViolations.indexOf(path) !== -1) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.constantViolations.push(path);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  reference(path) {
							 | 
						||
| 
								 | 
							
								    if (this.referencePaths.indexOf(path) !== -1) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.referenced = true;
							 | 
						||
| 
								 | 
							
								    this.references++;
							 | 
						||
| 
								 | 
							
								    this.referencePaths.push(path);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  dereference() {
							 | 
						||
| 
								 | 
							
								    this.references--;
							 | 
						||
| 
								 | 
							
								    this.referenced = !!this.references;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.default = Binding;
							 | 
						||
| 
								 | 
							
								function isDeclaredInLoop(path) {
							 | 
						||
| 
								 | 
							
								  for (let {
							 | 
						||
| 
								 | 
							
								    parentPath,
							 | 
						||
| 
								 | 
							
								    key
							 | 
						||
| 
								 | 
							
								  } = path; parentPath; ({
							 | 
						||
| 
								 | 
							
								    parentPath,
							 | 
						||
| 
								 | 
							
								    key
							 | 
						||
| 
								 | 
							
								  } = parentPath)) {
							 | 
						||
| 
								 | 
							
								    if (parentPath.isFunctionParent()) return false;
							 | 
						||
| 
								 | 
							
								    if (parentPath.isWhile() || parentPath.isForXStatement() || parentPath.isForStatement() && key === "body") {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return false;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=binding.js.map
							 |