text: /*istanbul ignore next*/"use strict";
  
  exports.__esModule = true;
  
  var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
  
  var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
  
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  
  /**
   * This class is responsible for a binding inside of a scope.
   *
   * It tracks the following:
   *
   *  * Node path.
   *  * Amount of times referenced by other nodes.
   *  * Paths to nodes that reassign or modify this binding.
   *  * The kind of binding. (Is it a parameter, declaration etc)
   */
  
  var Binding = function () {
    function /*istanbul ignore next*/Binding(_ref) {
      /*istanbul ignore next*/var existing = _ref.existing;
      /*istanbul ignore next*/var identifier = _ref.identifier;
      /*istanbul ignore next*/var scope = _ref.scope;
      /*istanbul ignore next*/var path = _ref.path;
      /*istanbul ignore next*/var kind = _ref.kind;
      /*istanbul ignore next*/(0, _classCallCheck3.default)(this, Binding);
  
      this.identifier = identifier;
      this.scope = scope;
      this.path = path;
      this.kind = kind;
  
      this.constantViolations = [];
      this.constant = true;
  
      this.referencePaths = [];
      this.referenced = false;
      this.references = 0;
  
      this.clearValue();
  
      if (existing) {
        this.constantViolations = [].concat(existing.path, existing.constantViolations, this.constantViolations);
      }
    }
  
    Binding.prototype.deoptValue = function deoptValue() {
      this.clearValue();
      this.hasDeoptedValue = true;
    };
  
    Binding.prototype.setValue = function setValue(value) {
      if (this.hasDeoptedValue) return;
      this.hasValue = true;
      this.value = value;
    };
  
    Binding.prototype.clearValue = function clearValue() {
      this.hasDeoptedValue = false;
      this.hasValue = false;
      this.value = null;
    };
  
    /**
     * Register a constant violation with the provided `path`.
     */
  
    Binding.prototype.reassign = function reassign(path) {
      this.constant = false;
      if (this.constantViolations.indexOf(path) !== -1) {
        return;
      }
      this.constantViolations.push(path);
    };
  
    /**
     * Increment the amount of references to this binding.
     */
  
    Binding.prototype.reference = function reference(path) {
      this.referenced = true;
      this.references++;
      this.referencePaths.push(path);
    };
  
    /**
     * Decrement the amount of references to this binding.
     */
  
    Binding.prototype.dereference = function dereference() {
      this.references--;
      this.referenced = !!this.references;
    };
  
    return Binding;
  }();
  
  /*istanbul ignore next*/exports.default = Binding;
  /*istanbul ignore next*/module.exports = exports["default"];