| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 'use strict';module.exports = class SymbolTreeNode {        constructor() {                this.parent = null;                this.previousSibling = null;                this.nextSibling = null;                this.firstChild = null;                this.lastChild = null;                /** This value is incremented anytime a children is added or removed */                this.childrenVersion = 0;                /** The last child object which has a cached index */                this.childIndexCachedUpTo = null;                /** This value represents the cached node index, as long as                 * cachedIndexVersion matches with the childrenVersion of the parent */                this.cachedIndex = -1;                this.cachedIndexVersion = NaN; // NaN is never equal to anything        }        get isAttached() {                return Boolean(this.parent || this.previousSibling || this.nextSibling);        }        get hasChildren() {                return Boolean(this.firstChild);        }        childrenChanged() {                /* jshint -W016 */                // integer wrap around                this.childrenVersion = (this.childrenVersion + 1) & 0xFFFFFFFF;                this.childIndexCachedUpTo = null;        }        getCachedIndex(parentNode) {                // (assumes parentNode is actually the parent)                if (this.cachedIndexVersion !== parentNode.childrenVersion) {                        this.cachedIndexVersion = NaN;                        // cachedIndex is no longer valid                        return -1;                }                return this.cachedIndex; // -1 if not cached        }        setCachedIndex(parentNode, index) {                // (assumes parentNode is actually the parent)                this.cachedIndexVersion = parentNode.childrenVersion;                this.cachedIndex = index;        }};
 |