2016-05-19 08:17:29 +00:00
|
|
|
// 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;
|
2016-08-10 14:45:56 +00:00
|
|
|
this.nodePositionMap = [];
|
|
|
|
this.sortedPositionList = [];
|
|
|
|
this.positionNodeMap = [];
|
2016-05-19 08:17:29 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
SelectionBroker.prototype.addSelectionHandler = function(handler) {
|
|
|
|
this.brokers.push(handler);
|
|
|
|
}
|
|
|
|
|
2016-08-10 14:45:56 +00:00
|
|
|
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;
|
2016-05-19 08:17:29 +00:00
|
|
|
try {
|
2016-08-10 14:45:56 +00:00
|
|
|
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);
|
2016-05-19 08:17:29 +00:00
|
|
|
for (var b of this.brokers) {
|
|
|
|
if (b != from) {
|
2016-08-10 14:45:56 +00:00
|
|
|
b.brokeredSelect(locations, selected);
|
2016-05-19 08:17:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
finally {
|
2016-08-10 14:45:56 +00:00
|
|
|
broker.dispatching = false;
|
2016-05-19 08:17:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|