| // Copyright 2015 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| var SelectionBroker = function() { |
| this.brokers = []; |
| this.dispatching = false; |
| this.lastDispatchingHandler = null; |
| this.nodePositionMap = []; |
| this.sortedPositionList = []; |
| this.positionNodeMap = []; |
| }; |
| |
| SelectionBroker.prototype.addSelectionHandler = function(handler) { |
| this.brokers.push(handler); |
| } |
| |
| SelectionBroker.prototype.setNodePositionMap = function(map) { |
| let broker = this; |
| if (!map) return; |
| broker.nodePositionMap = map; |
| broker.positionNodeMap = []; |
| broker.sortedPositionList = []; |
| let next = 0; |
| for (let i in broker.nodePositionMap) { |
| broker.sortedPositionList[next] = Number(broker.nodePositionMap[i]); |
| broker.positionNodeMap[next++] = i; |
| } |
| broker.sortedPositionList = sortUnique(broker.sortedPositionList, |
| function(a,b) { return a - b; }); |
| this.positionNodeMap.sort(function(a,b) { |
| let result = broker.nodePositionMap[a] - broker.nodePositionMap[b]; |
| if (result != 0) return result; |
| return a - b; |
| }); |
| } |
| |
| SelectionBroker.prototype.select = function(from, locations, selected) { |
| let broker = this; |
| if (!broker.dispatching) { |
| broker.lastDispatchingHandler = from; |
| try { |
| broker.dispatching = true; |
| let enrichLocations = function(locations) { |
| result = []; |
| for (let location of locations) { |
| let newLocation = {}; |
| if (location.pos_start != undefined) { |
| newLocation.pos_start = location.pos_start; |
| } |
| if (location.pos_end != undefined) { |
| newLocation.pos_end = location.pos_end; |
| } |
| if (location.node_id != undefined) { |
| newLocation.node_id = location.node_id; |
| } |
| if (location.block_id != undefined) { |
| newLocation.block_id = location.block_id; |
| } |
| if (newLocation.pos_start == undefined && |
| newLocation.pos_end == undefined && |
| newLocation.node_id != undefined) { |
| if (broker.nodePositionMap && broker.nodePositionMap[location.node_id]) { |
| newLocation.pos_start = broker.nodePositionMap[location.node_id]; |
| newLocation.pos_end = location.pos_start + 1; |
| } |
| } |
| result.push(newLocation); |
| } |
| return result; |
| } |
| locations = enrichLocations(locations); |
| for (var b of this.brokers) { |
| if (b != from) { |
| b.brokeredSelect(locations, selected); |
| } |
| } |
| } |
| finally { |
| broker.dispatching = false; |
| } |
| } |
| } |
| |
| SelectionBroker.prototype.clear = function(from) { |
| this.lastDispatchingHandler = null; |
| if (!this.dispatching) { |
| try { |
| this.dispatching = true; |
| this.brokers.forEach(function(b) { |
| if (b != from) { |
| b.brokeredClear(); |
| } |
| }); |
| } finally { |
| this.dispatching = false; |
| } |
| } |
| } |